Ċ package Ġcom . j ov ial . db 9 0 1 0 Ċ Ċ import Ġjava . sql . Connection Ċ import Ġjava . sql . Driver Manager Ċ import Ġjava . sql . PreparedStatement Ċ import Ġjava . sql . ResultSet Ċ import Ġjava . util . Properties Ċ import Ġjava . util . logging . Logger ĊĊ Ċ // ĠA Ġsmall , Ġlightweight Ġwrapper Ġaround ĠSQL Ġdata Ġtypes . Ġ ĠSee Ġthe Ċ // Ġoverview Ġin Ġsrc / docs / module . md Ġand Ġthe Ġpackage Ġoverview Ġin Ċ // Ġsrc / docs / com . j ov ial . db 9 0 1 0 / package . md Ċ Ċ internal Ġval Ġdb Logger Ġ= ĠLogger . getLogger (" com . j ov ial . db 9 0 1 0 ") Ċ Ċ /** Ċ Ġ* ĠRepresents Ġa Ġdatabase Ġthat Ġwe Ġconnect Ġto Ġusing ĠJDBC . Ġ ĠThis Ġis Ġthe Ġmain Ċ Ġ* Ġentry Ġpoint Ġin Ġthis Ġlibrary Ġfor Ġoperations Ġon Ġa Ġdatabase . Ċ Ġ* Ċ Ġ* ĠUsage Ġexample : Ċ Ġ* Ġ``` Ċ Ġ* ĠĠĠĠ ĠDatabase . with Connection (" jdbc : h 2 : mem : test ", Ġ" root ", Ġ"") Ġ{ Ġdb Ġ-> Ċ Ġ* ĠĠĠĠĠĠĠĠ Ġvarious Ġoperations Ġon Ġdb Ċ Ġ* ĠĠĠĠ Ġ} Ċ Ġ* Ġ``` Ċ Ġ* Ċ Ġ*/ Ċ class ĠDatabase Ġprivate Ġconstructor ( val Ġconnection : ĠConnection ) Ġ: ĠAuto Closeable Ġ{ ĊĊĠĠĠ Ġinternal Ġval Ġinsert Statements Ġ= ĠStatement Cache < Insert Statement . Key >(" insert ") ĊĠĠĠ Ġinternal Ġval Ġselect Statements Ġ= ĠStatement Cache < Select Query . Key >(" select ") ĊĠĠĠ Ġinternal Ġval Ġupdate Statements Ġ= ĠStatement Cache < Update Statement . Key >(" update ") ĊĠĠĠ Ġinternal Ġval Ġdelete Statements Ġ= ĠStatement Cache < Delete Statement . Key >(" delete ") ĊĠĠĠ Ġinternal Ġval Ġgeneric Statements Ġ= ĠStatement Cache < Generic Statement . Key >(" generic ") ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠExecute Ġa Ġbody Ġof Ġcode Ġwith Ġa Ġnew ĠJDBC Ġconnection Ġthat Ġis Ġheld Ġwithin Ġa Ġ` Database ` Ġinstance . ĊĠĠĠĠĠĠĠĠ Ġ* ĠIf Ġthe Ġclient Ġcode Ġmakes Ġthat Ġ` Database ` Ġinstance Ġavailable Ġto Ġother Ġthreads , Ġit Ġis ĊĠĠĠĠĠĠĠĠ Ġ* Ġthe Ġclient 's Ġresponsibility Ġdo Ġdo Ġany Ġneeded Ġsynchronization . Ġ ĠWhen Ġthe Ġcode Ġbody Ġexits , ĊĠĠĠĠĠĠĠĠ Ġ* Ġthe Ġconnection Ġis Ġclosed , Ġand Ġthe Ġ` Database ` Ġinstance Ġis Ġno Ġlonger Ġusable . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠUsage Ġexample : ĊĠĠĠĠĠĠĠĠ Ġ* Ġ``` ĊĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠ ĠDatabase . with Connection (" jdbc : h 2 : mem : test ", Ġ" root ", Ġ"") Ġ{ Ġdb Ġ-> ĊĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠ Ġvarious Ġoperations Ġon Ġdb ĊĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠ Ġ* Ġ``` ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġ< T > Ġwith Connection ( url : ĠString , Ġuser : ĠString , Ġpassword : ĠString , Ġbody : Ġ( db : ĠDatabase ) Ġ-> ĠT ): ĠT Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġopen ( url , Ġuser , Ġpassword ). use Ġ{ Ġdb Ġ-> Ġbody ( db ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠOpen Ġa ĠJDBC Ġconnection , Ġand Ġgive Ġa Ġ[ Database ] Ġobject Ġrepresenting Ġit . ĊĠĠĠĠĠĠĠĠ Ġ* ĠSee Ġ[ close ], Ġor , Ġto Ġautomatically Ġclose Ġthe ĠDatabase , Ġ[ with Connection ]. ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġopen ( url : ĠString , Ġuser : ĠString , Ġpassword : ĠString ): ĠDatabase Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconn Properties Ġ= ĠProperties () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconn Properties [" user "] Ġ= Ġuser ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconn Properties [" password "] Ġ= Ġpassword ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠDatabase ( Driver Manager . getConnection ( url , Ġconn Properties )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠClose Ġthe Ġunderlying ĠJDBC Ġconnection , Ġand Ġfree Ġother Ġresources , Ġlike Ġcached Ġstatements . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġclose () Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( s Ġin Ġinsert Statements . values ) Ġs . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( s Ġin Ġselect Statements . values ) Ġs . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( s Ġin Ġupdate Statements . values ) Ġs . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( s Ġin Ġdelete Statements . values ) Ġs . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( s Ġin Ġgeneric Statements . values ) Ġs . close () ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnection . close () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠExecute Ġthe Ġcode Ġbody Ġwithin Ġa ĠJDBC Ġtransaction . Ġ ĠThe Ġtransaction Ġis Ġcommitted ĊĠĠĠĠ Ġ* Ġwhen Ġthe Ġcode Ġbody Ġcompletes . Ġ ĠSet Ġ[ max Retries ] Ġto Ġattempt Ġthe Ġcode Ġbody Ġmultiple ĊĠĠĠĠ Ġ* Ġtimes , Ġif Ġan Ġexception Ġis Ġthrown Ġin Ġ[ body ] Ġor Ġwhile Ġcommit ting . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġtransaction ( max Retries : ĠInt Ġ= Ġ 0 , Ġbody : Ġ() Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġretries Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġwas Auto Commit Ġ= Ġconnection . auto Commit ĊĠĠĠĠĠĠĠ Ġassert ( was Auto Commit ) ĠĠĠĠĠĠ Ġ// ĠI Ġthink Ġthis Ġis Ġa Ġvalid Ġassumption ? ĊĠĠĠĠĠĠĠ Ġconnection . auto Commit Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġsave Point Ġ= Ġconnection . set Save point () ĊĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbody () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnection . commit () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnection . release Save point ( save Point ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnection . auto Commit Ġ= Ġwas Auto Commit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġretries Ġ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( retries Ġ>= Ġmax Retries ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnection . release Save point ( save Point ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnection . auto Commit Ġ= Ġwas Auto Commit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdb Logger . fine Ġ{ Ġ" Transaction Ġtry Ġ# Ġ$ retries : Ġ Ġ$ e " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnection . rollback ( save Point ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠExecute Ġa ĠSQL ĠCREATE ĠTABLE Ġstatement Ġfor Ġ[ table ]. Ġ ĠInclude ĠSQL ĊĠĠĠĠ Ġ* Ġ" IF ĠNOT ĠEXISTS " Ġif Ġ[ if Not Exists ] Ġis Ġset Ġtrue . Ġ ĠThe ĠCREATE ĠTABLE ĊĠĠĠĠ Ġ* Ġstatement Ġis Ġnot Ġcached . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġcreate Table ( table : ĠTable , Ġif Not Exists Ġ: ĠBoolean Ġ= Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsql Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠ Ġsql . append (" CREATE ĠTABLE Ġ") ĊĠĠĠĠĠĠĠ Ġif Ġ( if Not Exists ) Ġsql . append (" IF ĠNOT ĠEXISTS Ġ") ĊĠĠĠĠĠĠĠ Ġsql . append ("${ table . tableName } Ġ( ") ĊĠĠĠĠĠĠĠ Ġappend Comma List ( sql , Ġtable . columns ) Ġ{ Ġc Ġ-> Ġ"${ c . sql Name } Ġ${ c . sql Type }" Ġ} ĊĠĠĠĠĠĠĠ Ġvar Ġlist Empty Ġ= Ġtable . columns . size Ġ== Ġ 0 ĊĠĠĠĠĠĠĠ Ġif Ġ( table . primary Keys . size Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! list Empty ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsql . append (", Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist Empty Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsql . append (" PRIMARY ĠKEY Ġ( ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend Comma List ( sql , Ġtable . primary Keys ) Ġ{ Ġkey Ġ-> Ġkey . sql Name Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsql . append (" )") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( table . constraints Sql Ġ!= Ġ"") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! list Empty ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsql . append (", Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsql . append ( table . constraints Sql ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsql . append (" )") ĊĠĠĠĠĠĠĠ Ġexecute Sql Update ( connection , Ġsql . toString ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠExecute Ġa ĠSQL ĠDROP ĠTABLE Ġstatement Ġfor Ġ[ table ]. Ġ ĠInclude ĠSQL ĊĠĠĠĠ Ġ* Ġ" IF ĠEXISTS " Ġif Ġ[ if Exists ] Ġis Ġset Ġtrue . Ġ ĠThe ĠDROP ĠTABLE ĊĠĠĠĠ Ġ* Ġstatement Ġis Ġnot Ġcached . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġdrop Table ( table : ĠTable , Ġif Exists : ĠBoolean Ġ= Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġe Ġ= Ġif Ġ( if Exists ) Ġ" IF ĠEXISTS " Ġelse Ġ"" ĊĠĠĠĠĠĠĠ Ġexecute Sql Update ( connection , Ġ" DROP ĠTABLE Ġ$ e Ġ${ table . tableName }") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRun Ġan Ġinsert Ġstatement , Ġand Ġcollect Ġresults , Ġi . e . Ġthe Ġvalues Ġof Ġprimary Ġkey Ġcolumn ( s ). ĊĠĠĠĠ Ġ* ĠFor Ġexample : ĊĠĠĠĠ Ġ* Ġ``` ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġval Ġdb Ġ: ĠDatabase Ġ= Ġ... ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġpr ague Id Ġ= Ġdb . insert Into ( this ) Ġ Ġ{ Ġrow Ġ-> ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠ Ġrow [ name ] Ġ= Ġ" Pr ague " ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġ} Ġrun Ġ{ Ġr Ġ-> Ġr [ id ] Ġ} ĠĠĠ Ġ// Ġr [ id ] Ġis Ġassigned Ġto Ġpr ague Id ĊĠĠĠĠ Ġ* Ġ``` ĊĠĠĠĠ Ġ* ĠSee Ġ[ Insert Statement . Builder ] Ġfor Ġparameters Ġand Ġarguments Ġthat Ġcan Ġbe Ġset . Ġ ĠThe ĊĠĠĠĠ Ġ* Ġstatement Ġis Ġrun Ġwith Ġ[ Insert Statement . Builder . run ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġinsert Into ( table : ĠTable , Ġset Body : Ġ( Insert Statement ) Ġ-> ĠUnit ) Ġ= ĊĠĠĠĠĠĠĠ ĠInsert Statement . Builder ( this , Ġtable , Ġset Body ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRun Ġan Ġinsert Ġstatement , Ġbut Ġignore Ġany Ġresults , Ġe . g . Ġthe Ġvalues Ġof Ġprimary Ġkeys . ĊĠĠĠĠ Ġ* ĠFor Ġexample : ĊĠĠĠĠ Ġ* Ġ``` ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġval Ġdb Ġ: ĠDatabase Ġ= Ġ... ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġdb . insert Into ( People ) Ġrun Ġ{ Ġrow Ġ-> ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠ Ġrow [ People . name ] Ġ= Ġ" A lf red ĠE . ĠNe uman " ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠ Ġrow [ People . wor ried ] Ġ= Ġfalse ĊĠĠĠĠ Ġ* ĠĠĠĠĠ Ġ} ĊĠĠĠĠ Ġ* Ġ``` ĊĠĠĠĠ Ġ* ĠSee Ġ[ Insert Statement . Builder No Results ] Ġfor Ġparameters Ġand Ġarguments Ġthat Ġcan Ġbe Ġset . ĊĠĠĠĠ Ġ* ĠThe Ġstatement Ġis Ġrun Ġwith Ġ[ Insert Statement . Builder No Results . run ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġinsert Into ( table : ĠTable ) Ġ= ĊĠĠĠĠĠĠĠ ĠInsert Statement . Builder No Results ( this , Ġtable ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRun Ġa ĠSELECT Ġstatement Ġover Ġthe Ġgiven Ġcolumns . Ġ ĠSee ĊĠĠĠĠ Ġ* Ġ[ Select Query . Builder ] Ġfor Ġparameters Ġand Ġarguments Ġthat Ġcan Ġbe ĊĠĠĠĠ Ġ* Ġset . Ġ ĠThe Ġquery Ġis Ġrun Ġwithin Ġthe Ġcode Ġblock Ġgiven Ġto ĊĠĠĠĠ Ġ* Ġ[ Select Query . Builder . run ] Ġwhen Ġthat Ġcode Ġexecutes Ġ[ Select Query . next ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠUsage Ġexample : ĊĠĠĠĠ Ġ* Ġ``` ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġdb . select ( People . columns ). from ( People ) Ġ+ Ġ" WHERE Ġ" Ġ+ ĠPeople . name Ġ+ Ġ" Ġ<> Ġ" Ġ+ Ġparam Ġrun ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġ{ Ġquery Ġ-> ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠ Ġquery [ param ] Ġ= Ġ" Bob ĠD ob bs " ĠĠĠĠĠ Ġ// ĠHide ĠBob , Ġif Ġhe 's Ġthere ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠ Ġwhile Ġ( query . next ()) Ġ{ ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" name : Ġ Ġ${ query [ People . name ]} ") ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" wor ried : Ġ Ġ${ query [ People . wor ried ]} ") ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġ} ĊĠĠĠĠ Ġ* Ġ``` ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġselect ( columns : ĠList < Column <* >>) Ġ= ĊĠĠĠĠĠĠĠ ĠSelect Query . Builder ( this , Ġcolumns ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRun Ġa ĠSELECT Ġstatement Ġover Ġthe Ġgiven Ġcolumns . Ġ ĠSee ĊĠĠĠĠ Ġ* Ġ[ Select Query . Builder ] Ġfor Ġparameters Ġand Ġarguments Ġthat Ġcan Ġbe ĊĠĠĠĠ Ġ* Ġset . Ġ ĠThe Ġquery Ġis Ġrun Ġwithin Ġthe Ġcode Ġblock Ġgiven Ġto ĊĠĠĠĠ Ġ* Ġ[ Select Query . Builder . run ] Ġwhen Ġthat Ġcode Ġexecutes Ġ[ Select Query . next ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠUsage Ġexample : ĊĠĠĠĠ Ġ* Ġ``` ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġdb . select ( Users . name , ĠC ities . name ). from ( Users ) Ġ+ ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ĠINNER ĠJOIN Ġ" Ġ Ġ+ ĠC ities Ġ+ Ġ" ĠON Ġ" Ġ+ ĠC ities . id Ġ+ Ġ"=" Ġ+ ĠUsers . city Id Ġ+ ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ĠORDER ĠBY Ġ" Ġ+ ĠUsers . name Ġrun ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġ{ Ġr Ġ-> ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠ Ġwhile Ġ( r . next ()) Ġ{ ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ("\ t ${ r [ Users . name ] }\ t ${ r [ C ities . name ]} ") ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġ} ĊĠĠĠĠ Ġ* Ġ``` ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġselect ( var arg Ġcolumns : ĠColumn <* >) Ġ= ĊĠĠĠĠĠĠĠ ĠSelect Query . Builder ( this , Ġcolumns . toList ()) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRun Ġan ĠUPDATE Ġstatement Ġon Ġthe Ġgiven Ġtable . Ġ ĠRows Ġto Ġbe Ġupdated Ġare Ġidentified ĊĠĠĠĠ Ġ* Ġwith Ġcalls Ġto Ġ[ Parameter Setter . set ] Ġwithin Ġthe Ġcode Ġbody Ġpassed Ġto ĊĠĠĠĠ Ġ* Ġ[ Update Statement . Builder . run ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠUsage Ġexample : ĊĠĠĠĠ Ġ* Ġ``` ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġval Ġid Str Ġ= ĠParameter ( Types . sql String ) ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġval Ġnum Ġ= Ġdb . update ( Users ) Ġ+ Ġ" WHERE Ġ" Ġ+ Ġid Ġ+ Ġ"=" Ġ+ Ġid Str Ġrun Ġ{ Ġu Ġ-> ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠ Ġu [ id Str ] Ġ= Ġ" alex " ĠĠ Ġ// ĠSets Ġthe Ġparameter ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠ Ġu [ Users . name ] Ġ= Ġ" Alex y " ĠĠ Ġ// ĠSets Ġthe Ġnew Ġvalue Ġof Ġthe Ġname Ġcolumn ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠ Ġu [ users . city Id ] Ġ= Ġpr ague Id ĠĠĠ Ġ// ĠSets Ġthe Ġnew Ġvalue Ġof Ġthe Ġcity Id Ġcolumn ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġ} ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġprintln (" Updated Ġ$ num Ġrow ( s )") ĊĠĠĠĠ Ġ* Ġ``` ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġupdate ( table : ĠTable ) Ġ= ĊĠĠĠĠĠĠĠ ĠUpdate Statement . Builder ( this , Ġtable ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRun Ġa ĠDELETE ĠFROM Ġstatement Ġfor Ġthe Ġgiven Ġtable . Ġ ĠSee Ġ[ Delete Statement . Builder ] Ġfor ĊĠĠĠĠ Ġ* Ġsetting Ġadditional Ġarguments Ġand Ġparameters . Ġ ĠThe Ġstatement Ġis Ġrun Ġafter Ġthe Ġcode ĊĠĠĠĠ Ġ* Ġbody Ġsent Ġto Ġ[ Delete Statement . Builder . run ] Ġcompletes . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠUsage Ġexample : ĊĠĠĠĠ Ġ* Ġ``` ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġval Ġparam Ġ= ĠParameter ( Types . sql String ) ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġval Ġdeleted Ġ= Ġdb . delete From ( Users ) Ġ+ Ġ" WHERE Ġ" Ġ+ ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠ ĠUsers . name Ġ+ Ġ" ĠLIKE Ġ" Ġ+ Ġparam Ġrun Ġ{ Ġ Ġd Ġ-> ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠ Ġd [ param ] Ġ= Ġ"% thing " ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġ} ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġprintln ("$ deleted Ġrows Ġdeleted .") ĊĠĠĠĠ Ġ* Ġ``` ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġdelete From ( table : ĠTable ) Ġ= ĊĠĠĠĠĠĠĠ ĠDelete Statement . Builder ( this , Ġtable ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRun Ġa Ġgeneric ĠSQL Ġstatement . Ġ ĠSee Ġ[ Generic Statement . Builder ] Ġfor Ġsetting ĊĠĠĠĠ Ġ* Ġarguments Ġand Ġparameters , Ġincluding Ġthe Ġstatement Ġtext . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠUsage Ġexample : ĊĠĠĠĠ Ġ* Ġ``` ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġdb . statement (). qual ify Column Names ( false ). do Not Cache () Ġ+ ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" CREATE ĠINDEX Ġ" Ġ+ ĠPeople Ġ+ Ġ"_ name Ġon Ġ" Ġ+ ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠ ĠPeople Ġ+ Ġ"(" Ġ+ ĠPeople . name Ġ+ Ġ")" Ġrun Ġ{} ĊĠĠĠĠ Ġ* Ġ``` ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġstatement () Ġ= ĠGeneric Statement . Builder ( this ) Ċ } Ċ Ċ /** Ċ Ġ* ĠL ittle Ġclass Ġto Ġmaintain Ġa Ġcache Ġof Ġstatements Ġinside Ġa Ċ Ġ* Ġhash Ġmap . Ġ ĠThis Ġhandles Ġpre paring Ġstatements , Ġand Ġclosing Ċ Ġ* Ġstat ments Ġwhen Ġthey Ġare Ġdone Ġif Ġ[ Statement Builder . do Not Cache ] Ġis Ġset . Ċ Ġ* ĠOtherwise , Ġstatements Ġare Ġcached Ġforever . Ġ ĠIt Ġis Ġexpected Ġthat Ġtypical Ċ Ġ* Ġapplications Ġwill Ġhave Ġa Ġsmall Ġnumber Ġof Ġfrequently - re used Ġstatements , Ċ Ġ* Ġand Ġthat Ġparameters Ġwill Ġbe Ġset Ġas Ġ[ Parameter ] Ġvalues , Ġand Ġnot Ġby Ġchanging Ċ Ġ* Ġthe Ġstatement Ġtext . Ċ Ġ*/ Ċ internal Ġclass ĠStatement Cache < K > Ġ( ĊĠĠĠ Ġval Ġname : ĠString Ċ ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġmap Ġ= Ġmutable Map Of < K , ĠPreparedStatement >() ĊĊĠĠĠ Ġval Ġvalues Ġ= Ġmap . values ĊĊĠĠĠ Ġfun Ġ< T > Ġwith Statement ( builder : ĠStatement Builder < K >, Ġbody : Ġ( PreparedStatement ) Ġ-> ĠT ) Ġ: ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdo Cache Ġ= Ġbuilder . do Cache ĊĠĠĠĠĠĠĠ Ġval Ġstatement Ġ= Ġif Ġ( do Cache ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġbuilder . statement Key ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdb Logger . fin est Ġ{ Ġ" Checking Ġ$ name Ġstatement Ġcache Ġfor Ġ$ key "} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap . compute If Absent ( key , Ġ{ Ġ_ Ġ-> Ġbuilder . prepareStatement () Ġ}) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . prepareStatement () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġbody ( statement ) ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! do Cache ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatement . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠSuper class Ġfor Ġstatements Ġthat Ġcan Ġset Ġtable Ġcolumns : Ġ Ġ[ Update Statement ] Ġand Ċ Ġ* Ġ[ Insert Statement ]. Ġ ĠThis Ġclass Ġmaintains Ġa Ġlist Ġof Ġthe Ġcolumns Ġthat Ġhave Ġbeen Ċ Ġ* Ġset , Ġand Ġa Ġcode Ġblock Ġto Ġset Ġeach Ġvalue . Ċ Ġ*/ Ċ abstract Ġclass ĠColumn Setter Ġ( ĊĠĠĠ Ġprivate Ġval Ġtable : ĠTable Ċ ) Ġ{ ĊĠĠĠ Ġinternal Ġval Ġcolumns Ġ= Ġmutable ListOf < TableColumn <* >>() ĊĠĠĠ Ġinternal Ġval Ġset ters Ġ= Ġmutable ListOf <( Int , ĠPreparedStatement ) Ġ-> ĠUnit >() ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSet Ġthe Ġgiven Ġ[ column ] Ġto Ġ[ value ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoperator Ġfun Ġ< T > Ġset ( column : ĠTable Column < in ĠT >, Ġvalue : ĠT ) Ġ= ĊĠĠĠĠĠĠĠ Ġset From Lambda ( column , Ġ{ i : ĠInt , Ġstmt : ĠPreparedStatement Ġ-> Ġcolumn . adapter . set ( stmt , Ġi , Ġvalue )}) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSet Ġthe Ġcolumn Ġ[ c ], Ġusing Ġa Ġcode Ġblock Ġthat Ġoper ates Ġon Ġa Ġ[ PreparedStatement ] ĊĠĠĠĠ Ġ* Ġusing Ġthe Ġprovided Ġcolumn Ġindex . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġ< T > Ġset From Lambda ( c : ĠTable Column < in ĠT >, Ġsetter : Ġ( Int , ĠPreparedStatement ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( c . table Ġ!= Ġtable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Attempt Ġto Ġset Ġcolumn Ġfrom Ġa Ġdifferent Ġtable ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcolumns . add ( c ) ĊĠĠĠĠĠĠĠ Ġset ters . add ( setter ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSet Ġzero Ġor Ġmore Ġcolumns Ġfrom Ġa ĠJSON - friendly Ġmap Ġof Ġcolumn Ġnames Ġto Ġvalues , ĊĠĠĠĠ Ġ* Ġ[ json Value ]. Ġ ĠThe Ġvalues Ġare Ġset Ġusing Ġ[ PreparedStatement . set Object ], Ġor , Ġif ĊĠĠĠĠ Ġ* Ġnull , Ġ[ PreparedStatement . set Null ]. Ġ ĠSee Ġalso Ġ[ Types . sql Object ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġset FromJson ( json Value : ĠMap < String , ĠAny ?> ) Ġ{ ĊĠĠĠĠĠĠĠ Ġjson Value . forEach Ġ{ Ġkey , Ġvalue Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc Ġ= Ġtable . column By Json Name [ key ] Ġ?: ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Column Ġ$ key Ġnot Ġfound Ġin Ġ${ table . column By Json Name }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset From Lambda ( c ) Ġ{ i : ĠInt , Ġstmt : ĠPreparedStatement Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTypes . sql Object . nullable ( c . adapter . java Sql Types Type OrFail ). set ( stmt , Ġi , Ġvalue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTypes . sql Object . set ( stmt , Ġi , Ġvalue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ /** Ċ Ġ* ĠType Ġfor Ġstatements Ġthat Ġcan Ġset Ġparameters : Ġ Ġ[ Delete Statement ], Ġ[ Update Statement ], Ċ Ġ* Ġ[ Select Query ] Ġand Ġ[ Generic Statement ]. Ġ ĠThis Ġclass Ġmaintains Ġa Ġmap Ġof Ġthe Ġparameters Ċ Ġ* Ġthat Ġhave Ġbeen Ġset Ġto Ġcode Ġblocks Ġthat Ġset Ġthe Ġparameters Ġon Ġa Ġ[ PreparedStatement ], Ġgiven Ċ Ġ* Ġthe Ġvalue Ġindex . Ċ Ġ*/ Ċ interface ĠParameter Setter Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSet Ġthe Ġgiven Ġparameter Ġ[ p ] Ġto Ġ[ value ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoperator Ġfun Ġ< T > Ġset ( p : ĠParameter < in ĠT >, Ġvalue : ĠT ) Ġ= ĊĠĠĠĠĠĠĠ Ġset From Lambda ( p , Ġ{ i : ĠInt , Ġstmt : ĠPreparedStatement Ġ-> Ġp . adapter . set ( stmt , Ġi , Ġvalue )}) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSet Ġthe Ġgiven Ġparameter Ġ[ p ], Ġusing Ġa Ġcode Ġblock Ġthat Ġoper ates Ġon Ġa ĠJDBC Ġ[ PreparedStatement ] ĊĠĠĠĠ Ġ* Ġusing Ġthe Ġprovided Ġvalue Ġindex . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġ< T > Ġset From Lambda ( p : ĠParameter < in ĠT >, Ġsetter : Ġ( Int , ĠPreparedStatement ) Ġ-> ĠUnit ) Ċ } Ċ Ċ /** Ċ Ġ* ĠImplementation Ġof ĠParameter Setter . Ġ ĠSub classes Ġuse Ġdeleg ation Ġfor Ġthis , Ġbecause Ġsome Ċ Ġ* Ġsubclasses Ġalready Ġhave Ġan Ġabstract Ġclass Ġas Ġa Ġsup ertype . Ċ Ġ*/ Ċ internal Ġclass ĠParameter Setter Impl Ġ: ĠParameter Setter Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠMap Ġof Ġ[ Parameter ] Ġinstances Ġto Ġthe Ġcode Ġbody Ġthat Ġsets Ġthe Ġgiven Ġparameter . ĊĠĠĠĠ Ġ* ĠThis Ġis Ġan Ġinternal Ġdata Ġstructure Ġthat Ġshould Ġnot Ġbe Ġaccessed Ġby Ġclient Ġcode . ĊĠĠĠĠ Ġ* ĠKotlin Ġdoes Ġnot Ġallow Ġinterface Ġmembers Ġto Ġbe Ġinternal Ġ: -( ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinternal Ġval Ġparameter Set ters Ġ= Ġmutable Map Of < Parameter <* >, Ġ( Int , ĠPreparedStatement ) Ġ-> ĠUnit >() ĊĊĠĠĠ Ġoverride Ġfun Ġ< T > Ġset From Lambda ( p : ĠParameter < in ĠT >, Ġsetter : Ġ( Int , ĠPreparedStatement ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġparameter Set ters [ p ] Ġ= Ġsetter ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠCheck Ġthat Ġall Ġof Ġthe Ġexpected Ġparameters Ġhave Ġbeen Ġset , Ġand Ġno Ġattempt Ġwas ĊĠĠĠ Ġ// Ġmade Ġto Ġset Ġan Ġunexpected Ġparameter . Ġ ĠThis Ġins ures Ġthat Ġthe Ġparameters Ġin Ġthe ĊĠĠĠ Ġ// Ġbuilt Ġstatement Ġare Ġall Ġset Ġin Ġthe Ġsetter Ġbody Ġpassed Ġto Ġthe Ġbuilder . ĊĠĠĠ Ġinternal Ġfun Ġcheck Parameters ( parameters : ĠList < Parameter <* >>) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( parameter Set ters . keys Ġ!= Ġparameters . toSet ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Extra Ġparameter Ġor Ġparameter Ġnot Ġfound ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠSet Ġthe Ġgiven Ġparameters Ġin Ġthe Ġgiven Ġstatement . Ġ ĠThe Ġvalue Ġindex Ġis Ġoffset ĊĠĠĠ Ġ// Ġby Ġoffset . Ġ ĠThis Ġis Ġneeded Ġfor Ġthe Ġselect Ġstatement , Ġwhere Ġtable Ġcolumns Ġtake Ġthe ĊĠĠĠ Ġ// Ġfirst Ġrange Ġof Ġindex Ġvalues . ĊĠĠĠ Ġinternal Ġfun Ġset Parameters ( parameters : ĠList < Parameter <* >>, Ġstmt : ĠPreparedStatement , Ġoffset : ĠInt Ġ= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġparameters . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġs Ġ= Ġparameter Set ters [ parameters [ i ]] !! ĠĠ Ġ// ĠNull Ġcaught Ġby Ġcheck Parameters ĊĠĠĠĠĠĠĠĠĠĠĠ Ġs ( i + 1 + offset , Ġstmt ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠAbstract Ġsuperclass Ġfor Ġobjects Ġthat Ġhold Ġa Ġ[ ResultSet ]: Ġ Ġ[ Select Query ] Ġand Ġ[ Insert Statement . Result ]. Ċ Ġ* ĠThis Ġclass Ġmaintains Ġa Ġmap Ġthat Ġis Ġused Ġto Ġlook Ġup Ġa Ġdesired Ġ[ Column ], Ġand Ġfind Ġit Ġin Ċ Ġ* Ġa Ġ[ ResultSet ]. Ċ Ġ*/ Ċ abstract Ġclass ĠResults Holder Ġinternal Ġconstructor ( ĊĠĠĠ Ġprotected Ġval Ġcolumns : ĠList < Column <* >>, ĊĠĠĠ Ġprotected Ġval ĠcolumnIndex : ĠMap < Column <* >, ĠInt > Ċ ) Ġ{ ĊĠĠĠ Ġabstract Ġinternal Ġval Ġresult : ĠResultSet ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGet Ġthe Ġvalue Ġfrom Ġcolumn Ġ[ c ], Ġas Ġthe Ġtype Ġdetermined Ġby Ġ[ Column . adapter ]] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoperator Ġfun < T > Ġget ( c : ĠColumn < out ĠT >) Ġ: ĠT Ġ= ĊĠĠĠĠĠĠĠ Ġget From Lambda < T >( c ) Ġ{ Ġr : ĠResultSet , Ġi : ĠInt Ġ-> Ġc . adapter . get ( r , Ġi ) Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGet Ġthe Ġva ule Ġfrom Ġcolumn Ġ[ c ], Ġas Ġreturned Ġby Ġ[ body ], Ġwhich Ġtakes Ġa Ġ[ ResultSet ] Ġand ĊĠĠĠĠ Ġ* Ġa Ġcolumn Ġindex . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun < T > Ġget From Lambda ( c : ĠColumn < out ĠT >, Ġbody : Ġ( ResultSet , ĠInt ) Ġ-> ĠT ) Ġ: ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġi Ġ= ĠcolumnIndex [ c ] ĊĠĠĠĠĠĠĠ Ġif Ġ( i Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException ("$ c Ġnot Ġin Ġresult Ġset ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġbody ( result , Ġi ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGet Ġa ĠJSON - friendly Ġmap Ġof Ġcolumn Ġnames Ġto Ġcolumn Ġvalues . Ġ ĠThe Ġvalues Ġare Ġobtained ĊĠĠĠĠ Ġ* Ġfrom Ġ[ ResultSet . getObject ]. Ġ ĠSee Ġalso Ġ[ Types . sql Object ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Json () Ġ: ĠMap < String , ĠAny ?> Ġ= ĊĠĠĠĠĠĠĠ Ġcolumns . associate By ( Ġ{ Ġc Ġ-> Ġc . json Name Ġ}) Ġ{ Ġc Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget From Lambda Ġ( c ) Ġ{ Ġr , Ġi Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrv Ġ= Ġr . getObject ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( r . was Null ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrv ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġinternal Ġfun Ġclose () Ġ{ ĊĠĠĠĠĠĠĠ Ġresult . close () ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠAbstract Ġsuperclass Ġfor Ġthe Ġbuilder Ġof Ġall Ġstatement Ġtypes . Ċ Ġ* ĠSee Ġalso Ġ[ Statement Builder . do Not Cache ] Ċ Ġ*/ Ċ abstract Ġclass ĠStatement Builder Ġ< K > Ġ{ ĊĠĠĠ Ġinternal Ġvar Ġdo Cache Ġ= Ġtrue ĊĊĠĠĠ Ġabstract Ġinternal Ġval Ġstatement Key Ġ: ĠK ; ĊĊĠĠĠ Ġabstract Ġinternal Ġfun Ġprepare Statement () Ġ: ĠPreparedStatement Ċ } Ċ Ċ /** Ċ Ġ* ĠMethod Ġto Ġset Ġthis Ġbuilder Ġso Ġthat Ġit Ġcreates Ġa Ġstatement Ġthat Ġis Ġnot Ġcached Ċ Ġ* Ġby Ġthe Ġ[ Database ] Ġobject . Ġ ĠBy Ġdefault , Ġstatements Ġare Ġcached . Ċ Ġ*/ Ċ fun < T : ĠStatement Builder <* >> ĠT . do Not Cache () Ġ: ĠT Ġ{ ĊĠĠĠ Ġdo Cache Ġ= Ġfalse ĊĠĠĠ Ġreturn Ġthis Ċ } Ċ Ċ /** Ċ Ġ* ĠSuper class Ġfor Ġthe Ġbuilder Ġof Ġall Ġstatements Ġthat Ġcan Ġhave ĠSQL Ġstrings Ċ Ġ* Ġadded Ġto Ġthe Ġstatement Ġbody . Ġ ĠSee Ġ[ Text Statement Builder . plus ]. Ċ Ġ*/ Ċ abstract Ġclass ĠText Statement Builder < K > Ġ: ĠStatement Builder < K >() Ġ{ ĊĠĠĠ Ġinternal Ġvar Ġqual ify Column Names Ġ: ĠBoolean Ġ= Ġtrue ĊĠĠĠ Ġinternal Ġval Ġtext Builder Ġ= ĠStringBuilder () ĊĠĠĠ Ġinternal Ġval Ġparameters Ġ= Ġmutable ListOf < Parameter <* >>() Ċ } Ċ Ċ // ĠCo variant Ġreturn Ġtypes ĠF TW ! Ċ /** Ċ Ġ* ĠAdd Ġa ĠSQL Ġstring Ġto Ġthe Ġstatement Ġbeing Ġbuilt . Ċ Ġ*/ Ċ operator Ġfun Ġ< T : ĠText Statement Builder <* >> ĠT . plus ( s : ĠString ): ĠT Ġ{ ĊĠĠĠ Ġtext Builder . append ( s ) ĊĠĠĠ Ġreturn Ġthis Ċ } Ċ Ċ /** Ċ Ġ* ĠAdd Ġa Ġparameter Ġto Ġthe Ġstatement Ġbeing Ġbuilt . Ġ ĠThe Ġtext Ġ" ?" Ġis Ġadded , Ġand Ġthe Ċ Ġ* Ġparameter Ġis Ġrecorded Ġso Ġthat Ġthe Ġparameter 's Ġindex Ġcan Ġbe Ġdetermined Ġwhen Ġthe Ċ Ġ* Ġstatement Ġis Ġrun . Ċ Ġ*/ Ċ operator Ġfun Ġ< T : ĠText Statement Builder <* >> ĠT . plus ( p : ĠParameter < *> ): ĠT Ġ{ ĊĠĠĠ Ġparameters . add ( p ) ĊĠĠĠ Ġtext Builder . append (" ?") ĊĠĠĠ Ġreturn Ġthis Ċ } Ċ Ċ /** Ċ Ġ* ĠAdd Ġa Ġcolumn Ġto Ġthe Ġstatement Ġbeing Ġbuilt . Ġ ĠThe Ġcolumn 's Ġstring Ġrepresentation Ġin ĠSQL Ċ Ġ* Ġis Ġadded . Ġ ĠSee Ġ[ Text Statement Builder . qual ify Column Names ] Ċ Ġ*/ Ċ operator Ġfun Ġ< T : ĠText Statement Builder <* >> ĠT . plus ( c : ĠColumn < *> ): ĠT Ġ{ ĊĠĠĠ Ġif Ġ( qual ify Column Names ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtext Builder . append ( c . qualified Name ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġtext Builder . append ( c . sql Name ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġthis Ċ } Ċ Ċ /** Ċ Ġ* ĠAdd Ġa Ġtable Ġto Ġthe Ġstatement Ġbeing Ġbuilt . Ġ ĠThe Ġtable 's Ġname Ġis Ġappended . Ċ Ġ*/ Ċ operator Ġfun Ġ< T : ĠText Statement Builder <* >> ĠT . plus ( t : ĠTable ): ĠT Ġ{ ĊĠĠĠ Ġtext Builder . append ( t . tableName ) ĊĠĠĠ Ġreturn Ġthis Ċ } Ċ Ċ /** Ċ Ġ* ĠDetermine Ġwhether Ġor Ġnot Ġsubsequent Ġcalls Ġto Ġ[ Text Statement Builder . plus ] Ġwith Ġa Ċ Ġ* Ġ[ TableColumn ] Ġargument Ġwill Ġuse Ġthe Ġqualified Ġname Ġ( table _ name . column _ name ), Ġor Ġjust Ċ Ġ* Ġthe Ġcolumn Ġname . Ġ ĠIf Ġthis Ġmethod Ġis Ġnot Ġcalled , Ġthe Ġdefault Ġbehavior Ġis Ġto Ġqual ify Ġnames . Ċ Ġ*/ Ċ fun Ġ< T : ĠText Statement Builder <* >> ĠT . qual ify Column Names ( v : ĠBoolean Ġ= Ġtrue ) Ġ: ĠT Ġ{ ĊĠĠĠ Ġqual ify Column Names Ġ= Ġv ĊĠĠĠ Ġreturn Ġthis Ċ } ĊĊ Ċ internal Ġfun Ġexecute Sql Update ( db : ĠConnection , Ġsql : ĠString ) Ġ{ ĊĠĠĠ Ġdb . createStatement (). use Ġ{ Ġstmt Ġ-> ĊĠĠĠĠĠĠĠ Ġdb Logger . fine ( sql ) ĊĠĠĠĠĠĠĠ Ġstmt . executeUpdate ( sql ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ // ĠDe al Ġwith Ġthe Ġannoying Ġfact Ġthat Ġthe Ġlast Ġitem Ġin Ġa Ġcomma Ġlist Ġdoesn 't Ġhave Ġa Ġcomma Ġafter Ġit Ċ internal Ġfun Ġ< T > Ġappend Comma List ( sb : ĠStringBuilder , Ġvalues : ĠList < T >, Ġval ToString : Ġ( T ) Ġ-> ĠString ) Ġ{ ĊĠĠĠ Ġfor Ġ( i Ġin Ġvalues . indices ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsb . append ( val ToString ( values [ i ])) ĊĠĠĠĠĠĠĠ Ġif Ġ( i Ġ!= Ġvalues . last Index ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append (", Ġ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ