package Ġtk . mall um o . k db . k sp Ċ Ċ object ĠK db Mode Ġ{ ĊĠĠĠ Ġconst Ġval ĠAND ROID Ġ= Ġ" ANDROID " ĊĠĠĠ Ġconst Ġval ĠJVM _ DE SK TOP Ġ= Ġ" JVM - DE SK TOP " Ċ } Ċ Ċ fun Ġgenerate Creator ( mode : ĠString ) Ġ= Ġbuild String Ġ{ ĊĠĠĠ Ġappend (" private Ġval Ġdatabases Ġ= Ġhash Map Of < String , K db >() \ n ") ĊĠĠĠ Ġwhen Ġ( mode ) Ġ{ ĊĠĠĠĠĠĠĠ ĠK db Mode . ANDROID Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" Ċ fun Ġcreate K DB ( context : android . content . Context , Ġname : String =" default - k db . sqlite ", isDebug : ĠBoolean Ġ= Ġtrue ): K db { ĊĠĠĠĠĠĠĠ Ġreturn Ġdatabases . get Or Put ( name ){ ĊĠĠĠĠĠĠĠĠĠĠ ĠK db . newInstance ( tk . mall um o . k db . sqlite . Sqlite DB ( isDebug , Ġcontext . get Database Path ( name ). absolute Path ), Ġis Debug , ĠK db Generated Def Structure . get Tables Def ()) ĊĠĠĠĠĠĠĠ Ġ} Ċ } ĠĠĠ Ċ """ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠK db Mode . JVM _ DE SK TOP Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" Ċ fun Ġcreate K DB ( name : String , Ġis Debug : ĠBoolean Ġ= Ġtrue , Ġconnection Callback : () Ġ-> Ġjava . sql . Connection ): K db { ĊĠĠĠĠĠĠĠ Ġreturn Ġdatabases . get Or Put ( name ){ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠK db . newInstance ( tk . mall um o . k db . sqlite . Sqlite DB ( isDebug , Ġtrue , Ġconnection Callback ), Ġis Debug , ĠK db Generated Def Structure . get Tables Def ()) ĊĠĠĠĠĠĠĠ Ġ} Ċ } ĠĠĠĠ Ċ """ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġgenerate Def Structure ( ĊĠĠĠ Ġmap : ĠList < Table Node > Ċ ) Ġ= Ġbuild String Ġ{ ĊĠĠĠ Ġappend (" object ĠK db Generated Def Structure {\ n ") ĊĊĠĠĠ Ġval Ġtables Ġ= ĊĠĠĠĠĠĠĠ Ġmap . join ToString ( separator Ġ= Ġ", \ n ", Ġprefix Ġ= Ġ" array ListOf (", Ġpostfix Ġ= Ġ") ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" getTable Def Item (${ it . qualified Name } ()) " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġappend ("\ n \ tf un Ġget Tables Def (): ĠArrayList < Impl K db Table Def > Ġ= Ġ$ tables \ n ") ĊĊĠĠĠ Ġmap . forEach Ġ{ Ġentry Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġcolumns Ġ= Ġentry . property . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"\ t \ t \ t \ t Impl K db Table Def . Item ( name Ġ= Ġ\" ${ it . propertyName . uppercase () }\ ", Ġtype Ġ= ĠImp l K db Table Def . ColumnType .${ it . sql Column TypeName }, ĠdefaultValue Ġ= Ġ${ it . defaultValue }, Ġunique Ġ= Ġ${ it . is Unique }, Ġindex Ġ= Ġ${ it . is Index })" ĊĠĠĠĠĠĠĠ Ġ}. join ToString (", \ n ", Ġprefix Ġ= Ġ" array ListOf (\ n ", Ġpostfix Ġ= Ġ") ") ĊĊĠĠĠĠĠĠĠ Ġappend ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠ Ġprivate Ġfun Ġget Table Def Item ( instance : Ġ${ entry . qualified Name }): ĠImp l K db Table Def Ġ= ĠImp l K db Table Def ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ entry . simple Name }", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ$ columns ĊĠĠĠ Ġ) Ċ """ ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġappend (" }") Ċ } Ċ Ċ fun Ġgenerate Index Functions ( ĊĠĠĠ Ġmap : ĠList < Table Node > Ċ ) Ġ= Ġbuild String Ġ{ ĊĠĠĠ Ġappend (" object ĠK db Generated Index {\ n ") ĊĊĠĠĠ Ġmap . forEach Ġ{ Ġentry Ġ-> ĊĊĠĠĠĠĠĠĠ Ġval Ġquery Columns Ġ= Ġentry . property ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. join ToString (", \ n ", Ġprefix Ġ= Ġ" int ArrayOf (\ n ", Ġpostfix Ġ= Ġ") ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"\ t \ t \ t columns . indexOf (\" ${ it . propertyName . uppercase () }\ ")" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġappend ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠ Ġfun Ġindex _${ entry . function Name }( cursor : ĠCursor ): ĠInt Array Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcolumns Ġ= Ġcursor . columns . map Ġ{ Ġit . uppercase () Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġ$ query Columns ĊĠĠĠ Ġ} Ċ """ ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġappend (" }") Ċ } Ċ Ċ fun Ġgenerate Fill Functions ( ĊĠĠĠ Ġmap : ĠList < Table Node > Ċ ) Ġ= Ġbuild String Ġ{ ĊĠĠĠ Ġappend (" object ĠK db Generated Fill {\ n ") ĊĊĠĠĠ Ġmap . forEach Ġ{ Ġentry Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġmapping Ġ= Ġentry . property . map Indexed Ġ{ Ġindex , Ġproperty Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( property . qualified Name ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" kotlin . String " Ġ-> Ġ"\ t \ t \ tif Ġ( index Array [$ index ] Ġ!= Ġ- 1 ) Ġcursor . string ( index Array [$ index ]) Ġ{ Ġ${ property . propertyName } Ġ= Ġit Ġ}" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" kotlin . Int " Ġ-> Ġ"\ t \ t \ tif Ġ( index Array [$ index ] Ġ!= Ġ- 1 ) Ġcursor . int ( index Array [$ index ]) Ġ{ Ġ${ property . propertyName } Ġ= Ġit Ġ}" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" kotlin . Long " Ġ-> Ġ"\ t \ t \ tif Ġ( index Array [$ index ] Ġ!= Ġ- 1 ) Ġcursor . long ( index Array [$ index ]) Ġ{ Ġ${ property . propertyName } Ġ= Ġit Ġ}" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" kotlin . Double " Ġ-> Ġ"\ t \ t \ tif Ġ( index Array [$ index ] Ġ!= Ġ- 1 ) Ġcursor . double ( index Array [$ index ]) Ġ{ Ġ${ property . propertyName } Ġ= Ġit Ġ}" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" kotlin . Float " Ġ-> Ġ"\ t \ t \ tif Ġ( index Array [$ index ] Ġ!= Ġ- 1 ) Ġcursor . double ( index Array [$ index ]) Ġ{ Ġ${ property . propertyName } Ġ= Ġit . toFloat () Ġ}" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. join ToString ("\ n ") ĊĊĠĠĠĠĠĠĠ Ġappend ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠ Ġfun Ġfill _${ entry . function Name }( item :${ entry . qualified Name }, Ġcursor : Ġtk . mall um o . k db . sqlite . Cursor , Ġindex Array : ĠInt Array ) Ġ{ ĊĠĠĠĠĠĠĠ Ġitem . apply Ġ{ Ċ $ mapping ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ """ ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġappend (" }") Ċ } ĊĊ Ċ fun Ġgenerate Cursor Functions ( ĊĠĠĠ Ġmap : ĠList < Table Node > Ċ ) Ġ= Ġbuild String Ġ{ ĊĠĠĠ Ġappend (" object ĠK db Generated Query {\ n ") ĊĠĠĠ Ġmap . forEach Ġ{ Ġentry Ġ-> ĊĠĠĠĠĠĠĠ Ġappend ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠ Ġfun Ġquery _${ entry . function Name }( cursor : Ġtk . mall um o . k db . sqlite . Cursor ): ĠArrayList < ${ entry . qualified Name }> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġout Ġ= Ġarray ListOf < ${ entry . qualified Name }> () ĊĠĠĠĠĠĠĠ Ġif Ġ( cursor . columns . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindex Array Ġ= ĠK db Generated Index . index _${ entry . function Name }( cursor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( cursor . next ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout . add (${ entry . qualified Name } (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠK db Generated Fill . fill _${ entry . function Name }( this , Ġcursor , Ġindex Array ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġout ĊĠĠĠ Ġ} Ċ """ ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġappend (" }") Ċ } Ċ Ċ fun Ġgenerate Insert Functions ( ĊĠĠĠ Ġmap : ĠList < Table Node > Ċ ) Ġ= Ġbuild String Ġ{ ĊĠĠĠ Ġappend (" object ĠK db Generated Insert {\ n ") ĊĊĠĠĠ Ġmap . forEach Ġ{ Ġentry Ġ-> ĊĊĠĠĠĠĠĠĠ Ġval Ġcom umn s Ġ= Ġentry . property . map Ġ{ Ġ"` ${ it . propertyName . uppercase () }` " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. join ToString (",", Ġprefix Ġ= Ġ" (", Ġpostfix Ġ= Ġ") ") ĊĊĠĠĠĠĠĠĠ Ġval Ġvalues Ġ= Ġentry . property . map Ġ{ Ġ" ?" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. join ToString (",", Ġprefix Ġ= Ġ" (", Ġpostfix Ġ= Ġ") ") ĊĊĠĠĠĠĠĠĠ Ġval Ġinsert Val Ġ= Ġentry . property . map Indexed Ġ{ Ġindex , Ġprop Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprop . qualified Name Ġ== Ġ" kotlin . Float " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"\ t \ t \ t \ t \ tit .${ prop . cursor TypeName } ($ index ) Ġ{ Ġitem .${ prop . propertyName }. toDouble () Ġ}" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProperty Type Holder . direct Types . none Ġ{ Ġit Ġ== Ġprop . qualified Name Ġ} Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"\ t \ t \ t \ t \ tit .${ prop . cursor TypeName } ($ index ) Ġ{ Ġitem .${ prop . propertyName }. toString () Ġ}" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"\ t \ t \ t \ t \ tit .${ prop . cursor TypeName } ($ index ) Ġ{ Ġitem .${ prop . propertyName } Ġ}" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. join ToString ("\ n ", Ġprefix Ġ= Ġ"\ n ", Ġpostfix Ġ= Ġ"\ n ") ĊĊĠĠĠĠĠĠĠ Ġval Ġinsert Ġ= Ġ""" " INSERT ĠINTO Ġ${ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġentry . simple Name ĊĠĠĠĠĠĠĠ Ġ} Ġ$ com umn s ĠVALUES Ġ$ values """" ĊĠĠĠĠĠĠĠ Ġappend ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠ Ġfun Ġinsert _${ entry . function Name }( items : ĠArray < ${ entry . qualified Name } >, Ġdb : ĠSql ite DB ){ ĊĠĠĠĠĠĠĠ Ġif Ġ( items . isEmpty ()) Ġreturn ĊĠĠĠĠĊĠĠĠĠĠĠĠ Ġdb . insert (${ insert }) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġitems . forEach Ġ{ Ġitem Ġ-> Ċ $ insert Val ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . add () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . commit () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ """ ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġappend (" }") Ċ } Ċ Ċ fun Ġgenerate Ext Cursor Functions ( ĊĠĠĠ Ġmap : ĠList < Table Node > Ċ ) Ġ= Ġbuild String Ġ{ ĊĠĠĠ Ġmap . forEach Ġ{ Ġentry Ġ-> ĊĠĠĠĠĠĠĠ Ġappend ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" Ċ suspend Ġfun ĠImp l K db Command . Query .${ entry . nice ClassName }( query : ĠString , Ġparams : ĠMap < String , ĠAny ?> Ġ= Ġmap Of ()): ĠArrayList < ${ entry . qualified Name }> Ġ{ ĊĠĠĠ Ġvar Ġresp Ġ= Ġarray ListOf < ${ entry . qualified Name }> () ĊĠĠĠ Ġk db . connection Ġ{ ĊĠĠĠĠĠĠĠ Ġdb . query ( Impl K db Utils Functions . map QueryParams ( query , Ġparams )) Ġ{ Ġcursor Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresp Ġ= ĠK db Generated Query . query _${ entry . function Name }( cursor ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġresp Ċ } Ċ """ ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġgenerate Ext Delete Functions ( ĊĠĠĠ Ġmap : ĠList < Table Node > Ċ ) Ġ= Ġbuild String Ġ{ ĊĠĠĠ Ġmap . forEach Ġ{ Ġentry Ġ-> ĊĠĠĠĠĠĠĠ Ġappend ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" Ċ suspend Ġfun ĠImp l K db Command . Delete .${ entry . nice ClassName }( where : ĠString Ġ= Ġ" 1 = 1 ") Ġ{ ĊĠĠĠ Ġval Ġcommand Ġ= Ġ" DELETE ĠFROM Ġ${ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentry . simple Name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĠWHERE Ġ${ '$ '} where " ĊĠĠĠ Ġk db . connection Ġ{ ĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠ Ġdb . exec ( command ) ĊĠĠĠ Ġ} Ċ } Ċ """ ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġgenerate Ext Update Functions ( ĊĠĠĠ Ġmap : ĠList < Table Node > Ċ ) Ġ= Ġbuild String Ġ{ ĊĠĠĠ Ġmap . forEach Ġ{ Ġentry Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġcommand Ġ= Ġ" UPDATE Ġ${ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġentry . simple Name ĊĠĠĠĠĠĠĠ Ġ} ĠSET Ġ${ '$ ' }{ Impl K db Utils Functions . map Update Params ( params )} Ġ ĠWHERE Ġ${ '$ '} where " ĊĠĠĠĠĠĠĠ Ġappend ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" Ċ suspend Ġfun ĠImp l K db Command . Update .${ entry . nice ClassName }( where : ĠString Ġ= Ġ" 1 = 1 ", Ġparams : ĠMap < String , ĠAny ?> Ġ= Ġmap Of ()) Ġ{ ĊĠĠĠ Ġk db . connection Ġ{ ĊĠĠĠĠĠĠĠ Ġdb . exec ("$ command ") ĊĠĠĠ Ġ} Ċ } Ċ """ ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġgenerate Ext Insert Functions ( ĊĊĠĠĠ Ġmap : ĠList < Table Node > Ċ ) Ġ= Ġbuild String Ġ{ ĊĠĠĠ Ġmap . forEach Ġ{ Ġentry Ġ-> ĊĠĠĠĠĠĠĠ Ġappend ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" Ċ suspend Ġfun ĠImp l K db Command . Insert .${ entry . nice ClassName }( item : Ġ${ entry . qualified Name }) Ġ= Ġ${ entry . nice ClassName }( array Of ( item )) Ċ Ċ suspend Ġfun ĠImp l K db Command . Insert .${ entry . nice ClassName }( items : ĠList < ${ entry . qualified Name }> ) Ġ= Ġ${ entry . nice ClassName }( items . to Typed Array ()) Ċ Ċ suspend Ġfun ĠImp l K db Command . Insert .${ entry . nice ClassName }( items : ĠArray < ${ entry . qualified Name }> ) Ġ= Ġk db . connection Ġ{ ĠK db Generated Insert . insert _${ entry . function Name }( items , Ġdb ) Ġ} Ċ """ ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } ĊĊ