package Ġcom . vl ad sch . kotlin . jdbc Ċ Ċ import Ġcom . vl ad sch . boxed . json . Boxed Js Value Ċ import Ġcom . vl ad sch . boxed . json . Mutable Js Array Ċ import Ġcom . vl ad sch . boxed . json . Mutable Js Object Ċ import Ġorg . joda . time . LocalDateTime Ċ import Ġjava . io .* Ċ import Ġjava . math . BigDecimal Ċ import Ġjava . math . BigInteger Ċ import Ġjava . net . URL Ċ import Ġjava . sql .* Ċ import Ġjava . time .* Ċ import Ġjava . util . Date Ċ import Ġjavax . json . JsonObject Ċ import Ġjavax . json . JsonValue Ċ import Ġjavax . sql . DataSource Ċ Ċ inline Ġfun Ġ< re ified ĠT > ĠPreparedStatement . set Typed Param ( idx : ĠInt , Ġparam : ĠParameter < T >) Ġ{ ĊĠĠĠ Ġif Ġ( param . value Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . set Null ( idx , Ġparam . sql Type ()) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġset Param ( idx , Ġparam . value ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠPreparedStatement . set Param ( idx : ĠInt , Ġv : ĠAny ?) Ġ{ ĊĠĠĠ Ġif Ġ( v Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . set Object ( idx , Ġnull ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( v ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠString Ġ-> Ġthis . setString ( idx , Ġv ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠByte Ġ-> Ġthis . set Byte ( idx , Ġv ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠBoolean Ġ-> Ġthis . set Boolean ( idx , Ġv ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠInt Ġ-> Ġthis . setInt ( idx , Ġv ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠLong Ġ-> Ġthis . set Long ( idx , Ġv ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠShort Ġ-> Ġthis . set Short ( idx , Ġv ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠDouble Ġ-> Ġthis . set Double ( idx , Ġv ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠFloat Ġ-> Ġthis . set Float ( idx , Ġv ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠZ onedDateTime Ġ-> Ġthis . set Timestamp ( idx , ĠTimestamp ( Date . from ( v . to Instant ()). time )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠOffset DateTime Ġ-> Ġthis . set Timestamp ( idx , ĠTimestamp ( Date . from ( v . to Instant ()). time )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠInstant Ġ-> Ġthis . set Timestamp ( idx , ĠTimestamp ( Date . from ( v ). time )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Ġjava . time . LocalDateTime Ġ-> Ġthis . set Timestamp ( idx , ĠTimestamp ( LocalDateTime . parse ( v . toString ()). toDate (). time )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠLocalDate Ġ-> Ġthis . setDate ( idx , Ġjava . sql . Date ( org . joda . time . LocalDate . parse ( v . toString ()). toDate (). time )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠLocal Time Ġ-> Ġthis . setTime ( idx , Ġjava . sql . Time ( org . joda . time . Local Time . parse ( v . toString ()). to DateTime Today (). millis )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Ġorg . joda . time . DateTime Ġ-> Ġthis . set Timestamp ( idx , ĠTimestamp ( v . toDate (). time )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Ġorg . joda . time . LocalDateTime Ġ-> Ġthis . set Timestamp ( idx , ĠTimestamp ( v . toDate (). time )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Ġorg . joda . time . LocalDate Ġ-> Ġthis . setDate ( idx , Ġjava . sql . Date ( v . toDate (). time )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Ġorg . joda . time . Local Time Ġ-> Ġthis . setTime ( idx , Ġjava . sql . Time ( v . to DateTime Today (). millis )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Ġjava . util . Date Ġ-> Ġthis . set Timestamp ( idx , ĠTimestamp ( v . time )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Ġjava . sql . Timestamp Ġ-> Ġthis . set Timestamp ( idx , Ġv ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Ġjava . sql . Time Ġ-> Ġthis . setTime ( idx , Ġv ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Ġjava . sql . Date Ġ-> Ġthis . set Timestamp ( idx , ĠTimestamp ( v . time )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Ġjava . sql . SQL XML Ġ-> Ġthis . set SQL XML ( idx , Ġv ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠByteArray Ġ-> Ġthis . set Bytes ( idx , Ġv ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠInputStream Ġ-> Ġthis . set Binary Stream ( idx , Ġv ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠBigDecimal Ġ-> Ġthis . set BigDecimal ( idx , Ġv ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Ġjava . sql . Array Ġ-> Ġthis . set Array ( idx , Ġv ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠURL Ġ-> Ġthis . set URL ( idx , Ġv ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthis . set Object ( idx , Ġv ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ open Ġclass ĠParameter < out ĠT >( val Ġvalue : ĠT ?, Ġval Ġtype : ĠClass < out ĠT >) Ċ Ċ fun Ġ< T > ĠParameter < T >. sql Type () Ġ= Ġwhen Ġ( type ) Ġ{ ĊĠĠĠ ĠString :: class . java , ĠURL :: class . java Ġ-> ĠTypes . VARCHAR ĊĠĠĠ ĠInt :: class . java , ĠLong :: class . java , ĠShort :: class . java , ĊĠĠĠ ĠByte :: class . java , ĠBigInteger :: class . java Ġ-> ĠTypes . NUMERIC ĊĠĠĠ ĠDouble :: class . java , ĠBigDecimal :: class . java Ġ-> ĠTypes . DOUBLE ĊĠĠĠ ĠFloat :: class . java Ġ-> ĠTypes . FLOAT ĊĠĠĠ Ġjava . sql . Date :: class . java , Ġjava . util . Date :: class . java , ĠZ onedDateTime :: class . java , ĠOffset DateTime :: class . java , ĊĠĠĠ ĠInstant :: class . java , Ġjava . time . LocalDateTime :: class . java , Ġorg . joda . time . DateTime :: class . java , Ġorg . joda . time . LocalDateTime :: class . java , ĊĠĠĠ Ġjava . sql . Timestamp :: class . java Ġ-> ĠTypes . TIMESTAMP ĊĠĠĠ Ġjava . sql . Time :: class . java , ĠLocal Time :: class . java Ġ-> ĠTypes . TIME ĊĠĠĠ ĠLocalDate :: class . java Ġ-> ĠTypes . DATE ĊĠĠĠ Ġelse Ġ-> ĠTypes . OTHER Ċ } Ċ Ċ @ Suppress (" UN CHECK ED _ CAST ") Ċ inline Ġfun Ġ< re ified ĠT > ĠT ?. param (): ĠParameter < T > Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠ Ġis ĠParameter < *> Ġ-> ĠParameter ( this . value Ġas ĠT ?, Ġthis . type Ġas ĠClass < T >) ĊĠĠĠ Ġelse Ġ-> ĠParameter ( this , ĠT :: class . java ) Ċ } Ċ Ċ fun Ġsql Query ( statement : ĠString , Ġvar arg Ġparams : ĠAny ?): ĠSql Query Ġ{ ĊĠĠĠ Ġreturn ĠSql Query ( statement , Ġparams Ġ= Ġparams . toList ()) Ċ } Ċ Ċ fun Ġsql Query ( statement : ĠString , Ġparams : ĠList < Any ?> ): ĠSql Query Ġ{ ĊĠĠĠ Ġreturn ĠSql Query ( statement , Ġparams Ġ= Ġparams ) Ċ } Ċ Ċ fun Ġsql Query ( statement : ĠString , Ġinput Params : ĠMap < String , ĠAny ?> ): ĠSql Query Ġ{ ĊĠĠĠ Ġreturn ĠSql Query ( statement , Ġinput Params Ġ= Ġinput Params ) Ċ } Ċ Ċ fun Ġsql Call ( statement : ĠString , Ġvar arg Ġparams : ĠAny ?): ĠSql Call Ġ{ ĊĠĠĠ Ġreturn ĠSql Call ( statement , Ġparams Ġ= Ġparams . toList ()) Ċ } Ċ Ċ fun Ġsql Call ( statement : ĠString , Ġinput Params : ĠMap < String , ĠAny ? >, Ġoutput Params : ĠMap < String , ĠAny >): ĠSql Call Ġ{ ĊĠĠĠ Ġreturn ĠSql Call ( statement , Ġinput Params Ġ= Ġinput Params , Ġoutput Params Ġ= Ġoutput Params ) Ċ } Ċ Ċ fun Ġsession ( url : ĠString , Ġuser : ĠString , Ġpassword : ĠString ): ĠSession Ġ{ ĊĠĠĠ Ġval Ġconn Ġ= ĠDriver Manager . getConnection ( url , Ġuser , Ġpassword ) ĊĠĠĠ Ġreturn ĠSession Impl ( Connection ( conn )) Ċ } Ċ Ċ fun Ġsession ( dataSource : ĠDataSource ): ĠSession Ġ{ ĊĠĠĠ Ġreturn ĠSession Impl ( Connection ( dataSource . connection )) Ċ } Ċ Ċ /** Ċ Ġ* ĠSession Ġdefault Ġdata Ġsource Ġfactory Ġneeds Ġto Ġbe Ġset Ġfirst Ċ Ġ* Ċ Ġ* Ġ@ return ĠSession Ċ Ġ*/ Ċ fun Ġsession (): ĠSession Ġ{ ĊĠĠĠ Ġval ĠdataSource Ġ= ĠSession Impl . default DataSource ĊĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIllegalStateException (" Session . default DataSource Ġneeds Ġto Ġbe Ġset Ġto Ġgenerate Ġdefault Ġdata Ġsource Ġconnections Ġbefore Ġuse .") ĊĠĠĠ Ġreturn ĠSession Impl ( Connection ( dataSource . invoke (). connection )) Ċ } Ċ Ċ /** Ċ Ġ* ĠDirect Ġuse Ġof Ġsession Ġusing Ċ Ġ* Ċ Ġ* Ġ@ param Ġconsumer ĠFunction 1 < Session , ĠT > Ċ Ġ* Ġ@ return ĠT Ċ Ġ*/ Ċ @ Suppress (" NOTH ING _ TO _ INLINE ") Ċ inline Ġfun Ġ< T > Ġusing Default ( no inline Ġconsumer : Ġ( Session ) Ġ-> ĠT ): ĠT Ġ{ ĊĠĠĠ Ġreturn Ġusing ( session (), Ġconsumer ) Ċ } Ċ Ċ fun Ġ< A Ġ: ĠAuto Closeable , ĠR > Ġusing ( close able : ĠA ?, Ġf : Ġ( A ) Ġ-> ĠR ): ĠR Ġ{ ĊĠĠĠ Ġclose able ?. use Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġf ( close able ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġthrow ĠIllegalStateException (" Closeable Ġresource Ġis Ġunexpected ly Ġnull .") Ċ } Ċ Ċ fun Ġ< V Ġ: ĠAny > Ġput Nullable ( jsonObject : ĠMutable Js Object , Ġname : ĠString , Ġv : ĠV ?, Ġaction : Ġ( V ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ Ġif Ġ( v Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ ĠjsonObject . put ( name , ĠJson Value . NULL ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġaction . invoke ( v ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġadd JsonValue ( jsonObject : ĠMutable Js Object , Ġcolumn : ĠInt , Ġrs : ĠResultSet ) Ġ{ ĊĠĠĠ Ġval ĠmetaData Ġ= Ġrs . metaData ĊĠĠĠ Ġval Ġcolumn Type Ġ= ĠmetaData . getColumn Type ( column ) ĊĠĠĠ Ġval ĠcolumnName Ġ= ĠmetaData . getColumn Label ( column ) ĊĠĠĠ Ġwhen Ġ( column Type ) Ġ{ ĊĠĠĠĠĠĠĠ ĠTypes . BIT , ĠTypes . TIN Y INT , ĠTypes . SMALLINT , ĠTypes . INTEGER Ġ-> Ġput Nullable ( jsonObject , ĠcolumnName , Ġrs . getInt ( column )) Ġ{ ĠjsonObject . put ( columnName , Ġit ) Ġ} ĊĠĠĠĠĠĠĠ ĠTypes . BIG INT Ġ-> Ġput Nullable ( jsonObject , ĠcolumnName , Ġrs . getLong ( column )) Ġ{ ĠjsonObject . put ( columnName , Ġit ) Ġ} ĊĠĠĠĠĠĠĠ ĠTypes . FLOAT Ġ-> Ġput Nullable ( jsonObject , ĠcolumnName , Ġrs . getDouble ( column )) Ġ{ ĠjsonObject . put ( columnName , Ġit ) Ġ} ĊĠĠĠĠĠĠĠ ĠTypes . REAL Ġ-> Ġput Nullable ( jsonObject , ĠcolumnName , Ġrs . getDouble ( column )) Ġ{ ĠjsonObject . put ( columnName , Ġit ) Ġ} ĊĠĠĠĠĠĠĠ ĠTypes . DOUBLE Ġ-> Ġput Nullable ( jsonObject , ĠcolumnName , Ġrs . getDouble ( column )) Ġ{ ĠjsonObject . put ( columnName , Ġit ) Ġ} ĊĠĠĠĠĠĠĠ ĠTypes . NUMERIC Ġ-> Ġput Nullable ( jsonObject , ĠcolumnName , Ġrs . getDouble ( column )) Ġ{ ĠjsonObject . put ( columnName , Ġit ) Ġ} ĊĠĠĠĠĠĠĠ ĠTypes . DECIMAL Ġ-> Ġput Nullable ( jsonObject , ĠcolumnName , Ġrs . get BigDecimal ( column )) Ġ{ ĠjsonObject . put ( columnName , Ġit ) Ġ} ĊĠĠĠĠĠĠĠ ĠTypes . CHAR Ġ-> Ġput Nullable ( jsonObject , ĠcolumnName , Ġrs . getString ( column )) Ġ{ ĠjsonObject . put ( columnName , Ġit ) Ġ} ĊĠĠĠĠĠĠĠ ĠTypes . VARCHAR Ġ-> Ġput Nullable ( jsonObject , ĠcolumnName , Ġrs . getString ( column )) Ġ{ ĠjsonObject . put ( columnName , Ġit ) Ġ} ĊĠĠĠĠĠĠĠ ĠTypes . LONG VARCHAR Ġ-> Ġput Nullable ( jsonObject , ĠcolumnName , Ġrs . getString ( column )) Ġ{ ĠjsonObject . put ( columnName , Ġit ) Ġ} ĊĠĠĠĠĠĠĠ ĠTypes . DATE Ġ-> Ġput Nullable ( jsonObject , ĠcolumnName , Ġrs . getDate ( column )) Ġ{ ĠjsonObject . put ( columnName , Ġit . toString ()) Ġ} ĊĠĠĠĠĠĠĠ ĠTypes . TIME Ġ-> Ġput Nullable ( jsonObject , ĠcolumnName , Ġrs . getTime ( column )) Ġ{ ĠjsonObject . put ( columnName , Ġit . toString ()) Ġ} ĊĠĠĠĠĠĠĠ ĠTypes . TIMESTAMP Ġ-> Ġput Nullable ( jsonObject , ĠcolumnName , Ġrs . getTimestamp ( column )) Ġ{ ĠjsonObject . put ( columnName , Ġit . toString ()) Ġ} ĊĠĠĠĠĠĠĠ ĠTypes . NULL Ġ-> ĠJson Value . NULL ĊĠĠĠĠĠĠĠ ĠTypes . BINARY Ġ-> ĠBox ed Js Value . H AD _ INVALID _ LITERAL ĊĠĠĠĠĠĠĠ ĠTypes . VAR BINARY Ġ-> ĠBox ed Js Value . H AD _ INVALID _ LITERAL ĊĠĠĠĠĠĠĠ ĠTypes . LONG VAR BINARY Ġ-> ĠBox ed Js Value . H AD _ INVALID _ LITERAL ĊĠĠĠĠĠĠĠ ĠTypes . OTHER Ġ-> ĠBox ed Js Value . H AD _ INVALID _ LITERAL ĊĠĠĠĠĠĠĠ ĠTypes . JAVA _ OBJECT Ġ-> ĠBox ed Js Value . H AD _ INVALID _ LITERAL ĊĠĠĠĠĠĠĠ ĠTypes . DIST INCT Ġ-> ĠBox ed Js Value . H AD _ INVALID _ LITERAL ĊĠĠĠĠĠĠĠ ĠTypes . STRUCT Ġ-> ĠBox ed Js Value . H AD _ INVALID _ LITERAL ĊĠĠĠĠĠĠĠ ĠTypes . ARRAY Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġarray Ġ= Ġrs . get Array ( column ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjson Array Ġ= ĠMutable Js Array () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjson Values Ġ= ĠRows ( array . resultSet ). map Ġ{ Ġto JsonObject . invoke ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjson Values . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjson Array . add ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠjsonObject . put ( columnName , Ġjson Array ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠTypes . BLOB Ġ-> ĠBox ed Js Value . H AD _ INVALID _ LITERAL ĊĠĠĠĠĠĠĠ ĠTypes . C LOB Ġ-> ĠBox ed Js Value . H AD _ INVALID _ LITERAL ĊĠĠĠĠĠĠĠ ĠTypes . REF Ġ-> ĠBox ed Js Value . H AD _ INVALID _ LITERAL ĊĠĠĠĠĠĠĠ ĠTypes . DAT AL INK Ġ-> ĠBox ed Js Value . H AD _ INVALID _ LITERAL ĊĠĠĠĠĠĠĠ ĠTypes . BOOLEAN Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġrs . getBoolean ( column ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( rs . was Null ()) ĠJson Value . NULL ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( value ) ĠJson Value . TRUE Ġelse ĠJson Value . FALSE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠTypes . ROW ID Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠTypes . N CHAR Ġ-> Ġput Nullable ( jsonObject , ĠcolumnName , Ġrs . getN String ( column )) Ġ{ ĠjsonObject . put ( columnName , Ġit ) Ġ} ĊĠĠĠĠĠĠĠ ĠTypes . N VARCHAR Ġ-> Ġput Nullable ( jsonObject , ĠcolumnName , Ġrs . getN String ( column )) Ġ{ ĠjsonObject . put ( columnName , Ġit ) Ġ} ĊĠĠĠĠĠĠĠ ĠTypes . LONG N VARCHAR Ġ-> Ġput Nullable ( jsonObject , ĠcolumnName , Ġrs . getN String ( column )) Ġ{ ĠjsonObject . put ( columnName , Ġit ) Ġ} ĊĠĠĠĠĠĠĠ ĠTypes . NC LOB Ġ-> ĠBox ed Js Value . H AD _ INVALID _ LITERAL ĊĠĠĠĠĠĠĠ ĠTypes . SQL XML Ġ-> Ġput Nullable ( jsonObject , ĠcolumnName , Ġrs . get SQL XML ( column )) Ġ{ ĠjsonObject . put ( columnName , Ġit . string ) Ġ} ĊĠĠĠĠĠĠĠ ĠTypes . REF _ CURSOR Ġ-> ĠBox ed Js Value . H AD _ INVALID _ LITERAL ĊĠĠĠĠĠĠĠ ĠTypes . TIME _ WITH _ TIME ZONE Ġ-> Ġput Nullable ( jsonObject , ĠcolumnName , Ġrs . getTime ( column )) Ġ{ ĠjsonObject . put ( columnName , Ġit . toString ()) Ġ} ĊĠĠĠĠĠĠĠ ĠTypes . TIMESTAMP _ WITH _ TIME ZONE Ġ-> Ġput Nullable ( jsonObject , ĠcolumnName , Ġrs . getTimestamp ( column )) Ġ{ ĠjsonObject . put ( columnName , Ġit . toString ()) Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Unknown ĠSQL Ġtype : Ġ$ column Type ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ val Ġto JsonObject : Ġ( Row ) Ġ-> ĠJsonObject Ġ= Ġ{ ĊĠĠĠ Ġval ĠmetaData Ġ= Ġit . rs . metaData ĊĠĠĠ Ġval ĠjsonObject Ġ= ĠMutable Js Object ( metaData . column Count ) ĊĊĠĠĠ Ġfor Ġ( column Ġin Ġ 1 .. metaData . column Count ) Ġ{ ĊĠĠĠĠĠĠĠ Ġadd JsonValue ( jsonObject , Ġcolumn , Ġit . rs ) ĊĠĠĠ Ġ} ĊĊĠĠĠ ĠjsonObject Ċ } Ċ Ċ fun ĠgetResource Files ( resource Class : ĠClass <* >, Ġpath : ĠString , Ġprefix Path : ĠBoolean Ġ= Ġfalse ): ĠList < String > Ġ{ ĊĠĠĠ Ġval Ġfilenames Ġ= ĠArrayList < String >() ĊĊĠĠĠ ĠgetResource AsStream ( resource Class , Ġpath )?. use Ġ{ ĠinputStream Ġ-> ĊĠĠĠĠĠĠĠ ĠBufferedReader ( InputStream Reader ( inputStream )). use Ġ{ Ġbr Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresource Ġ= Ġbr . readLine () Ġ?: Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( prefix Path ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfilenames . add ("$ path /$ resource ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfilenames . add ( resource ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġfilenames Ċ } Ċ Ċ fun ĠStringBuilder . stream Append ( inputStream : ĠInputStream ) Ġ{ ĊĠĠĠ ĠBufferedReader ( InputStream Reader ( inputStream )). use Ġ{ Ġbr Ġ-> ĊĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresource Ġ= Ġbr . readLine () Ġ?: Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . append ( resource ). append ('\ n ') ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠgetResource AsString ( resource Class : ĠClass <* >, Ġpath : ĠString ): ĠString Ġ{ ĊĠĠĠ Ġval Ġsb Ġ= ĠStringBuilder () ĊĊĠĠĠ ĠgetResource AsStream ( resource Class , Ġpath )?. use Ġ{ ĠinputStream Ġ-> ĊĠĠĠĠĠĠĠ Ġsb . stream Append ( inputStream ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġsb . toString () Ċ } Ċ Ċ fun ĠgetFile Content ( file : ĠFile ): ĠString Ġ{ ĊĠĠĠ Ġval ĠinputStream Ġ= ĠFileInputStream ( file ) ĊĠĠĠ Ġval Ġsb Ġ= ĠStringBuilder () ĊĠĠĠ Ġsb . stream Append ( inputStream ) ĊĠĠĠ Ġreturn Ġsb . toString () Ċ } Ċ Ċ fun ĠgetResource AsStream ( resource Class : ĠClass <* >, Ġresource : ĠString ): ĠInputStream ? Ġ{ ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠinputStream Ġ= Ġresource Class . getResource AsStream ( resource ) ĊĠĠĠĠĠĠĠ ĠinputStream . available () ĊĠĠĠĠĠĠĠ Ġreturn ĠinputStream ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġnull Ċ } Ċ Ċ operator Ġfun ĠFile . plus ( name : ĠString ): ĠFile Ġ{ ĊĠĠĠ Ġval Ġpath Ġ= Ġthis . path ĊĠĠĠ Ġval Ġdb Dir Ġ= ĠFile ( if Ġ(! path . endsWith ('/') Ġ&& Ġ! name . startsWith ('/ ')) Ġ"$ path /$ name " Ġelse Ġ"$ path $ name ") ĊĠĠĠ Ġreturn Ġdb Dir Ċ } Ċ Ċ fun ĠFile . ensure Existing Directory ( param Name : ĠString Ġ= Ġ" directory "): ĠFile Ġ{ ĊĠĠĠ Ġif Ġ(! this . exists () Ġ|| Ġ! this . isDirectory ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException ("$ param Name Ġ'${ this . path }' Ġmust Ġpoint Ġto Ġexisting Ġdirectory ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġthis Ċ } Ċ Ċ fun ĠFile . ensure Create Directory ( param Name : ĠString Ġ= Ġ" directory "): ĠFile Ġ{ ĊĠĠĠ Ġif Ġ(! this . exists ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! this . mkdir ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" could Ġnot Ġcreate Ġdirectory Ġ$ param Name Ġ'${ this . path }' Ġmust Ġpoint Ġto Ġexisting Ġdirectory ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ(! this . isDirectory ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException ("$ param Name Ġ'${ this . path }' Ġexists Ġand Ġis Ġnot Ġa Ġdirectory ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġthis Ċ } Ċ Ċ fun ĠString . version Compare ( other : ĠString ): ĠInt Ġ{ ĊĠĠĠ Ġval Ġthese Parts Ġ= Ġthis . remove Prefix (" V "). split ('_ ', Ġlimit Ġ= Ġ 4 ) ĊĠĠĠ Ġval Ġother Parts Ġ= Ġother . remove Prefix (" V "). split ('_ ', Ġlimit Ġ= Ġ 4 ) ĊĊĠĠĠ Ġval Ġi Max Ġ= ĠMath . min ( these Parts . size , Ġother Parts . size ) ĊĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġi Max ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( i Ġ< Ġ 3 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġuse Ġinteger Ġcompare ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġthis Version Ġ= Ġthese Parts [ i ]. toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġother Version Ġ= Ġother Parts [ i ]. toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this Version Ġ!= Ġother Version ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis Version . compareTo ( other Version ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthese Parts [ i ]. compareTo ( other Parts [ i ]) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġthese Parts . size Ġ> Ġi Max Ġ-> Ġ 1 ĊĠĠĠĠĠĠĠ Ġother Parts . size Ġ> Ġi Max Ġ-> Ġ- 1 ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ 0 ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġget Version Directory ( db Dir : ĠFile , Ġdb Version : ĠString , Ġcreate Dir : ĠBoolean ?): ĠFile Ġ{ ĊĠĠĠ Ġif Ġ( create Dir Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdb Dir . ensure Existing Directory (" db Dir ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġdb Version Dir Ġ= Ġdb Dir Ġ+ Ġdb Version ĊĊĠĠĠ Ġif Ġ( create Dir Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdb Version Dir . ensure Create Directory (" db Dir / db Version ") ĊĠĠĠ Ġ} Ġelse Ġif Ġ( create Dir Ġ== Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdb Version Dir . ensure Existing Directory (" db Dir / db Version ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġdb Version Dir Ċ } Ċ Ċ fun ĠString . to Snake Case (): ĠString Ġ{ ĊĠĠĠ Ġvar Ġlast Was Upper Ġ= Ġtrue ĊĠĠĠ Ġval Ġsb Ġ= ĠStringBuilder () ĊĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġlength ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġc Ġ= Ġthis [ i ] ĊĠĠĠĠĠĠĠ Ġif Ġ( c . is UpperCase ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! last Was Upper ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ('_ ') ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ( c . toLowerCase ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Was Upper Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Was Upper Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ( c ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġsb . toString () Ċ } Ċ Ċ fun ĠString ?. extract Leading Digits (): ĠPair < Int ?, ĠString > Ġ{ ĊĠĠĠ Ġif Ġ( this Ġ== Ġnull ) Ġreturn ĠPair ( null , Ġ"") ĊĊĠĠĠ Ġval Ġtext Ġ= Ġthis ĊĠĠĠ Ġvar Ġvalue : ĠInt ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġstart Ġ= Ġ 0 ĊĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġtext . length ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġc Ġ= Ġtext [ i ] ĊĠĠĠĠĠĠĠ Ġif Ġ(! c . is Digit ()) Ġbreak ĊĠĠĠĠĠĠĠ Ġval Ġdigit Ġ= Ġc Ġ- Ġ' 0 ' ĊĠĠĠĠĠĠĠ Ġvalue Ġ= Ġ( value Ġ?: Ġ 0 ) Ġ* Ġ 1 0 Ġ+ Ġdigit ĊĠĠĠĠĠĠĠ Ġstart Ġ= Ġi Ġ+ Ġ 1 ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn ĠPair ( value , Ġtext . substring ( start )) Ċ } Ċ Ċ fun Ġget Extra Sample Files ( resource Class : ĠClass < *> ): ĠList < String > Ġ{ ĊĠĠĠ Ġreturn ĠgetResource Files ( resource Class , Ġ"/ db / templates ", Ġtrue ) Ċ } ĊĊ