package Ġk dbc Ċ Ċ import Ġjava . io . InputStream Ċ import Ġjava . math . BigDecimal Ċ import Ġjava . sql . Connection Ċ import Ġjava . sql . PreparedStatement Ċ import Ġjava . sql . SQLException Ċ import Ġjava . time . LocalDate Ċ import Ġjava . time . LocalDateTime Ċ import Ġjava . time . Local Time Ċ import Ġjava . util .* Ċ import Ġjavax . sql . DataSource Ċ import Ġkotlin . reflect . K Class Ċ Ċ fun ĠConnection . execute ( sql : ĠString ) Ġ= Ġprepare Statement ( sql ). execute () Ċ fun ĠDataSource . execute ( sql : ĠString , Ġautoc lose : ĠBoolean Ġ= Ġtrue ): ĠBoolean Ġ{ ĊĠĠĠ Ġval Ġc Ġ= Ġconnection ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġc . execute ( sql ) ĊĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( autoc lose ) Ġc . close () ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠDataSource . select ( sql : ĠString , Ġvar arg Ġv : ĠAny ) Ġ= Ġconnection . prepareStatement ( sql ). let Ġ{ ĊĠĠĠ Ġit . process Parameters ( v ) ĊĠĠĠ Ġit . executeQuery () Ċ } Ċ Ċ fun ĠPreparedStatement . process Parameters ( v : ĠArray < out ĠAny >) Ġ= Ġv . forEach Indexed Ġ{ Ġpos , Ġv Ġ-> ĊĠĠĠ Ġwhen Ġ( v ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠUUID Ġ-> Ġset Object ( pos + 1 , Ġv ) ĊĠĠĠĠĠĠĠ Ġis ĠInt Ġ-> Ġset Int ( pos + 1 , Ġv ) ĊĠĠĠĠĠĠĠ Ġis ĠLong Ġ-> Ġset Long ( pos + 1 , Ġv ) ĊĠĠĠĠĠĠĠ Ġis ĠFloat Ġ-> Ġset Float ( pos + 1 , Ġv ) ĊĠĠĠĠĠĠĠ Ġis ĠDouble Ġ-> Ġset Double ( pos + 1 , Ġv ) ĊĠĠĠĠĠĠĠ Ġis ĠString Ġ-> Ġset String ( pos + 1 , Ġv ) ĊĠĠĠĠĠĠĠ Ġis ĠBigDecimal Ġ-> Ġset BigDecimal ( pos + 1 , Ġv ) ĊĠĠĠĠĠĠĠ Ġis ĠBoolean Ġ-> Ġset Boolean ( pos + 1 , Ġv ) ĊĠĠĠĠĠĠĠ Ġis ĠLocal Time Ġ-> Ġset Time ( pos + 1 , Ġjava . sql . Time . valueOf ( v )) ĊĠĠĠĠĠĠĠ Ġis ĠLocalDate Ġ-> Ġset Date ( pos + 1 , Ġjava . sql . Date . valueOf ( v )) ĊĠĠĠĠĠĠĠ Ġis ĠLocalDateTime Ġ-> Ġset Timestamp ( pos + 1 , Ġjava . sql . Timestamp . valueOf ( v )) ĊĠĠĠĠĠĠĠ Ġis ĠInputStream Ġ-> Ġset Binary Stream ( pos + 1 , Ġv ) ĊĠĠĠĠĠĠĠ Ġis ĠEnum < *> Ġ-> Ġset Object ( pos + 1 , Ġv ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠConnection Factory Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġinternal Ġval Ġtransaction Context Ġ= ĠThread Local < Transaction Context >() ĊĠĠĠĠĠĠĠ Ġinternal Ġval Ġis Transaction Active : ĠBoolean Ġget () Ġ= Ġtransaction Context . get () Ġ!= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġvar Ġfactory Fn : Ġ( Query <* >) Ġ-> ĠConnection Ġ= Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠSQLException (" No Ġdefault Ġdata Ġsource Ġis Ġconfigured . ĠUse ĠQuery . db () Ġor Ġconfigure Ġ` K DBC . dataSource Provider .\ n ${ it . describe () }") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġborrow ( query : ĠQuery < *> ): ĠConnection Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġactive Transaction Ġ= Ġtransaction Context . get () ĊĠĠĠĠĠĠĠ Ġif Ġ( active Transaction ?. connection Ġ!= Ġnull ) Ġreturn Ġactive Transaction . connection !! ĊĠĠĠĠĠĠĠ Ġval Ġconnection Ġ= Ġfactory Fn ( query ) ĊĠĠĠĠĠĠĠ Ġactive Transaction ?. track Connection ( connection ) ĊĠĠĠĠĠĠĠ Ġreturn Ġconnection ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġ< T Ġ: ĠTable > ĠConnection . createTable ( table Class : ĠK Class < T >, Ġskip IfExists : ĠBoolean Ġ= Ġfalse , Ġdrop IfExists : ĠBoolean Ġ= Ġfalse ) Ġ= ĊĠĠĠĠĠĠĠ Ġexecute ( table Class . java . newInstance (). ddl ( skip IfExists , Ġdrop IfExists )) ĊĊ