package Ġcom . se an sh ub in . cond orc et . backend . generic db Ċ Ċ import Ġcom . mysql . cj . jdbc . Client PreparedStatement Ċ import Ġjava . sql .* Ċ import Ġjava . time . Instant Ċ Ċ class ĠConnection Wrapper ( ĊĠĠĠ Ġprivate Ġval Ġconnection : ĠConnection , ĊĠĠĠ Ġprivate Ġval Ġsql Event : Ġ( String ) Ġ-> ĠUnit Ċ ) Ġ: ĠAuto Closeable Ġ{ ĊĠĠĠ Ġfun Ġ< T > Ġquery ( name : ĠString , Ġcode : ĠString , Ġvar arg Ġparameters : ĠAny ?, Ġf : Ġ( ResultSet ) Ġ-> ĠT ): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstatement Ġ= Ġconnection . prepareStatement ( code ) Ġas ĠClient PreparedStatement ĊĠĠĠĠĠĠĠ Ġupdate Parameters ( parameters , Ġstatement ) ĊĠĠĠĠĠĠĠ Ġreturn Ġstatement . use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsql Event ( statement . as Sql ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġf ( executeQuery ( name , Ġcode , Ġstatement )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< T > Ġquery List ( name : ĠString , Ġcode : ĠString , Ġvar arg Ġparameters : ĠAny ?, Ġf : Ġ( ResultSet ) Ġ-> ĠT ): ĠList < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġmutable ListOf < T >() ĊĠĠĠĠĠĠĠ Ġval Ġstatement Ġ= Ġconnection . prepareStatement ( code ) Ġas ĠClient PreparedStatement ĊĠĠĠĠĠĠĠ Ġupdate Parameters ( parameters , Ġstatement ) ĊĠĠĠĠĠĠĠ Ġstatement . use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠresultSet Ġ= Ġexecute Query ( name , Ġcode , Ġstatement ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( resultSet . next ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist . add ( f ( resultSet )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġlist ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġquery Exists ( name : ĠString , Ġcode : ĠString , Ġvar arg Ġparameters : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstatement Ġ= Ġconnection . prepareStatement ( code ) Ġas ĠClient PreparedStatement ĊĠĠĠĠĠĠĠ Ġupdate Parameters ( parameters , Ġstatement ) ĊĠĠĠĠĠĠĠ Ġstatement . use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠresultSet Ġ= Ġexecute Query ( name , Ġcode , Ġstatement ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠresultSet . next () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġquery Generic Table ( name : ĠString , Ġcode : ĠString , Ġvar arg Ġparameters : ĠAny ?): ĠGeneric Table Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstatement Ġ= Ġconnection . prepareStatement ( code ) Ġas ĠClient PreparedStatement ĊĠĠĠĠĠĠĠ Ġsql Event ( statement . as Sql ()) ĊĠĠĠĠĠĠĠ Ġupdate Parameters ( parameters , Ġstatement ) ĊĠĠĠĠĠĠĠ Ġreturn Ġstatement . use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠresultSet Ġ= Ġexecute Query ( name , Ġcode , Ġstatement ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġiterator Ġ= ĠResultSet Iterator . consume ( resultSet ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcolumn Names Ġ= Ġiterator . column Names ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrows Ġ= Ġiterator . consume Remaining ToTable () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGeneric Table ( code , Ġcolumn Names , Ġrows ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< T > Ġquery Exactly One Row ( name : ĠString , Ġcode : ĠString , Ġvar arg Ġparameters : ĠAny ?, Ġf : Ġ( ResultSet ) Ġ-> ĠT ): ĠT Ġ= ĊĠĠĠĠĠĠĠ Ġquery ( name , Ġcode , Ġ* parameters ) Ġ{ ĠresultSet Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( resultSet . next ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġf ( resultSet ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( resultSet . next ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" No Ġmore Ġthan Ġ 1 Ġrow Ġexpected Ġfor Ġ'$ name '\ n $ code ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" Exactly Ġ 1 Ġrow Ġexpected Ġfor Ġ'$ name ', Ġgot Ġnone \ n $ code ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< T > Ġquery Zero Or One Row ( name : ĠString , Ġcode : ĠString , Ġvar arg Ġparameters : ĠAny ?, Ġf : Ġ( ResultSet ) Ġ-> ĠT ): ĠT ? Ġ= ĊĠĠĠĠĠĠĠ Ġquery ( name , Ġcode , Ġ* parameters ) Ġ{ ĠresultSet Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( resultSet . next ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġf ( resultSet ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( resultSet . next ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" No Ġmore Ġthan Ġ 1 Ġrow Ġexpected Ġfor Ġ'$ name '\ n $ code ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġquery Exactly One Int ( name : ĠString , Ġcode : ĠString , Ġvar arg Ġparameters : ĠAny ?): ĠInt Ġ= ĊĠĠĠĠĠĠĠ Ġquery Exactly One Row ( name , Ġcode , Ġ* parameters ) Ġ{ Ġcreate Int ( it ) Ġ} ĊĊĠĠĠ Ġfun Ġquery Zero Or One Int ( name : ĠString , Ġcode : ĠString , Ġvar arg Ġparameters : ĠAny ?): ĠInt ? Ġ= ĊĠĠĠĠĠĠĠ Ġquery Zero Or One Row ( name , Ġcode , Ġ* parameters ) Ġ{ Ġcreate Int ( it ) Ġ} ĊĊĠĠĠ Ġfun Ġupdate ( name : ĠString , Ġcode : ĠString , Ġvar arg Ġparameters : ĠAny ?): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstatement Ġ= Ġconnection . prepareStatement ( code ) Ġas ĠClient PreparedStatement ĊĠĠĠĠĠĠĠ Ġupdate Parameters ( parameters , Ġstatement ) ĊĠĠĠĠĠĠĠ Ġreturn Ġstatement . use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsql Event ( statement . as Sql ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Update ( name , Ġcode , Ġstatement ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġtable Names ( schema : ĠSchema ): ĠList < String > Ġ= ĊĠĠĠĠĠĠĠ Ġschema . tables . map Ġ{ Ġit . name Ġ} ĊĊĠĠĠ Ġfun Ġtable Data ( schema : ĠSchema , Ġname : ĠString ): ĠGeneric Table Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtable Ġ= Ġschema . tables . find Ġ{ Ġit . name Ġ== Ġname Ġ} !! ĊĠĠĠĠĠĠĠ Ġreturn Ġquery Generic Table ( name , Ġtable . to Select All Statement ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġclose () Ġ{ ĊĠĠĠĠĠĠĠ Ġconnection . close () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Parameters ( parameters : ĠArray < out ĠAny ? >, Ġstatement : ĠClient PreparedStatement ) Ġ{ ĊĠĠĠĠĠĠĠ Ġparameters . toList (). forEach Indexed Ġ{ Ġindex , Ġany Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġposition Ġ= Ġindex Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( any Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatement . set Object ( position , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġwhen Ġ( any ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠString Ġ-> Ġstatement . setString ( position , Ġany ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠBoolean Ġ-> Ġstatement . set Boolean ( position , Ġany ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠInt Ġ-> Ġstatement . setInt ( position , Ġany ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠInstant Ġ-> Ġstatement . set Timestamp ( position , ĠTimestamp . from ( any )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠUnsupportedOperationException (" Unsupported Ġtype Ġ${ any . java Class . simple Name }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġexecute Update ( name : ĠString , Ġcode : ĠString , Ġstatement : ĠPreparedStatement ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġstatement . executeUpdate () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠSQLException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠSQLException ("$ name \ n $ code \ n ${ ex . message }", Ġex ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġexecute Query ( name : ĠString , Ġcode : ĠString , Ġstatement : ĠPreparedStatement ): ĠResultSet Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġstatement . executeQuery () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠSQLException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠSQLException ("$ name \ n $ code \ n ${ ex . message }", Ġex ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġcreate Int ( resultSet : ĠResultSet ): ĠInt Ġ= ĠresultSet . getInt ( 1 ) ĊĠĠĠ Ġ} Ċ } Ċ