/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 8 ĠF on de sa Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġcom . fon de sa . m angan ow . database . impl . strategy Ċ Ċ import Ġcom . fon de sa . m angan ow . database . api . client . Database Ċ import Ġcom . fon de sa . m angan ow . database . api . client . statement . CreateTable Ċ import Ġcom . fon de sa . m angan ow . database . api . client . statement . Pr agma Ċ import Ġcom . fon de sa . m angan ow . database . api . client . statement . Vac uum Ċ import Ġcom . fon de sa . m angan ow . database . api . structure . Graph Ċ import Ġdagger . Re usable Ċ import Ġjavax . inject . Inject Ċ Ċ /** Ċ Ġ* ĠDefault Ġimplementation Ġof Ġ[ Upgrade Strategy ] Ġthat Ġwill Ġdelete Ġall Ċ Ġ* Ġtables , Ġforeign Ġkeys , Ġindexes Ġand Ġtriggers Ġon Ġversion Ġupgrade . Ċ Ġ* ĠTo Ġavoid Ġthe Ġcheck Ġon Ġthe Ġtables ' Ġrelationships , Ġthe Ġdelete Ġof Ġall Ġtables Ġis Ġdone Ċ Ġ* Ġthrough Ġthe Ġwriting Ġon Ġthe Ġ< i > sqlite _ master </ i > Ġtable . Ċ Ġ* ĠThe Ġwriting Ġon Ġthe Ġ< i > sqlite _ master </ i > Ġtable Ġis Ġdis cour aged Ġso , Ġin Ġproduction Ġmode , Ċ Ġ* Ġit 's Ġbetter Ġto Ġspecify Ġa Ġcustom Ġ[ Upgrade Strategy ]. Ċ Ġ*/ Ċ @ Re usable Ċ class ĠDrop All Upgrade Strategy Ġ@ Inject Ġconstructor () Ġ: ĊĠĠĠ ĠUpgrade Strategy Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġon Upgrade ( database : ĠDatabase , Ġold Version : ĠInt , Ġnew Version : ĠInt , Ġnew Graph : ĠGraph ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpragma Writable Schema Raw Ġ= Ġ" writable _ schema " ĊĊĠĠĠĠĠĠĠ Ġ// ĠEnable Ġthe Ġwriting Ġon Ġsqlite _ master . ĊĠĠĠĠĠĠĠ Ġval Ġenable Writable Schema Ġ= ĠP rag ma . write ( pragma Writable Schema Raw , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġdatabase . compile ( enable Writable Schema ). execute ( close Ġ= Ġtrue ) ĊĊĠĠĠĠĠĠĠ Ġval Ġdrop All Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcom . fon de sa . m angan ow . database . api . client . statement . Delete . from (" sqlite _ master ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. where (" type Ġin Ġ(' table ', Ġ' index ', Ġ' trigger ') ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġ// ĠDelete Ġall Ġtables , Ġforeign Ġkeys , Ġindexes Ġand Ġtriggers . ĊĠĠĠĠĠĠĠ Ġdatabase . compile ( drop All ). execute ( close Ġ= Ġtrue ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠDisable Ġthe Ġwriting Ġon Ġsqlite _ master . ĊĠĠĠĠĠĠĠ Ġval Ġdisable Writable Schema Ġ= ĠP rag ma . write ( pragma Writable Schema Raw , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġdatabase . compile ( disable Writable Schema ). execute ( close Ġ= Ġtrue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Post Upgrade ( ĊĠĠĠĠĠĠĠ Ġdatabase : ĠDatabase , ĊĠĠĠĠĠĠĠ Ġold Version : ĠInt , ĊĠĠĠĠĠĠĠ Ġnew Version : ĠInt , ĊĠĠĠĠĠĠĠ Ġnew Graph : ĠGraph ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠCheck Ġthe Ġintegrity Ġof Ġthe Ġdatabase Ġfile . ĊĠĠĠĠĠĠĠ Ġval Ġintegrity Check Ġ= Ġdatabase . compile ( Pr agma . readString (" integrity _ check ")). execute () ĊĠĠĠĠĠĠĠ Ġif Ġ( integrity Check Ġ!= Ġ" ok ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvac uum Ġ= ĠV ac uum . create () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAttempt Ġto Ġrebuild Ġthe Ġdatabase Ġfile . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdatabase . compile ( vac uum ). execute () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġdatabase . transaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCreates Ġtables Ġcontained Ġin Ġthe Ġgraph . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Graph . get Tables (). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdatabase . compile ( CreateTable . of ( it )). execute ( close Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }