package Ġcom . vl ad sch . kotlin . jdbc Ċ Ċ import Ġjavax . json . JsonObject Ċ import Ġkotlin . reflect . K Property Ċ Ċ @ Suppress (" Member Visibility Can Be Private ") Ċ abstract Ġclass ĠModel < T Ġ: ĠModel < T >>( val Ġsql Table : ĠString , Ġdb Case : ĠBoolean , Ġallow Set Auto : ĠBoolean Ġ= Ġtrue , Ġquote : ĠString ? Ġ= Ġnull ) Ġ{ ĊĠĠĠ Ġprotected Ġval Ġdb : ĠModel Property Provider < T > Ġget () Ġ= Ġ_ model ĊĊĠĠĠ Ġinternal Ġval Ġ_ model Ġ= ĠModel Properties < T >( this :: class . simple Name Ġ?: Ġ"< unknown >", Ġdb Case , Ġallow Set Auto , Ġquote Ġ?: ĠModel Properties . database Qu oting ) ĊĊĠĠĠ Ġfun Ġload ( rs : ĠRow ): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ model . load ( rs ) ĊĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠ Ġreturn Ġthis Ġas ĠT ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġload ( json : ĠJsonObject ): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ model . load ( json ) ĊĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠ Ġreturn Ġthis Ġas ĠT ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġload ( other : ĠModel < *> ): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ model . load ( other ) ĊĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠ Ġreturn Ġthis Ġas ĠT ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠtoJson () Ġ= Ġ_ model . to JsonObject () ĊĊĠĠĠ Ġval Ġinsert Query : ĠSql Query Ġget () Ġ= Ġ_ model . sql Insert Query ( sql Table ) ĊĠĠĠ Ġval Ġdelete Query : ĠSql Query Ġget () Ġ= Ġ_ model . sql Delete Query ( sql Table ) ĊĠĠĠ Ġval Ġupdate Query : ĠSql Query Ġget () Ġ= Ġ_ model . sql Update Query ( sql Table ) ĊĠĠĠ Ġval Ġselect Query : ĠSql Query Ġget () Ġ= Ġ_ model . sql Select Query ( sql Table ) ĊĠĠĠ Ġval Ġselect Sql : ĠString Ġget () Ġ= Ġ_ model . sql Select Table ( sql Table ) ĊĊĠĠĠ Ġfun Ġinsert ( session : ĠSession ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsession . update Get Keys ( insert Query ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ model . load Keys ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġinsert Ignore Keys ( session : ĠSession ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsession . update ( insert Query ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġselect ( session : ĠSession ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsession . first ( select Query ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ model . load ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġinsert Reload ( session : ĠSession ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinsert ( session ) ĊĠĠĠĠĠĠĠ Ġselect ( session ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclear Auto Keys () Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ model . clear Auto Keys () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdelete ( session : ĠSession ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsession . execute ( delete Query ) ĊĠĠĠĠĠĠĠ Ġclear Auto Keys () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġupdate ( session : ĠSession ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( session . execute ( update Query )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsnapshot () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġupdate Reload ( session : ĠSession ) Ġ{ ĊĠĠĠĠĠĠĠ Ġupdate ( session ) ĊĠĠĠĠĠĠĠ Ġselect ( session ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdelete Keep Auto Keys ( session : ĠSession ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdelete ( session ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġset Ġproperty Ġvalue Ġdirectly Ġin Ġthe Ġ_ model Ġproperty Ġmap , Ġby Ġpassing Ġ_ model Ġproperties ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠCan Ġbe Ġused Ġto Ġset Ġnon - writable Ġproperties ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġfun Ġ< V > Ġset Property ( prop : ĠK Property <* >, Ġvalue : ĠV ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠ Ġ_ model . setProperty ( this Ġas ĠT , Ġprop , Ġvalue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsnapshot () Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ model . snapshot () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis Dirty (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ_ model . is Modified () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis Dirty ( property : ĠK Property < *> ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ_ model . is Modified ( property ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġappend Keys ( append able : ĠAppend able , Ġparams : ĠArrayList < Any ? >, Ġdelimiter : ĠString Ġ= Ġ" ĠAND Ġ", Ġsep : ĠString Ġ= Ġ"") : ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ_ model . append Keys ( append able , Ġparams , Ġdelimiter , Ġsep ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠforEach Key ( consumer : Ġ( prop : ĠK Property <* >, Ġprop Type : ĠProperty Type , Ġvalue : ĠAny ?) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ model . forEach Key ( consumer ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠforEach Prop ( consumer : Ġ( prop : ĠK Property <* >, Ġprop Type : ĠProperty Type , Ġvalue : ĠAny ?) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ model . forEach Prop ( consumer ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠforEach Key ( consumer : Ġ( prop : ĠK Property <* >, Ġprop Type : ĠProperty Type , ĠcolumnName : ĠString , Ġvalue : ĠAny ?) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ model . forEach Key ( consumer ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠforEach Prop ( consumer : Ġ( prop : ĠK Property <* >, Ġprop Type : ĠProperty Type , ĠcolumnName : ĠString , Ġvalue : ĠAny ?) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ model . forEach Prop ( consumer ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsb Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠ Ġvar Ġsep Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġsb . append (_ model . name ). append (" (" ) ĊĠĠĠĠĠĠĠ ĠforEach Prop Ġ{ Ġprop , Ġprop Type , Ġvalue Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Ġ!== ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ( sep ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( prop Type . is Key ) Ġsb . append ('* ') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ( prop . name ). append (" =" ). append ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsep Ġ= Ġ", Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsb . append (" )") ĊĠĠĠĠĠĠĠ Ġreturn Ġsb . toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġdatabase Qu oting : ĠString ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= ĠModel Properties . database Qu oting ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠModel Properties . database Qu oting Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġquote Identifier ( name : ĠString ): ĠString Ġ= ĠModel Properties . quote Identifier ( name ) ĊĊĠĠĠĠĠĠĠ Ġfun Ġlist Query ( tableName : ĠString , Ġparams : ĠArray < out ĠPair < String , ĠAny ? >>, Ġquote : ĠString Ġ= ĠModel Properties . database Qu oting ): ĠSql Query Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconditions Ġ= ĠHashMap < String , ĠAny ?> () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconditions . put All ( params ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġlist Query ( tableName , Ġconditions , Ġquote ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġlist Query ( tableName : ĠString , Ġwhere Clause : ĠString , Ġparams : ĠArray < out ĠPair < String , ĠAny ? >>, Ġquote : ĠString Ġ= ĠModel Properties . database Qu oting ): ĠSql Query Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparams Map Ġ= ĠHashMap < String , ĠAny ?> () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparams Map . put All ( params ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġlist Query ( tableName , Ġwhere Clause , Ġparams Map , Ġquote ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġappend Where Clause ( query : ĠString , Ġparams : ĠMap < String , ĠAny ? >, Ġquote : ĠString Ġ= ĠModel Properties . database Qu oting ): ĠSql Query Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ(! params . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsql Query ("$ query ĠWHERE Ġ" Ġ+ Ġparams . keys . join ToString (" ĠAND Ġ") Ġ{ Ġkey Ġ-> Ġif Ġ( params [ key ] Ġis ĠCollection <* >) Ġ"$ quote $ key $ quote ĠIN Ġ(: $ key )" Ġelse Ġ"$ quote $ key $ quote Ġ= Ġ: $ key " Ġ}, Ġparams ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsql Query ( query ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġlist Query ( tableName : ĠString , Ġconditions : ĠMap < String , ĠAny ? >, Ġquote : ĠString Ġ= ĠModel Properties . database Qu oting ): ĠSql Query Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġappend Where Clause (" SELECT Ġ* ĠFROM Ġ$ quote $ tableName $ quote ", Ġconditions , Ġquote ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġlist Query ( tableName : ĠString , Ġwhere Clause : ĠString , Ġparams : ĠMap < String , ĠAny ? >, Ġquote : ĠString Ġ= ĠModel Properties . database Qu oting ): ĠSql Query Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsql Query (" SELECT Ġ* ĠFROM Ġ$ quote $ tableName $ quote Ġ$ where Clause ", Ġparams , Ġquote ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ