package Ġme . gent ie lez aj . sql d roid Ċ Ċ import Ġandroid . content . Content Values Ċ import Ġandroid . database . sqlite . SQLite Database Ċ import Ġme . gent ie lez aj . sql d roid . common . Date Patterns Ċ import Ġme . gent ie lez aj . sql d roid . exceptions . Un sup orted ColumnType Exception Ċ import Ġme . gent ie lez aj . sql d roid . models . ColumnType Ċ import Ġme . gent ie lez aj . sql d roid . models . Table Info Ċ import Ġme . gent ie lez aj . sql d roid . query .* Ċ import Ġjava . text . SimpleDateFormat Ċ import Ġjava . util .* Ċ import Ġkotlin . reflect . K Class Ċ import Ġkotlin . reflect . full . create Instance Ċ import Ġkotlin . reflect . jvm . java Field Ċ Ċ class ĠDatabase Ġinternal Ġconstructor ( val Ġdb : ĠSQLite Database ) Ġ{ ĊĠĠĠ Ġfun Ġclose () Ġ= Ġdb . close () ĊĊĠĠĠ Ġ// region Ġsave ĊĠĠĠ Ġfun Ġ< T Ġ: ĠAny > Ġsave ( model : ĠT , Ġforeign De pended : ĠBoolean Ġ= Ġtrue ): ĠAny Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtable Ġ= ĠTable Info . create ( model . java Class . kotlin ) ĊĠĠĠĠĠĠĠ Ġval Ġprimary KeyValue Ġ= Ġtable . primaryKey . get ( model ); ĊĠĠĠĠĠĠĠ Ġreturn Ġif ( primary KeyValue Ġ== Ġnull Ġ|| Ġ( primary KeyValue Ġis ĠLong Ġ&& Ġprimary KeyValue Ġ== Ġ 0 L ) Ġ|| Ġ( primary KeyValue Ġis ĠInt Ġ&& Ġprimary KeyValue Ġ== Ġ 0 )) Ġinsert ( model , Ġforeign De pended ) ĊĠĠĠĠĠĠĠ Ġelse Ġupdate ( model , Ġforeign De pended ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< T Ġ: ĠAny > Ġinsert ( entity : ĠT , Ġforeign De pended : ĠBoolean Ġ= Ġtrue ): ĠAny Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġtable Ġ= ĠTable Info . create ( entity . java Class . kotlin ) ĊĠĠĠĠĠĠĠ Ġvar Ġmodel Ġ= Ġentity ĊĠĠĠĠĠĠĠ Ġif Ġ( foreign De pended ) Ġmodel Ġ= Ġsave Foreign ( model ) ĊĠĠĠĠĠĠĠ Ġval Ġres Ġ= Ġdb . insert OrThrow ( table . name , Ġnull , ĠgetContent Values ( model , Ġtable )) ĊĠĠĠĠĠĠĠ Ġif ( table . primaryKey . is Auto Increment ) table . primaryKey . setValue ( model , Ġres . toInt ()) ĊĠĠĠĠĠĠĠ Ġif Ġ( foreign De pended ) Ġsave Foreign List ( model ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtable . primaryKey . property . get ( model ) !! ; ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< T Ġ: ĠAny > Ġupdate ( entity : ĠT , Ġforeign De pended : ĠBoolean Ġ= Ġtrue ): ĠAny Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġtable Ġ= ĠTable Info . create ( entity . java Class . kotlin ) ĊĠĠĠĠĠĠĠ Ġvar Ġmodel Ġ= Ġentity ĊĠĠĠĠĠĠĠ Ġif Ġ( foreign De pended ) Ġmodel Ġ= Ġsave Foreign ( model ) ĊĠĠĠĠĠĠĠ Ġval Ġprimary KeyValue Ġ= Ġtable . primaryKey . get ( entity ) !! ĊĠĠĠĠĠĠĠ Ġdb . update ( table . name , ĠgetContent Values ( model , Ġtable ), Ġ" id Ġ= Ġ${ primary KeyValue }", Ġnull ) ĊĠĠĠĠĠĠĠ Ġif Ġ( foreign De pended ) Ġsave Foreign List ( model ) ĊĠĠĠĠĠĠĠ Ġreturn Ġprimary KeyValue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġ< T : ĠAny > Ġsave Foreign ( model : ĠT ): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġtable Ġ= ĠTable Info . create ( model . java Class . kotlin ) ĊĠĠĠĠĠĠĠ Ġvar Ġforeign Tables Ġ= Ġtable . foreign Keys . filter Ġ{ Ġit . foreign Key !!. table Po perty Ġ!= Ġnull Ġ} ĊĠĠĠĠĠĠĠ Ġforeign Tables . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproperty Value Ġ= Ġit . foreign Key !!. table Po perty !!. get ( model ); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( property Value Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . property . set ( model , Ġsave ( property Value )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġmodel ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġfun Ġsave Foreign List ( model : ĠAny ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġtable Ġ= ĠTable Info . create ( model . java Class . kotlin ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( f Ġin Ġtable . foreign List Ġ?: ĠlistOf ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproperty Value Ġ= Ġf . property . get ( model ) Ġas ĠIterable < out ĠAny >? Ġ?: Ġreturn ; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor ( item Ġin Ġproperty Value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġtable . primaryKey . property . get ( model ); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf . foreign Property . java Field !!. set ( item , Ġid ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsave ( item ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġ// Ġend region ĊĊĠĠĠ Ġ// Ġregion Ġquery ĊĠĠĠ Ġinline Ġfun Ġ< re ified ĠT : Any > Ġget Query ( builder : ĠI QueryBuilder < T >? Ġ= Ġnull ) Ġ: ĠI Query < T , ĠT > Ġ= Ġget Query ( T :: class , Ġbuilder ) ĊĊĠĠĠ Ġfun Ġ< T : Any > Ġget Query ( clazz : ĠK Class < T >, Ġbuilder : ĠI QueryBuilder < T >? Ġ= Ġnull ) Ġ: ĠI Query < T , ĠT > Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( builder Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġtable Info Ġ= ĠTable Info . create ( clazz ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠQuery Executer Entity ( db , Ġtable Info ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġq Ġ= Ġbuilder Ġas ĠBase QueryBuilder < T > ĊĠĠĠĠĠĠĠ Ġreturn ĠQuery Executer Entity ( db , Ġq . from , Ġq . where , Ġq . join s , Ġq . orders , Ġq . alias ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< T : ĠAny > Ġget ( clazz : ĠK Class < T >, Ġid : ĠAny ?) Ġ: ĠT ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( id Ġ== Ġnull ) Ġreturn Ġnull ; ĊĠĠĠĠĠĠĠ Ġvar Ġtable Ġ= ĠTable Info . create ( clazz ) ĊĠĠĠĠĠĠĠ Ġreturn Ġget Query ( clazz ). single OrNull ( Restriction ( table , Ġtable . primaryKey , Ġ"=", Ġid )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinline Ġfun Ġ< re ified ĠT : ĠAny > Ġget ( id : ĠAny ?) Ġ: ĠT ? Ġ= Ġget ( T :: class , Ġid ) ĊĠĠĠ Ġ// Ġend region ĊĊĠĠĠ Ġ// Ġregion Ġdelete ĊĊĠĠĠ Ġfun Ġdelete ( clazz : ĠK Class <* >, Ġid : ĠAny ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġtable Ġ= ĠTable Info . create ( clazz ) ĊĠĠĠĠĠĠĠ Ġdelete ( table , Ġid ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< T : ĠAny > Ġdelete ( item : ĠT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġtable Info Ġ= ĠTable Info . create ( item . java Class . kotlin ) ĊĠĠĠĠĠĠĠ Ġvar Ġid Ġ= Ġtable Info . primaryKey . property . get ( item ) ĊĠĠĠĠĠĠĠ Ġdelete ( table Info , Ġid ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< T : ĠAny > Ġdelete ( clazz : ĠK Class < T >, Ġquery : ĠI Criteria < T >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġget Query ( clazz ). toList ( query ) ĊĠĠĠĠĠĠĠ Ġfor ( item Ġin Ġlist ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelete ( item ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdelete ( table : ĠTable Info , Ġid : ĠAny ?) Ġ= ĊĠĠĠĠĠĠĠ Ġdb . delete ( table . name , Ġ"${ table . primaryKey . name } Ġ= Ġ$ id ", Ġnull ) ĊĊĠĠĠ Ġ// Ġend region ĊĊĠĠĠ Ġ// Ġregion Ġhelpers ĊĠĠĠ Ġprivate Ġfun ĠgetContent Values ( model : ĠAny , Ġtable : ĠTable Info ): ĠContent Values Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġvalues Ġ= ĠContent Values () ĊĠĠĠĠĠĠĠ Ġfor Ġ( column Ġin Ġtable . columns ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( column . is Auto Increment ) Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġproperty Value Ġ= Ġcolumn . property . get ( model ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( column . converter Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproperty Value Ġ= Ġcolumn . converter . create Instance (). write ( property Value ); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( property Value Ġ== Ġnull ) Ġvalues . put Null ( column . name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( column . type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠColumn Type . INT Ġ-> Ġvalues . put ( column . name , Ġproperty Value Ġas ĠInt ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠColumn Type . BIG INT Ġ-> Ġvalues . put ( column . name , Ġproperty Value Ġas ĠLong ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠColumn Type . TEXT , ĠColumn Type . N VARCHAR Ġ-> Ġvalues . put ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolumn . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproperty Value Ġas ĠString ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠColumn Type . REAL Ġ-> Ġvalues . put ( column . name , Ġproperty Value Ġas ĠFloat ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠColumn Type . BOOLEAN Ġ-> Ġvalues . put ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolumn . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( property Value Ġas ĠBoolean ) Ġ 1 Ġelse Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠColumn Type . TIME Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġformat Ġ= ĠSimpleDateFormat ( Date Patterns . time ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( property Value Ġis ĠDate ) Ġvalues . put ( column . name , Ġformat . format ( property Value )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠColumn Type . DATETIME Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġformat Ġ= ĠSimpleDateFormat ( Date Patterns . dateTime ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( property Value Ġis ĠDate ) Ġvalues . put ( column . name , Ġformat . format ( property Value )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠColumn Type . DATE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġformat Ġ= ĠSimpleDateFormat ( Date Patterns . date ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( property Value Ġis ĠDate ) Ġvalues . put ( column . name , Ġformat . format ( property Value )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠUn sup orted ColumnType Exception () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġvalues ; ĊĠĠĠ Ġ} Ċ // Ġend region Ċ } Ċ Ċ // Ġend region