package Ġorg . b aby fish . kim mer . sql . common Ċ Ċ import Ġio . r 2 dbc . spi . Connection Factories Ċ import Ġio . r 2 dbc . spi . ConnectionFactory Ċ import Ġio . r 2 dbc . spi . Result Ċ import Ġkotlinx . coroutines . reactive . await First Ċ import Ġkotlinx . coroutines . reactive . await First OrNull Ċ import Ġkotlinx . coroutines . reactive . await Single Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġorg . b aby fish . kim mer . sql . Entity Ċ import Ġorg . b aby fish . kim mer . sql . Sql Client Ċ import Ġorg . b aby fish . kim mer . sql . ast . concat Ċ import Ġorg . b aby fish . kim mer . sql . model .* Ċ import Ġorg . b aby fish . kim mer . sql . ast . value Ċ import Ġorg . b aby fish . kim mer . sql . meta . Scalar Provider Ċ import Ġorg . b aby fish . kim mer . sql . meta . config .* Ċ import Ġorg . b aby fish . kim mer . sql . meta . enum Provider By String Ċ import Ġorg . b aby fish . kim mer . sql . model . Author Ċ import Ġorg . b aby fish . kim mer . sql . model . Book Ċ import Ġorg . b aby fish . kim mer . sql . model . Book Store Ċ import Ġorg . b aby fish . kim mer . sql . model . Gender Ċ import Ġorg . b aby fish . kim mer . sql . runtime .* Ċ import Ġorg . b aby fish . kim mer . sql . spi . create Sql Client Ċ import Ġorg . junit . BeforeClass Ċ import Ġorg . springframework . jdbc . datasource . Simple Driver DataSource Ċ import Ġjava . io . InputStream Reader Ċ import Ġjava . sql . PreparedStatement Ċ import Ġjava . util .* Ċ import Ġjavax . sql . DataSource Ċ import Ġkotlin . reflect . K Class Ċ import Ġkotlin . test . expect Ċ import Ġkotlin . test . fail Ċ Ċ abstract Ġclass ĠAbstract Test Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġdynamic Dialect Ġ= ĠDynamic Dialect () ĊĊĠĠĠ Ġprivate Ġval Ġ_ executions Ġ= Ġmutable ListOf < Execution >() ĊĊĠĠĠ Ġprivate Ġvar Ġauto Id Map Ġ= Ġmutable Map Of < K Class < out ĠEntity <* >>, ĠAuto Ids >() ĊĊĠĠĠ Ġprotected Ġval Ġsql Client : ĠSql Client Ġ= ĊĠĠĠĠĠĠĠ Ġsql Client ( On Delete Action . NONE ) ĊĊĠĠĠ Ġprotected Ġfun Ġsql Client ( ĊĠĠĠĠĠĠĠ Ġbook Store On Delete : ĠOn Delete Action , ĊĠĠĠĠĠĠĠ Ġvar arg Ġscalar Providers : ĠScalar Provider < *, Ġ*> ĊĠĠĠ Ġ): ĠSql Client Ġ= ĊĠĠĠĠĠĠĠ Ġcreate Sql Client ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdynamic Dialect , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjdbc Executor Ġ= ĠJdbc Executor Impl (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġr 2 dbc Executor Ġ= ĠR 2 dbc Executor Impl () ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġentity ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBook Store :: class , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Generator Ġ= ĠUserId Generator Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġauto Id ( Book Store :: class ) Ġas ĠUUID ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinverse Prop ( Book Store :: books , ĠBook :: store ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġentity ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBook :: class , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Generator Ġ= ĠUserId Generator Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġauto Id ( Book :: class ) Ġas ĠUUID ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprop ( Book :: store , ĠColumn ( onDelete Ġ= Ġbook Store On Delete )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprop ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBook :: authors , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMiddle Table ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtableName Ġ= Ġ" BOOK _ AUTHOR _ MAPPING ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjoin ColumnName Ġ= Ġ" BOOK _ ID ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Join ColumnName Ġ= Ġ" AUTHOR _ ID " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinverse Prop ( Book :: chapter s , ĠChapter :: book ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġentity ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAuthor :: class , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Generator Ġ= ĠUserId Generator Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġauto Id ( Author :: class ) Ġas ĠUUID ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinverse Prop ( Author :: books , ĠBook :: authors ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprop ( Author :: fullName , ĠFormula . of < Author , ĠUUID , ĠString > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconcat ( firstName , Ġvalue (" Ġ"), ĠlastName ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġentity ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠChapter :: class , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Generator Ġ= ĠSequence Id Generator (" chapter _ id _ seq ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprop ( Chapter :: book ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġentity ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAnno uncement :: class , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Generator Ġ= ĠIdentity Id Generator ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprop ( Anno uncement :: store ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġscalar Provider ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenum Provider By String ( Gender :: class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap ( Gender . M ALE , Ġ" M ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap ( Gender . F EM ALE , Ġ" F ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscalar Providers . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscalar Provider ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġusing ( dialect : ĠD ialect , Ġblock : Ġ() Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdynamic Dialect . using ( dialect , Ġblock ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġval Ġexecution s : ĠList < Execution > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ executions ĊĊĠĠĠ Ġprotected Ġfun Ġclear Execution s () Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ executions . clear () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġauto Ids ( type : ĠK Class < out ĠEntity <* >>, Ġvar arg Ġids : ĠAny ) Ġ{ ĊĠĠĠĠĠĠĠ Ġauto Id Map [ type ] Ġ= ĠAuto Ids ( ids . toList ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġauto Id ( type : ĠK Class < out ĠEntity <* >> ): ĠAny Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġauto Ids Ġ= Ġauto Id Map [ type ] Ġ?: Ġerror (" No Ġprepared Ġauto Ġids Ġfor Ġ${ type . qualified Name }") ĊĠĠĠĠĠĠĠ Ġreturn Ġauto Ids . get () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġreset Auto Ids () Ġ{ ĊĠĠĠĠĠĠĠ Ġauto Id Map . values . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . reset () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠJdbc Executor Impl : ĠJdbc Executor Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġ< R > Ġexecute ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcon : Ġjava . sql . Connection , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsql : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvariables : ĠCollection < Any >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblock : ĠPreparedStatement . () Ġ-> ĠR ĊĠĠĠĠĠĠĠ Ġ): ĠR Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġindex Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġformatted Sql Ġ= Ġsql . replace ( JDBC _ PARAMETER _ REGEX ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ ${ ++ index }" Ġ// Ġreplace Ġjdbc Ġ' ?' Ġto Ġ'$ 1 ', Ġ'$ 2 ', Ġ..., Ġ'$ N ' ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ executions Ġ+= ĠExecution ( formatted Sql , Ġvariables . toList ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠDefault Jdbc Executor . execute ( con , Ġsql , Ġvariables , Ġblock ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠR 2 dbc Executor Impl : ĠR 2 dbc Executor Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġsuspend Ġfun Ġ< R > Ġexecute ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcon : Ġio . r 2 dbc . spi . Connection , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsql : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvariables : ĠCollection < Any >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblock : Ġsuspend ĠResult . () Ġ-> ĠR ĊĠĠĠĠĠĠĠ Ġ): ĠR Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġindex Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġformatted Sql Ġ= Ġsql . replace ( JDBC _ PARAMETER _ REGEX ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ ${ ++ index }" Ġ// Ġreplace Ġjdbc Ġ' ?' Ġto Ġ'$ 1 ', Ġ'$ 2 ', Ġ..., Ġ'$ N ' ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ executions Ġ+= ĠExecution ( formatted Sql , Ġvariables . toList ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠDefault R 2 dbc Executor . execute ( con , Ġsql , Ġvariables , Ġblock ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠAuto Ids ( ĊĠĠĠĠĠĠĠ Ġval Ġids : ĠList < Any > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġindex Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġfun Ġget (): ĠAny Ġ= Ġids [ index ++] ĊĊĠĠĠĠĠĠĠ Ġfun Ġreset () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġindex Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġclass ĠExecution ( ĊĠĠĠĠĠĠĠ Ġval Ġsql : ĠString , ĊĠĠĠĠĠĠĠ Ġval Ġvariables : ĠList < Any > ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġenum Ġclass ĠTransaction Mode Ġ{ ĊĠĠĠĠĠĠĠ ĠNONE , ĊĠĠĠĠĠĠĠ ĠR OL L BACK ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġenum Ġclass ĠTest Way ( ĊĠĠĠĠĠĠĠ Ġval Ġfor Jdbc : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġval Ġfor R 2 dbc : ĠBoolean ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ ĠJDBC ( true , Ġfalse ), ĊĠĠĠĠĠĠĠ ĠR 2 DBC ( false , Ġtrue ), ĊĠĠĠĠĠĠĠ ĠBOT H ( true , Ġtrue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠJDBC _ URL Ġ= Ġ" jdbc : h 2 :~/ test _ db " ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠR 2 DBC _ URL Ġ= Ġ" r 2 dbc : h 2 : mem :/// r 2 dbc _ db " ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠJDBC _ PARAMETER _ REGEX Ġ= ĠRegex ("\\ ?") ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠdataSource : ĠDataSource ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġconnection Factory : ĠConnection Factory ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġprotected Ġfun Ġjdbc ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction Mode : ĠTransaction Mode Ġ= ĠTransaction Mode . NONE , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠdataSource : ĠDataSource ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblock : Ġjava . sql . Connection . () Ġ-> ĠUnit ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( dataSource Ġ?: Ġthis . dataSource ). connection . use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( transaction Mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTransaction Mode . NONE Ġ-> Ġit . block () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTransaction Mode . ROLL BACK Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . auto Commit Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . block () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . rollback () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġprotected Ġsuspend Ġfun Ġr 2 dbc ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction Mode : ĠTransaction Mode Ġ= ĠTransaction Mode . NONE , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnection Factory : ĠConnection Factory ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblock : Ġsuspend Ġio . r 2 dbc . spi . Connection . () Ġ-> ĠUnit ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcon Ġ= Ġ( connection Factory Ġ?: Ġthis . connection Factory ). create (). await Single () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( transaction Mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTransaction Mode . NONE Ġ-> Ġblock ( con ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTransaction Mode . ROLL BACK Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcon . beginTransaction (). await First OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock ( con ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcon . rollback Transaction (). await First OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcon . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġ@ BeforeClass ĊĠĠĠĠĠĠĠ Ġfun Ġinit Database () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjdbc Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinit Jdbc Database ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġr 2 dbc Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinit R 2 dbc Database ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġinit Jdbc Database ( con : Ġjava . sql . Connection ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAbstract Test :: class . java . class Loader . getResource AsStream (" Test Database . sql "). use Ġ{ Ġstream Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtext Ġ= ĠInputStreamReader ( stream ). read Text () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. split ("; ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . isNotBlank () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcon . createStatement (). executeUpdate ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġprivate Ġsuspend Ġfun Ġinit R 2 dbc Database ( con : Ġio . r 2 dbc . spi . Connection ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAbstract Test :: class . java . class Loader . getResource AsStream (" Test Database . sql "). use Ġ{ Ġstream Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtext Ġ= ĠInputStreamReader ( stream Ġ?: Ġerror (" Cannot Ġload Ġembedded ĠSQL ")). read Text () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. split ("; ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . isNotBlank () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcon . createStatement ( it ). execute (). await First () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġprotected Ġfun Ġthrowable ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype : ĠK Class < out ĠThrowable >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrowable Message : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblock : Ġ() Ġ-> ĠUnit ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfail (" Exception Ġexpected ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpect ( type ) Ġ{ Ġex :: class Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpect ( throwable Message . replace ("\ r ", Ġ""). replace ("\ n ", Ġ"")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġex . message ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠdataSource Ġ= ĠSimple Driver DataSource ( org . h 2 . Driver (), ĠJDBC _ URL ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnection Factory Ġ= ĠConnection Factories . get ( R 2 DBC _ URL ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }