package Ġcom . mine k . kotlin . every we h re . kes ql . session Ċ Ċ import Ġcom . mine k . kotlin . every we h re . kes ql . Database Ċ import Ġcom . mine k . kotlin . every we h re . kes ql . orm . Model Ċ import Ġcom . mine k . kotlin . every we h re . kes ql . sql . Delete Ċ import Ġcom . mine k . kotlin . every we h re . kes ql . sql . Insert Ċ import Ġcom . mine k . kotlin . every we h re . kes ql . sql . Update Ċ import Ġcom . mine k . kotlin . every we h re . kes ql . table . Column Ċ import Ġorg . postgresql . Driver Ċ import Ġjava . sql . Connection Ċ import Ġjava . sql . Driver Manager Ċ Ċ abstract Ġclass ĠSession Ġ{ ĊĠĠĠ Ġabstract Ġval Ġconnection : ĠConnection ĊĊĠĠĠ Ġabstract Ġfun Ġadd ( model : ĠModel ) ĊĊĠĠĠ Ġabstract Ġfun Ġdelete ( var arg Ġmodels : ĠModel ) ĊĊĠĠĠ Ġabstract Ġfun Ġcommit () ĊĊĠĠĠ Ġabstract Ġfun Ġremove () Ċ } ĊĊ Ċ class ĠThread Session Impl ( private Ġval Ġdatabase : ĠDatabase ) Ġ: ĠSession () Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġmodels Ġ= Ġhash Set Of < Model >() ĊĠĠĠ Ġprivate Ġval Ġdeletes Ġ= Ġhash Set Of < Model >() ĊĊĠĠĠ Ġoverride Ġval Ġconnection : ĠConnection Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠDriver Manager . register Driver ( Driver ()) ĊĠĠĠĠĠĠĠ Ġval Ġconn Ġ= ĠDriver Manager . getConnection ( database . url ) ĊĠĠĠĠĠĠĠ Ġconn . auto Commit Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġconn ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġadd ( model : ĠModel ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmodels . add ( model ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdelete ( var arg Ġmodels : ĠModel ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdeletes . addAll ( models ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġflush () Ġ{ ĊĠĠĠĠĠĠĠ Ġmodels . filter Ġ{ Ġ! it . metadata . is Sync ed Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmodel Table Ġ= Ġdatabase [ it . metadata ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp ks : ĠMap < Column <* >, ĠAny > Ġ= ĠInsert ( model Table ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set ( it . metadata . property . map Ġ{ Ġit . key Ġto Ġit . value Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. execute () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . metadata . set ( pk s , Ġdirty Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . metadata . clear Dirty () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . metadata . is Sync ed Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġmodels . filter Ġ{ Ġit . metadata . dirty Columns . isNotEmpty () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġmodel Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmodel Table Ġ= Ġdatabase [ model . metadata ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUpdate ( model Table ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodel . metadata . property . filter Ġ{ Ġit . key Ġin Ġmodel . metadata . dirty Columns Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter ( model Table . meta . primaryKey Condition ( model )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. execute () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodel . metadata . clear Dirty () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġdeletes ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmodel Table Ġ= Ġdatabase [ it . metadata ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDelete ( model Table ). filter ( model Table . meta . primaryKey Condition ( it )). execute () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġmodels . removeAll ( de letes ) ĊĠĠĠĠĠĠĠ Ġdeletes . removeAll ( de letes . toList ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcommit () Ġ{ ĊĠĠĠĠĠĠĠ Ġflush () ĊĠĠĠĠĠĠĠ Ġconnection . commit () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġremove () Ġ{ ĊĠĠĠĠĠĠĠ Ġmodels . removeAll ( models . toList ()) ĊĠĠĠĠĠĠĠ Ġdeletes . removeAll ( de letes . toList ()) ĊĠĠĠĠĠĠĠ Ġconnection . rollback () ĊĠĠĠĠĠĠĠ Ġconnection . close () ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠThread Session ( private Ġval Ġdatabase : ĠDatabase ) Ġ: ĠSession () Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġsession Pool Ġ= ĠThread Local < Thread Session Impl >() ĊĠĠĠ Ġprivate Ġval Ġsession : ĠThread Session Impl ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġthread Session Impl Ġ= Ġsession Pool . get () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( thread Session Impl Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthread Session Impl Ġ= ĠThread Session Impl ( database ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsession Pool . set ( thread Session Impl ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthread Session Impl ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġoverride Ġval Ġconnection : ĠConnection ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġsession . connection ĊĊĠĠĠ Ġoverride Ġfun Ġadd ( model : ĠModel ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsession . add ( model ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdelete ( var arg Ġmodels : ĠModel ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsession . delete (* models ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcommit () Ġ{ ĊĠĠĠĠĠĠĠ Ġsession . commit () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġremove () Ġ{ ĊĠĠĠĠĠĠĠ Ġsession . remove () ĊĠĠĠĠĠĠĠ Ġsession Pool . remove () ĊĠĠĠ Ġ} Ċ }