package Ġrun . smt . k test . db Ċ Ċ import Ġcom . types afe . config . Config Ċ import Ġcom . types afe . config . Config Factory Ċ import Ġcom . types afe . config . Config ValueType Ċ import Ġcom . zaxxer . hikari . HikariConfig Ċ import Ġcom . zaxxer . hikari . Hikari DataSource Ċ import Ġrun . smt . k test . config . config Ċ import Ġrun . smt . k test . config . fallback To Ċ import Ġrun . smt . k test . config . get Ċ import Ġjava . time . Duration Ċ import Ġjava . util . concurrent . Concurrent HashMap Ċ import Ġjava . util . concurrent . TimeUnit Ċ import Ġjavax . sql . DataSource Ċ Ċ private Ġval Ġregistered Ds : ĠMutable Map < String , ĠH ikari DataSource > Ġby Ġlazy Ġ{ ĊĠĠĠ ĠConcurrent HashMap < String , ĠH ikari DataSource >(). apply Ġ{ ĊĠĠĠĠĠĠĠ ĠRuntime . get Runtime (). add Shutdown Hook ( Thread ({ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalues . forEach ( Hikari DataSource :: close ) ĊĠĠĠĠĠĠĠ Ġ})) ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun Ġget Ds ( name : ĠString ) ĊĠĠĠ Ġ= Ġregistered Ds . compute If Absent ( name , Ġ:: create Datasource ) Ċ Ċ private Ġfun Ġcreate Datasource ( name : ĠString ): ĠH ikari DataSource Ġ{ ĊĠĠĠ Ġif Ġ(! config . has Path (" db .$ name ")) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" No Ġdatabase Ġfound Ġfor Ġname Ġ\"$ name \" ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġdefault Driver Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġ! config . has Path (" default - driver ") Ġ-> ĠConfig Factory . empty () ĊĠĠĠĠĠĠĠ Ġconfig . getValue (" default - driver "). valueType () Ġ== ĠConfig ValueType . OBJECT Ġ-> Ġconfig [" default - driver "] ĊĠĠĠĠĠĠĠ Ġconfig . getValue (" default - driver "). valueType () Ġ== ĠConfig ValueType . STRING Ġ-> ĠConfig Factory . parse Map ( map Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" driver " Ġto Ġconfig . get < String >(" default - driver ") ĊĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Unsupported ĠJDBC Ġdriver Ġclass : Ġ${ config . getValue (" default - driver "). un wrapped () }" ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġdb Config Ġ= Ġconfig . get < Config >(" db .$ name ") Ġfallback To ĠConfig Factory . parse Map ( map Of ( ĊĠĠĠĠĠĠĠ Ġ" pool - size " Ġto Ġ 5 , ĊĠĠĠĠĠĠĠ Ġ" connection - timeout " Ġto ĠDuration . of Seconds ( 1 5 L ) ĊĠĠĠ Ġ)) Ġfallback To Ġdefault Driver ĊĊĠĠĠ Ġreturn ĠH ikari DataSource ( HikariConfig (). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġdriver ClassName Ġ= Ġdb Config [" driver "] ĊĠĠĠĠĠĠĠ Ġjdbc Url Ġ= Ġdb Config [" url "] ĊĠĠĠĠĠĠĠ Ġusername Ġ= Ġdb Config [" username "] ĊĠĠĠĠĠĠĠ Ġpassword Ġ= Ġdb Config [" password "] ĊĠĠĠĠĠĠĠ Ġmaximum PoolSize Ġ= Ġdb Config [" pool - size "] ĊĠĠĠĠĠĠĠ Ġconnection Timeout Ġ= Ġdb Config . get Duration (" connection - timeout ", ĠTimeUnit . MILLISECONDS ) ĊĠĠĠ Ġ}) Ċ } Ċ Ċ fun ĠString . db (): ĠDataSource Ġ= Ġget Ds ( this ) Ċ Ċ infix Ġfun Ġ< T > ĠString . db ( execute On Db : ĠDataSource . () Ġ-> ĠT ) Ġ= Ġdb (). execute On Db () Ċ