package Ġpro . sch mid . s bb t sp . db Ċ Ċ import Ġcom . zaxxer . hikari . HikariConfig Ċ import Ġcom . zaxxer . hikari . Hikari DataSource Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġorg . jetbrains . ex posed . dao . id . Entity ID Ċ import Ġorg . jetbrains . ex posed . sql .* Ċ import Ġorg . jetbrains . ex posed . sql . Database Ċ import Ġorg . jetbrains . ex posed . sql . transactions . experimental . sus pended Transaction Async Ċ import Ġorg . jetbrains . ex posed . sql . transactions . transaction Ċ import Ġpro . sch mid . s bb t sp . db . Connections . from Station Ċ import Ġpro . sch mid . s bb t sp . db . Connections . median Duration Ċ import Ġpro . sch mid . s bb t sp . db . Connections . min Duration Ċ import Ġpro . sch mid . s bb t sp . db . Connections . stations List Ċ import Ġpro . sch mid . s bb t sp . db . Connections . to Station Ċ import Ġpro . sch mid . s bb t sp . db . St ations . latitude Ċ import Ġpro . sch mid . s bb t sp . db . St ations . longitude Ċ import Ġpro . sch mid . s bb t sp . db . St ations . name Ċ import Ġpro . sch mid . s bb t sp . db . St ations . type Ċ import Ġpro . sch mid . s bb t sp . repositories . Connection Ċ import Ġpro . sch mid . s bb t sp . repositories . Station Ċ import Ġjava . net . URI Ċ import Ġjava . time . Instant Ċ Ċ class ĠDatabase Ġ{ ĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdb Uri Ġ= ĠURI ( System . getenv (" DATABASE _ URL ")) ĊĊĠĠĠĠĠĠĠ Ġval Ġsplit Ġ= Ġdb Uri . userInfo . split (": ") ĊĠĠĠĠĠĠĠ Ġval Ġusername : ĠString Ġ= Ġsplit [ 0 ] ĊĠĠĠĠĠĠĠ Ġval Ġpassword : ĠString Ġ= Ġsplit [ 1 ] ĊĊĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= ĠH ikariConfig (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdriver ClassName Ġ= Ġ" org . postgresql . Driver " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjdbc Url Ġ= Ġ" jdbc : postgresql ://${ db Uri . host }:${ db Uri . port }${ db Uri . path }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . username Ġ= Ġusername ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . password Ġ= Ġpassword ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠHeroku ĠPostgres Ġfree Ġallows Ġ 2 0 Ġconnections . ĠKeep Ġone Ġto Ġconnect Ġfor Ġdebugging ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmaximum PoolSize Ġ= Ġ 1 9 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalidate () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval ĠdataSource Ġ= ĠH ikari DataSource ( config ) ĊĊĠĠĠĠĠĠĠ ĠDatabase . connect ( dataSource ) ĊĊĠĠĠĠĠĠĠ Ġtransaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Logger ( Std Out Sql Logger ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSchema Utils . create Missing Tables And Columns ( Connections , ĠSt ations ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġget Connection ( from : ĠString , Ġto : ĠString ): ĠConnection ? Ġ= Ġdb query Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrow Ġ= ĠConnection s . select Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Station Ġeq Ġfrom Ġand Ġ( to Station Ġeq Ġto ) ĊĠĠĠĠĠĠĠ Ġ}. first OrNull () ĊĊĠĠĠĠĠĠĠ Ġreturn @ db query Ġrow ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠConnection ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit [ from Station ]. value , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit [ to Station ]. value , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit [ min Duration ], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit [ median Duration ], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow [ stations List ]. split (",") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġcreate Connection ( from : ĠString , Ġto : ĠString , Ġmin : ĠInt , Ġmedian : ĠInt , Ġstations List : ĠList < String >) Ġ= ĊĠĠĠĠĠĠĠ Ġdb query Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrow Ġ= ĠConnection s . insert Ignore Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit [ from Station ] Ġ= ĠEntity ID ( from , ĠSt ations ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit [ to Station ] Ġ= ĠEntity ID ( to , ĠSt ations ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit [ min Duration ] Ġ= Ġmin ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit [ median Duration ] Ġ= Ġmedian ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit [ last Download ] Ġ= ĠInstant . now (). epoch Second ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit [ this . stations List ] Ġ= Ġstations List . join ToString (",") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ db query ĠConnection ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow [ from Station ]. value , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow [ to Station ]. value , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow [ min Duration ], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow [ median Duration ], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow [ Connections . stations List ]. split (",") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġget Existing St ations ( stations Ids : ĠList < String >): ĠList < Station > Ġ= Ġdb query Ġ{ ĊĠĠĠĠĠĠĠ ĠSt ations ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. select Ġ{ ĠSt ations . id Ġin List Ġstations Ids Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStation ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit [ St ations . id ]. value , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit [ name ], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit [ latitude ], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit [ longitude ], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit [ type ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġcreate Station ( ĊĠĠĠĠĠĠĠ Ġapi Id : ĠString , ĊĠĠĠĠĠĠĠ Ġname : ĠString , ĊĠĠĠĠĠĠĠ Ġlatitude : ĠDouble , ĊĠĠĠĠĠĠĠ Ġlongitude : ĠDouble , ĊĠĠĠĠĠĠĠ Ġtype : ĠString ? ĊĠĠĠ Ġ): ĠStation Ġ= Ġdb query Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrow Ġ= ĠSt ations . insert Ignore Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit [ St ations . id ] Ġ= ĠEntity ID ( api Id , ĠSt ations ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit [ St ations . name ] Ġ= Ġname ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit [ St ations . latitude ] Ġ= Ġlatitude ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit [ St ations . longitude ] Ġ= Ġlongitude ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit [ St ations . type ] Ġ= Ġtype ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn @ db query ĠStation ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrow [ St ations . id ]. value , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrow [ St ations . name ], ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrow [ St ations . latitude ], ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrow [ St ations . longitude ], ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrow [ St ations . type ] ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġsuspend Ġfun Ġ< T > Ġdb query ( statement : Ġsuspend ĠTransaction . () Ġ-> ĠT ): ĠT Ġ= ĊĠĠĠ Ġsus pended Transaction Async ( Dispatch ers . IO , Ġstatement Ġ= Ġstatement ). await () Ċ