package Ġdatabases Ċ Ċ import ĠColumn Ċ import ĠEntity Ċ import ĠTable Ċ import Ġcolumn Ċ import Ġstatements . Create Statement Ċ import Ġstatements . Select Statement Ċ import Ġstatements . Where Statement Ċ import Ġutils .* Ċ import Ġjava . math . BigDecimal Ċ import Ġjava . sql . Date Ċ import Ġjava . sql . Time Ċ import Ġjava . sql . Timestamp Ċ import Ġjava . text . SimpleDateFormat Ċ import Ġjava . time . Instant Ċ import Ġjava . time . LocalDate Ċ import Ġjava . time . LocalDateTime Ċ import Ġjava . time . Local Time Ċ import Ġjava . util .* Ċ import Ġkotlin . reflect . K Mutable Property 1 Ċ import Ġkotlin . reflect . K Type Ċ Ċ /** Ċ Ġ* ĠRepresents Ġa Ġclass Ġfor ĠPostgreSQL Ġdatabase . Ċ Ġ* Ċ Ġ* Ġ@ param [ url ] ĠA Ġdatabase Ġurl Ġof Ġthe Ġform Ġjdbc : sqlite : sub name . Ċ Ġ*/ Ċ class ĠSQLite ( ĊĠĠĠ Ġurl : ĠString Ċ ) Ġ: ĠDatabase ( url , Ġdriver Ġ= Ġ" org . sqlite . JDBC ") Ġ{ ĊĠĠĠ Ġoverride Ġval Ġreserved Key Words : ĠList < String > Ġ= ĊĠĠĠĠĠĠĠ Ġ" abort , action , add , after , all , alter , always , analyze , and , as , asc , attach , auto increment , before , begin , between , by , cascade , case , cast , check , collate , column , commit , conflict , constraint , create , cross , current , current _ date , current _ time , current _ timestamp , database , default , def err able , deferred , delete , desc , detach , distinct , do , drop , each , else , end , escape , except , exclude , exclusive , exists , explain , fail , filter , first , following , for , foreign , from , full , generated , glob , group , groups , having , if , ignore , immediate , in , index , indexed , init ially , inner , insert , instead , intersect , into , is , isnull , join , key , last , left , like , limit , match , material ized , natural , no , not , nothing , not null , null , null s , of , offset , on , or , order , others , outer , over , partition , plan , pragma , pre ced ing , primary , query , raise , range , recursive , references , regexp , re index , release , rename , replace , restrict , return ing , right , rollback , row , rows , save point , select , set , table , temp , temporary , then , ties , to , transaction , trigger , un bounded , union , unique , update , using , vac uum , values , view , virtual , when , where , window , with , without " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. split (',') ĊĊĊĠĠĠ Ġoverride Ġval Ġdefault Types Map : ĠHashMap < K Type , ĠSql Type <* >> Ġ= Ġhash Map Of ( ĊĠĠĠĠĠĠĠ Ġbool Type Ġto ĠSql Type ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" integer ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcustom GetValue Ġ= Ġ{ Ġrs , Ġname Ġ-> Ġrs . getInt ( name ) Ġ== Ġ 1 Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcustom SetValue Ġ= Ġ{ Ġps , Ġindex , Ġvalue Ġ-> Ġps . setInt ( index , Ġif Ġ( value ) Ġ 1 Ġelse Ġ 0 ) Ġ}), ĊĠĠĠĠĠĠĠ Ġint 1 Type Ġto ĠSql Type < Byte >(" integer "), ĊĠĠĠĠĠĠĠ Ġint 2 Type Ġto ĠSql Type < Short >(" integer "), ĊĠĠĠĠĠĠĠ Ġint 4 Type Ġto ĠSql Type < Int >(" integer "), ĊĠĠĠĠĠĠĠ Ġint 8 Type Ġto ĠSql Type < Long >(" integer "), ĊĠĠĠĠĠĠĠ Ġfloat Type Ġto ĠSql Type < Float >(" real "), ĊĠĠĠĠĠĠĠ Ġdouble Type Ġto ĠSql Type < Double >(" real "), ĊĠĠĠĠĠĠĠ Ġstring Type Ġto ĠSql Type < String >(" text "), ĊĠĠĠĠĠĠĠ Ġdate Type Ġto ĠSql Type < Date >(" text ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcustom GetValue Ġ= Ġ{ Ġrs , Ġname Ġ-> ĠDate . valueOf ( rs . getString ( name )) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcustom SetValue Ġ= Ġ{ Ġps , Ġindex , Ġvalue Ġ-> Ġps . setString ( index , Ġvalue . toString ()) Ġ}), ĊĠĠĠĠĠĠĠ Ġlocal Date Type Ġto ĠSql Type < LocalDate >(" text ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcustom GetValue Ġ= Ġ{ Ġrs , Ġname Ġ-> ĠLocalDate . parse ( rs . getString ( name )) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcustom SetValue Ġ= Ġ{ Ġps , Ġindex , Ġvalue Ġ-> Ġps . setString ( index , Ġvalue . toString ()) Ġ}), ĊĠĠĠĠĠĠĠ Ġkt LocalDate Type Ġto ĠSql Type (" text ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcustom GetValue Ġ= Ġ{ Ġrs , Ġname Ġ-> Ġkotlinx . datetime . LocalDate . parse ( rs . getString ( name )) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcustom SetValue Ġ= Ġ{ Ġps , Ġindex , Ġvalue Ġ-> Ġps . setString ( index , Ġvalue . toString ()) Ġ}), ĊĠĠĠĠĠĠĠ Ġcalendar Type Ġto ĠSql Type < Calendar >(" text ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcustom GetValue Ġ= Ġ{ Ġrs , Ġname Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCalendar . getInstance () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ Ġtime In Millis Ġ= ĠTimestamp . valueOf ( rs . getString ( name )). time Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcustom SetValue Ġ= Ġ{ Ġps , Ġindex , Ġvalue Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġps . setString ( index , ĠSimpleDateFormat (" YYYY - MM - dd ĠHH : mm : ss . SS S "). format ( value . time )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}), ĊĠĠĠĠĠĠĠ Ġinstant Type Ġto ĠSql Type < Instant >(" text ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcustom GetValue Ġ= Ġ{ Ġrs , Ġname Ġ-> ĠInstant . of Epoch Milli ( Timestamp . valueOf ( rs . getString ( name )). time ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcustom SetValue Ġ= Ġ{ Ġps , Ġindex , Ġvalue Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġps . setString ( index , ĠSimpleDateFormat (" YYYY - MM - dd ĠHH : mm : ss . SS S "). format ( Timestamp ( value . to Epoch Milli ()))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}), ĊĠĠĠĠĠĠĠ Ġkt Instant Type Ġto ĠSql Type (" text ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcustom GetValue Ġ= Ġ{ Ġrs , Ġname Ġ-> Ġkotlinx . datetime . Instant . parse ( rs . getString ( name )) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcustom SetValue Ġ= Ġ{ Ġps , Ġindex , Ġvalue Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġps . setString ( index , Ġvalue . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}), ĊĠĠĠĠĠĠĠ Ġtime Type Ġto ĠSql Type < Time >(" text ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcustom GetValue Ġ= Ġ{ Ġrs , Ġname Ġ-> ĠTime . valueOf ( rs . getString ( name )) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcustom SetValue Ġ= Ġ{ Ġps , Ġindex , Ġvalue Ġ-> Ġps . setString ( index , Ġvalue . toString ()) Ġ}), ĊĠĠĠĠĠĠĠ Ġlocal Time Type Ġto ĠSql Type < Local Time >(" text ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcustom GetValue Ġ= Ġ{ Ġrs , Ġname Ġ-> ĠLocal Time . parse ( rs . getString ( name )) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcustom SetValue Ġ= Ġ{ Ġps , Ġindex , Ġvalue Ġ-> Ġps . setString ( index , Ġvalue . toString ()) Ġ}), ĊĠĠĠĠĠĠĠ Ġtimestamp Type Ġto ĠSql Type < Timestamp >(" text ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcustom GetValue Ġ= Ġ{ Ġrs , Ġname Ġ-> ĠTimestamp . valueOf ( rs . getString ( name )) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcustom SetValue Ġ= Ġ{ Ġps , Ġindex , Ġvalue Ġ-> Ġps . setString ( index , Ġvalue . toString ()) Ġ}), ĊĠĠĠĠĠĠĠ Ġlocal DateTime Type Ġto ĠSql Type < LocalDateTime >(" text ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcustom GetValue Ġ= Ġ{ Ġrs , Ġname Ġ-> ĠLocalDateTime . parse ( rs . getString ( name )) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcustom SetValue Ġ= Ġ{ Ġps , Ġindex , Ġvalue Ġ-> Ġps . setString ( index , Ġvalue . toString ()) Ġ}), ĊĠĠĠĠĠĠĠ Ġkt LocalDateTime Type Ġto ĠSql Type (" text ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcustom GetValue Ġ= Ġ{ Ġrs , Ġname Ġ-> Ġkotlinx . datetime . LocalDateTime . parse ( rs . getString ( name )) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcustom SetValue Ġ= Ġ{ Ġps , Ġindex , Ġvalue Ġ-> Ġps . setString ( index , Ġvalue . toString ()) Ġ}), ĊĠĠĠĠĠĠĠ Ġdecimal Type Ġto ĠSql Type (" text ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcustom GetValue Ġ= Ġ{ Ġrs , Ġname Ġ-> ĠBigDecimal ( rs . getString ( name )) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcustom SetValue Ġ= Ġ{ Ġps , Ġindex , Ġvalue Ġ-> Ġps . setString ( index , Ġvalue . toString ()) Ġ}), ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġoverride Ġfun Ġ< E Ġ: ĠEntity > Ġid Column ( table : ĠTable < E >, Ġprop : ĠK Mutable Property 1 < E , ĠInt >): ĠColumn < E , ĠInt > Ġ= ĊĠĠĠĠĠĠĠ ĠColumn ( table , Ġprop , ĠSql Type (" integer ")). primaryKey () ĊĊĠĠĠ Ġoverride Ġval Ġcreate Statement Sql : ĠCreate Statement <* >. () Ġ-> ĠString Ġ= Ġ{ ĊĠĠĠĠĠĠĠ Ġ" CREATE ĠTABLE ĠIF ĠNOT ĠEXISTS Ġ${ table . tableName }\ n (" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtable . columns . join ToString (", \ n ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"\ t " Ġ+ Ġit . to Sql ( maxLength ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtable . references . join ToString (", \ n \ t ", Ġprefix Ġ= Ġ", \ n \ t ") Ġ{ Ġit . get ForeignKey () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. if True ( table . references . isNotEmpty ()) Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtable . check Conditions . join ToString ("") Ġ{ Ġ", \ n CHECK Ġ(${ it ( Where Statement ()) })" Ġ} Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ", \ n CONSTRAINT Ġ${ table . tableName }_ unique _ columns ĠUNIQUE Ġ(${ table . unique Props . join ToString Ġ{ Ġit . column . name Ġ} })" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. if True ( table . unique Props . isNotEmpty ()) Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"\ n )" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġselect Statement Sql : ĠSelect Statement <* >. () Ġ-> ĠString Ġ= Ġ{ ĊĠĠĠĠĠĠĠ Ġ" SELECT ${ get Select Values ()} ĠFROM Ġ${ table . tableName }" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjoin Tables . join ToString ("") Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( group Column Ġ?: Ġ"") Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhere Statement . get Sql () Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ(" ĠORDER ĠBY Ġ" Ġ+ Ġorder Columns . join ToString ()). if True ( order Columns . isNotEmpty ()) Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( offset Ġ!= Ġ 0 ) Ġ" ĠLIMIT Ġ${ limit Ġ?: Ġ- 1 } ĠOFFSET Ġ$ offset " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ" ĠLIMIT Ġ$ limit ". if True ( limit Ġ!= Ġnull ) ĊĠĠĠ Ġ} Ċ } Ċ