/* Ċ Ġ* ĠCopyright Ġ 2 0 2 1 ĠThe ĠAndroid ĠOpen ĠSource ĠProject Ċ Ġ* Ċ Ġ* Ġ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 Ġandroidx . room . writer Ċ Ċ import Ġandroidx . annotation . NonNull Ċ import Ġandroidx . room . compiler . processing . X Element Ċ import Ġandroidx . room . compiler . processing . add Origin ating Element Ċ import Ġandroidx . room . ext . L Ċ import Ġandroidx . room . ext . Room Type Names Ċ import Ġandroidx . room . ext . S Ċ import Ġandroidx . room . ext . Support DbType Names Ċ import Ġandroidx . room . ext . T Ċ import Ġandroidx . room . migration . bundle . Entity Bundle Ċ import Ġandroidx . room . migration . bundle . F ts Entity Bundle Ċ import Ġandroidx . room . vo . Auto Migration Ċ import Ġcom . squareup . jav ap o et . Field Spec Ċ import Ġcom . squareup . jav ap o et . Method Spec Ċ import Ġcom . squareup . jav ap o et . Parameter Spec Ċ import Ġcom . squareup . jav ap o et . TypeName Ċ import Ġcom . squareup . jav ap o et . Type Spec Ċ import Ġjavax . lang . model . element . Modifier Ċ Ċ /** Ċ Ġ* ĠWrites Ġthe Ġimplementation Ġof Ġmigrations Ġthat Ġwere Ġannotated Ġwith Ġ@ Auto Migration . Ċ Ġ*/ Ċ class ĠAuto Migration Writer ( ĊĠĠĠ Ġprivate Ġval Ġdb Element : ĠXElement , ĊĠĠĠ Ġval Ġauto Migration : ĠAuto Migration Ċ ) Ġ: ĠClass Writer ( auto Migration . impl TypeName ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġadded Columns Ġ= Ġauto Migration . schema Diff . added Columns ĊĠĠĠ Ġprivate Ġval Ġadded Tables Ġ= Ġauto Migration . schema Diff . added Tables ĊĠĠĠ Ġprivate Ġval Ġrenamed Tables Ġ= Ġauto Migration . schema Diff . re named Tables ĊĠĠĠ Ġprivate Ġval Ġcomplex Changed Tables Ġ= Ġauto Migration . schema Diff . complex Changed Tables ĊĠĠĠ Ġprivate Ġval Ġdeleted Tables Ġ= Ġauto Migration . schema Diff . deleted Tables ĊĊĠĠĠ Ġoverride Ġfun Ġcreate Type Spec Builder (): ĠType Spec . Builder Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠType Spec . class Builder ( auto Migration . impl TypeName ) ĊĠĠĠĠĠĠĠ Ġbuilder . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Origin ating Element ( db Element ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuperclass ( Room Type Names . M IG RATION ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( auto Migration . spec ClassName Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcallback Field Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠField Spec . builder ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRoom Type Names . AUTO _ M IG RATION _ SPEC , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" callback ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠModifier . PRIVATE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠModifier . FINAL ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! auto Migration . is Spec Provided ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinitializer (" new Ġ$ T ()", Ġauto Migration . spec ClassName ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . addField ( callback Field . build ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Method ( create Constructor ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Method ( create Migrate Method ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġbuilder ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠBuilds Ġthe Ġconstructor Ġof Ġthe Ġgenerated ĠAuto Migration . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠThe Ġconstructor Ġof Ġthe Ġgenerated ĠAuto Migration ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġcreate Constructor (): ĠMethod Spec Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠMethod Spec . constructor Builder (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Modifiers ( Modifier . PUBLIC ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Statement ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" super ($ L , Ġ$ L )", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġauto Migration . from , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġauto Migration . to ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( auto Migration . is Spec Provided ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Parameter ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠParameter Spec . builder ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRoom Type Names . AUTO _ M IG RATION _ SPEC , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" callback " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). add Annotation ( NonNull :: class . java ). build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Statement (" this . callback Ġ= Ġcallback ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Migrate Method (): ĠMethod Spec ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmigrate Function Builder : ĠMethod Spec . Builder Ġ= ĠMethod Spec . method Builder (" migrate ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Parameter ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠParameter Spec . builder ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSupport DbType Names . DB , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" database " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). add Annotation ( NonNull :: class . java ). build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Annotation ( Override :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Modifiers ( Modifier . PUBLIC ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturns ( TypeName . VOID ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Migration Statements ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( auto Migration . spec ClassName Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Statement (" callback . on Post Migrate ( database )") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġmigrate Function Builder . build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠTakes Ġthe Ġchanges Ġprovided Ġin Ġthe Ġ{@ link ĠAuto Migration Result } Ġwhich Ġare Ġdifferences Ġdetected ĊĠĠĠĠ Ġ* Ġbetween Ġthe Ġtwo Ġversions Ġof Ġthe Ġsame Ġdatabase , Ġand Ġconverts Ġthem Ġto Ġthe Ġappropriate ĊĠĠĠĠ Ġ* Ġsequence Ġof ĠSQL Ġstatements Ġthat Ġmigrate Ġthe Ġdatabase Ġfrom Ġone Ġversion Ġto Ġthe Ġother . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġmigrate Builder ĠBuilder Ġfor Ġthe Ġmigrate () Ġfunction Ġto Ġbe Ġgenerated ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġadd Migration Statements ( migrate Builder : ĠMethod Spec . Builder ) Ġ{ ĊĠĠĠĠĠĠĠ Ġadd Drop View Statements ( migrate Builder ) ĊĠĠĠĠĠĠĠ Ġadd Simple Change Statements ( migrate Builder ) ĊĠĠĠĠĠĠĠ Ġadd Complex Change Statements ( migrate Builder ) ĊĠĠĠĠĠĠĠ Ġadd Re create View Statements ( migrate Builder ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdds ĠSQL Ġstatements Ġto Ġdrop Ġall Ġviews Ġof Ġthe Ġdatabase Ġin Ġthe Ġ' from ' Ġversion . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġmigrate Builder ĠBuilder Ġfor Ġthe Ġmigrate () Ġfunction Ġto Ġbe Ġgenerated ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġadd Drop View Statements ( migrate Builder : ĠMethod Spec . Builder ) Ġ{ ĊĠĠĠĠĠĠĠ Ġauto Migration . schema Diff . from Views . forEach Ġ{ Ġview Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Database Execute Sql Statement ( migrate Builder , Ġ" DROP ĠVIEW Ġ${ view . view Name }") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdds ĠSQL Ġstatements Ġto Ġcreate Ġall Ġviews Ġof Ġthe Ġdatabase Ġin Ġthe Ġ' to ' Ġversion . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġmigrate Builder ĠBuilder Ġfor Ġthe Ġmigrate () Ġfunction Ġto Ġbe Ġgenerated ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġadd Re create View Statements ( migrate Builder : ĠMethod Spec . Builder ) Ġ{ ĊĠĠĠĠĠĠĠ Ġauto Migration . schema Diff . to Views . forEach Ġ{ Ġview Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Database Execute Sql Statement ( migrate Builder , Ġview . create View ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdds ĠSQL Ġstatements Ġperforming Ġschema Ġalter ing Ġcommands Ġthat Ġare Ġnot Ġdirectly Ġsupported Ġby ĊĠĠĠĠ Ġ* ĠSQLite Ġ( e . g . Ġforeign Ġkey Ġchanges ). ĠThese Ġchanges Ġare Ġreferred Ġto Ġas Ġ" complex " Ġchanges . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġmigrate Builder ĠBuilder Ġfor Ġthe Ġmigrate () Ġfunction Ġto Ġbe Ġgenerated ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġadd Complex Change Statements ( migrate Builder : ĠMethod Spec . Builder ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠCreate Ġa Ġcollection Ġthat Ġis Ġsorted Ġsuch Ġthat ĠF TS Ġbundles Ġare Ġhandled Ġafter Ġthe Ġnormal ĊĠĠĠĠĠĠĠ Ġ// Ġtables Ġhave Ġbeen Ġprocessed ĊĠĠĠĠĠĠĠ Ġcomplex Changed Tables . values . sorted By Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . new Version Entity Bundle Ġis ĠF ts Entity Bundle ĊĠĠĠĠĠĠĠ Ġ}. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtableName With New Prefix , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġold Entity Bundle , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Entity Bundle , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrenamed Columns Map ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( old Entity Bundle Ġis ĠF ts Entity Bundle Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! old Entity Bundle . fts Options . content Table . isNull Or Blank () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Statements To Migrate F ts Table ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmigrate Builder , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġold Entity Bundle , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Entity Bundle , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrenamed Columns Map ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Statements To Create New Table ( new Entity Bundle , Ġmigrate Builder ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Statements To Content Transfer ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġold Entity Bundle . tableName , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtableName With New Prefix , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġold Entity Bundle , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Entity Bundle , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrenamed Columns Map , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmigrate Builder ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Statements To Drop Table And Rename Temp Table ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġold Entity Bundle . tableName , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Entity Bundle . tableName , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtableName With New Prefix , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmigrate Builder ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Statements To Re create Indexes ( new Entity Bundle , Ġmigrate Builder ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( new Entity Bundle . foreign Keys . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Statements ToCheck ForeignKey Constraint ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Entity Bundle . tableName , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmigrate Builder ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadd Statements To Migrate F ts Table ( ĊĠĠĠĠĠĠĠ Ġmigrate Builder : ĠMethod Spec . Builder , ĊĠĠĠĠĠĠĠ Ġold Table : ĠEntity Bundle , ĊĠĠĠĠĠĠĠ Ġnew Table : ĠEntity Bundle , ĊĠĠĠĠĠĠĠ Ġrenamed Columns Map : ĠMutable Map < String , ĠString > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġadd Database Execute Sql Statement ( migrate Builder , Ġ" DROP ĠTABLE Ġ`${ old Table . tableName }` ") ĊĠĠĠĠĠĠĠ Ġadd Database Execute Sql Statement ( migrate Builder , Ġnew Table . createTable ()) ĊĊĠĠĠĠĠĠĠ Ġ// ĠTransfer Ġcontents Ġof Ġthe ĠF TS Ġtable , Ġusing Ġthe Ġcontent Ġtable Ġif Ġavailable . ĊĠĠĠĠĠĠĠ Ġval Ġnew Column Sequence Ġ= Ġold Table . fields By ColumnName . keys . filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġold Table . fields By ColumnName . keys . contains ( it ) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrenamed Columns Map . containsKey ( it ) ĊĠĠĠĠĠĠĠ Ġ}. to Mutable List () ĊĠĠĠĠĠĠĠ Ġval Ġold Column Sequence Ġ= Ġmutable ListOf < String >() ĊĠĠĠĠĠĠĠ Ġnew Column Sequence . forEach Ġ{ Ġcolumn Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġold Column Sequence . add ( re named Columns Map [ column ] Ġ?: Ġcolumn ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( old Table Ġis ĠF ts Entity Bundle ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġold Column Sequence . add (" row id ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Column Sequence . add (" doc id ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġcontent Table Ġ= Ġ( new Table Ġas ĠF ts Entity Bundle ). fts Options . content Table ĊĠĠĠĠĠĠĠ Ġval Ġselect From Table Ġ= Ġif Ġ( content Table . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġold Table . tableName ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Table ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġadd Database Execute Sql Statement ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmigrate Builder , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuild String Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" INSERT ĠINTO Ġ`${ new Table . tableName }` Ġ(${ new Column Sequence . join ToString (",") })" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ĠSELECT Ġ${ old Column Sequence . join ToString (", ")} ĠFROM Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"` $ select From Table `", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdds ĠSQL Ġstatements Ġperforming Ġschema Ġalter ing Ġcommands Ġdirectly Ġsupported Ġby ĠSQLite ĊĠĠĠĠ Ġ* Ġ( adding Ġtables / columns , Ġrenaming Ġtables / columns , Ġdropping Ġtables / columns ). ĠThese Ġchanges ĊĠĠĠĠ Ġ* Ġare Ġreferred Ġto Ġas Ġ" simple " Ġchanges . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġmigrate Builder ĠBuilder Ġfor Ġthe Ġmigrate () Ġfunction Ġto Ġbe Ġgenerated ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġadd Simple Change Statements ( migrate Builder : ĠMethod Spec . Builder ) Ġ{ ĊĠĠĠĠĠĠĠ Ġadd Delete Table Statements ( migrate Builder ) ĊĠĠĠĠĠĠĠ Ġadd Rename Table Statements ( migrate Builder ) ĊĠĠĠĠĠĠĠ Ġadd New Column Statements ( migrate Builder ) ĊĠĠĠĠĠĠĠ Ġadd New Table Statements ( migrate Builder ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdds Ġthe ĠSQL Ġstatements Ġfor Ġcreating Ġa Ġnew Ġtable Ġin Ġthe Ġdesired Ġrev ised Ġformat Ġof Ġtable . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġnew Table ĠSchema Ġof Ġthe Ġnew Ġtable Ġto Ġbe Ġcreated ĊĠĠĠĠ Ġ* Ġ@ param Ġmigrate Builder ĠBuilder Ġfor Ġthe Ġmigrate () Ġfunction Ġto Ġbe Ġgenerated ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġadd Statements To Create New Table ( ĊĠĠĠĠĠĠĠ Ġnew Table : ĠEntity Bundle , ĊĠĠĠĠĠĠĠ Ġmigrate Builder : ĠMethod Spec . Builder ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġadd Database Execute Sql Statement ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmigrate Builder , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Table . createNew Table () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdds Ġthe ĠSQL Ġstatements Ġfor Ġtrans f erring Ġthe Ġcontents Ġof Ġthe Ġold Ġtable Ġto Ġthe Ġnew Ġversion . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġold TableName ĠName Ġof Ġthe Ġtable Ġin Ġthe Ġold Ġversion Ġof Ġthe Ġdatabase ĊĠĠĠĠ Ġ* Ġ@ param ĠtableName With New Prefix ĠName Ġof Ġthe Ġtable Ġwith Ġthe Ġ'_ new _' Ġprefix Ġadded ĊĠĠĠĠ Ġ* Ġ@ param Ġold Entity Bundle ĠEntity Ġbundle Ġof Ġthe Ġtable Ġin Ġthe Ġold Ġversion Ġof Ġthe Ġdatabase ĊĠĠĠĠ Ġ* Ġ@ param Ġnew Entity Bundle ĠEntity Ġbundle Ġof Ġthe Ġtable Ġin Ġthe Ġnew Ġversion Ġof Ġthe Ġdatabase ĊĠĠĠĠ Ġ* Ġ@ param Ġrenamed Columns Map ĠMap Ġof Ġthe Ġrenamed Ġcolumns Ġof Ġthe Ġtable Ġ( new Ġname Ġ-> Ġold Ġname ) ĊĠĠĠĠ Ġ* Ġ@ param Ġmigrate Builder ĠBuilder Ġfor Ġthe Ġmigrate () Ġfunction Ġto Ġbe Ġgenerated ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġadd Statements To Content Transfer ( ĊĠĠĠĠĠĠĠ Ġold TableName : ĠString , ĊĠĠĠĠĠĠĠ ĠtableName With New Prefix : ĠString , ĊĠĠĠĠĠĠĠ Ġold Entity Bundle : ĠEntity Bundle , ĊĠĠĠĠĠĠĠ Ġnew Entity Bundle : ĠEntity Bundle , ĊĠĠĠĠĠĠĠ Ġrenamed Columns Map : ĠMutable Map < String , ĠString >, ĊĠĠĠĠĠĠĠ Ġmigrate Builder : ĠMethod Spec . Builder ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnew Column Sequence Ġ= Ġnew Entity Bundle . fields By ColumnName . keys . filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġold Entity Bundle . fields By ColumnName . keys . contains ( it ) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrenamed Columns Map . containsKey ( it ) ĊĠĠĠĠĠĠĠ Ġ}. to Mutable List () ĊĠĠĠĠĠĠĠ Ġval Ġold Column Sequence Ġ= Ġmutable ListOf < String >() ĊĠĠĠĠĠĠĠ Ġnew Column Sequence . forEach Ġ{ Ġcolumn Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġold Column Sequence . add ( re named Columns Map [ column ] Ġ?: Ġcolumn ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġadd Database Execute Sql Statement ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmigrate Builder , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuild String Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" INSERT ĠINTO Ġ`$ tableName With New Prefix ` Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" (${ new Column Sequence . join ToString (",") })" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ĠSELECT Ġ${ old Column Sequence . join ToString (", ")} ĠFROM Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"` $ old TableName `", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdds Ġthe ĠSQL Ġstatements Ġfor Ġdropping Ġthe Ġtable Ġat Ġthe Ġold Ġversion Ġand Ġrenaming Ġthe ĊĠĠĠĠ Ġ* Ġtemporary Ġtable Ġto Ġthe Ġname Ġof Ġthe Ġoriginal Ġtable . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġold TableName ĠName Ġof Ġthe Ġtable Ġin Ġthe Ġold Ġversion Ġof Ġthe Ġdatabase ĊĠĠĠĠ Ġ* Ġ@ param Ġnew TableName ĠName Ġof Ġthe Ġtable Ġin Ġthe Ġnew Ġversion Ġof Ġthe Ġdatabase ĊĠĠĠĠ Ġ* Ġ@ param ĠtableName With New Prefix ĠName Ġof Ġthe Ġtable Ġwith Ġthe Ġ'_ new _' Ġprefix Ġadded ĊĠĠĠĠ Ġ* Ġ@ param Ġmigrate Builder ĠBuilder Ġfor Ġthe Ġmigrate () Ġfunction Ġto Ġbe Ġgenerated ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġadd Statements To Drop Table And Rename Temp Table ( ĊĠĠĠĠĠĠĠ Ġold TableName : ĠString , ĊĠĠĠĠĠĠĠ Ġnew TableName : ĠString , ĊĠĠĠĠĠĠĠ ĠtableName With New Prefix : ĠString , ĊĠĠĠĠĠĠĠ Ġmigrate Builder : ĠMethod Spec . Builder ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġadd Database Execute Sql Statement ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmigrate Builder , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" DROP ĠTABLE Ġ`$ old TableName `" ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġadd Database Execute Sql Statement ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmigrate Builder , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" ALTER ĠTABLE Ġ`$ tableName With New Prefix ` ĠR ENAME ĠTO Ġ`$ new TableName `" ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdds Ġthe ĠSQL Ġstatements Ġfor Ġre creating Ġindexes . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġtable ĠThe Ġtable Ġthe Ġindexes Ġof Ġwhich Ġwill Ġbe Ġre created ĊĠĠĠĠ Ġ* Ġ@ param Ġmigrate Builder ĠBuilder Ġfor Ġthe Ġmigrate () Ġfunction Ġto Ġbe Ġgenerated ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġadd Statements To Re create Indexes ( ĊĠĠĠĠĠĠĠ Ġtable : ĠEntity Bundle , ĊĠĠĠĠĠĠĠ Ġmigrate Builder : ĠMethod Spec . Builder ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtable . indices . forEach Ġ{ Ġindex Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Database Execute Sql Statement ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmigrate Builder , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex . get Create Sql ( table . tableName ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdds Ġthe ĠSQL Ġstatement Ġfor Ġchecking Ġthe Ġforeign Ġkey Ġconstraints . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param ĠtableName ĠName Ġof Ġthe Ġtable ĊĠĠĠĠ Ġ* Ġ@ param Ġmigrate Builder ĠBuilder Ġfor Ġthe Ġmigrate () Ġfunction Ġto Ġbe Ġgenerated ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġadd Statements ToCheck ForeignKey Constraint ( ĊĠĠĠĠĠĠĠ ĠtableName : ĠString , ĊĠĠĠĠĠĠĠ Ġmigrate Builder : ĠMethod Spec . Builder ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġadd Database Execute Sql Statement ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmigrate Builder , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" PR AG MA Ġforeign _ key _ check (` $ tableName `) " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdds Ġthe ĠSQL Ġstatements Ġfor Ġremoving Ġa Ġtable . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġmigrate Builder ĠBuilder Ġfor Ġthe Ġmigrate () Ġfunction Ġto Ġbe Ġgenerated ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġadd Delete Table Statements ( migrate Builder : ĠMethod Spec . Builder ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdeleted Tables . forEach Ġ{ ĠtableName Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdelete Table Sql Ġ= Ġbuild String Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" DROP ĠTABLE Ġ`$ tableName `" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Database Execute Sql Statement ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmigrate Builder , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelete Table Sql ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdds Ġthe ĠSQL Ġstatements Ġfor Ġrenaming Ġa Ġtable . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġmigrate Builder ĠBuilder Ġfor Ġthe Ġmigrate () Ġfunction Ġto Ġbe Ġgenerated ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġadd Rename Table Statements ( migrate Builder : ĠMethod Spec . Builder ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrenamed Tables . forEach Ġ{ Ġ( old Name , ĠnewName ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrename Table Sql Ġ= Ġbuild String Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ALTER ĠTABLE Ġ`$ old Name ` ĠR ENAME ĠTO Ġ`$ new Name `" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Database Execute Sql Statement ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmigrate Builder , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrename Table Sql ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdds Ġthe ĠSQL Ġstatements Ġfor Ġadding Ġnew Ġcolumns Ġto Ġa Ġtable . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġmigrate Builder ĠBuilder Ġfor Ġthe Ġmigrate () Ġfunction Ġto Ġbe Ġgenerated ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġadd New Column Statements ( migrate Builder : ĠMethod Spec . Builder ) Ġ{ ĊĠĠĠĠĠĠĠ Ġadded Columns . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġadd New Column Sql Ġ= Ġbuild String Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ALTER ĠTABLE Ġ`${ it . value . tableName }` ĠADD ĠCOLUMN Ġ`${ it . key }` Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ it . value . field Bundle . affinity } Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . value . field Bundle . is NonNull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend (" NOT ĠNULL ĠDEFAULT Ġ${ it . value . field Bundle . defaultValue }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend (" DEFAULT ĠNULL ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Database Execute Sql Statement ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmigrate Builder , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd New Column Sql ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdds Ġthe ĠSQL Ġstatements Ġfor Ġadding Ġnew Ġtables Ġto Ġa Ġdatabase . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġmigrate Builder ĠBuilder Ġfor Ġthe Ġmigrate () Ġfunction Ġto Ġbe Ġgenerated ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġadd New Table Statements ( migrate Builder : ĠMethod Spec . Builder ) Ġ{ ĊĠĠĠĠĠĠĠ Ġadded Tables . forEach Ġ{ Ġadded Table Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Database Execute Sql Statement ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmigrate Builder , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadded Table . entity Bundle . createTable () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdds Ġthe Ġgiven ĠSQL Ġstatements Ġinto Ġthe Ġgenerated Ġmigrate () Ġfunction Ġto Ġbe Ġexecuted Ġby Ġthe ĊĠĠĠĠ Ġ* Ġdatabase . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġmigrate Builder ĠBuilder Ġfor Ġthe Ġmigrate () Ġfunction Ġto Ġbe Ġgenerated ĊĠĠĠĠ Ġ* Ġ@ param Ġsql ĠThe ĠSQL Ġstatement Ġto Ġbe Ġexecuted Ġby Ġthe Ġdatabase ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġadd Database Execute Sql Statement ( ĊĠĠĠĠĠĠĠ Ġmigrate Builder : ĠMethod Spec . Builder , ĊĠĠĠĠĠĠĠ Ġsql : ĠString ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmigrate Builder . add Statement ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" database . exec SQL ($ S )", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsql ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ