package Ġcom . example . repository Ċ Ċ import Ġcom . example . db . tables . Note Table Ċ import Ġcom . example . db . tables . User Table Ċ import Ġcom . zaxxer . hikari . HikariConfig Ċ import Ġcom . zaxxer . hikari . Hikari DataSource Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . with Context Ċ import Ġorg . jetbrains . ex posed . sql . Database Ċ import Ġorg . jetbrains . ex posed . sql . Schema Utils Ċ import Ġorg . jetbrains . ex posed . sql . transactions . transaction Ċ import Ġjava . net . URI Ċ Ċ object ĠDatabase Factory Ġ{ ĊĊĠĠĠ Ġfun Ġinit (){ ĊĠĠĠĠĠ ĠDatabase . connect ( hikari ()) ĊĊĠĠĠĠĠ Ġtransaction Ġ{ ĊĠĠĠĠĠĠĠĠĠ ĠSchema Utils . create ( User Table ) ĊĠĠĠĠĠĠĠĠĠ ĠSchema Utils . create ( Note Table ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġh ikari (): ĠH ikari DataSource Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= ĠH ikariConfig () ĊĠĠĠĠĠĠĠ Ġval Ġuri = ĠURI ( System . getenv (" DATABASE _ URL ")) ĊĠĠĠĠĠĠĠ Ġval Ġusername = Ġuri . userInfo . split (": "). to Typed Array ()[ 0 ] ĊĠĠĠĠĠĠĠ Ġval Ġpassword = Ġuri . userInfo . split (": "). to Typed Array ()[ 1 ] ĊĠĠĠĠĠĠĠ Ġconfig . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdriver ClassName Ġ= ĠSystem . getenv (" JDBC _ DRIVER ") Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġjdbc Url Ġ= ĠSystem . getenv (" DATABASE _ URL ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjdbc Url = Ġ" jdbc : postgresql ://" Ġ+ Ġuri . host Ġ+ Ġ":" Ġ+ Ġuri . port Ġ+ Ġuri . path Ġ+ Ġ"? ssl mode = require " Ġ+ Ġ"& user =$ username & password =$ password " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmaximum PoolSize Ġ= Ġ 4 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Auto Commit Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction Isolation Ġ= Ġ" TRANSACTION _ REPEAT ABLE _ READ " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalidate () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠH ikari DataSource ( config ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġ< T > Ġdb Query ( block : Ġ() Ġ-> ĠT ): ĠT Ġ= ĊĠĠĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . IO ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction Ġ{ Ġblock () Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ} Ċ }