package Ġno . nav . hj el pe mid ler . so kn ad . db . db Ċ Ċ import Ġcom . zaxxer . hikari . HikariConfig Ċ import Ġcom . zaxxer . hikari . Hikari DataSource Ċ import Ġmu . Kotlin Logging Ċ import Ġno . nav . hj el pe mid ler . so kn ad . db . Configuration Ċ import Ġno . nav . hj el pe mid ler . so kn ad . db . Profile Ċ import Ġorg . fly way db . core . Fly way Ċ import Ġjava . lang . Exception Ċ import Ġjava . net . Socket Ċ import Ġjava . time . LocalDateTime Ċ import Ġkotlin . time . Duration Ċ import Ġkotlin . time . Experimental Time Ċ Ċ private Ġval Ġlogger Ġ= ĠKotlin Logging . logger Ġ{} Ċ Ċ @ Experimental Time Ċ internal Ġfun ĠwaitFor DB ( timeout : ĠDuration , Ġconfig : ĠConfiguration ): ĠBoolean Ġ{ ĊĠĠĠ Ġval Ġdeadline Ġ= ĠLocalDateTime . now (). plus Seconds ( timeout . in Seconds . to Long ()) ĊĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSocket ( config . database . host , Ġconfig . database . port . toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" Database Ġnot Ġavailable Ġyet , Ġwaiting ...") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠThread . sleep ( 1 0 0 0 Ġ* Ġ 2 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( LocalDateTime . now (). is After ( deadline )) Ġbreak ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġfalse Ċ } Ċ Ċ internal Ġfun Ġmigrate ( config : ĠConfiguration ) Ġ= ĊĠĠĠ ĠH ikari DataSource ( h ikariConfig From ( config )). use Ġ{ Ġmigrate ( it ) Ġ} Ċ Ċ internal Ġfun ĠhikariConfig From ( config : ĠConfiguration ) Ġ= ĊĠĠĠ ĠH ikariConfig (). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġjdbc Url Ġ= Ġ" jdbc : postgresql ://${ config . database . host }:${ config . database . port }/${ config . database . name }" ĊĠĠĠĠĠĠĠ Ġmaximum PoolSize Ġ= Ġ 3 ĊĠĠĠĠĠĠĠ Ġminimum Idle Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġidle Timeout Ġ= Ġ 1 0 0 0 1 ĊĠĠĠĠĠĠĠ Ġconnection Timeout Ġ= Ġ 1 0 0 0 ĊĠĠĠĠĠĠĠ Ġmax Lifetime Ġ= Ġ 3 0 0 0 1 ĊĠĠĠĠĠĠĠ Ġconfig . database . user ?. let Ġ{ Ġusername Ġ= Ġit Ġ} ĊĠĠĠĠĠĠĠ Ġconfig . database . password ?. let Ġ{ Ġpassword Ġ= Ġit Ġ} ĊĠĠĠ Ġ} Ċ Ċ internal Ġfun ĠdataSource From ( config : ĠConfiguration ): ĠH ikari DataSource Ġ= Ġwhen Ġ( config . application . profile ) Ġ{ ĊĠĠĠ ĠProfile . LOCAL Ġ-> ĠH ikari DataSource ( h ikariConfig From ( config )) ĊĠĠĠ Ġelse Ġ-> ĠH ikari DataSource ( h ikariConfig From ( config )) Ċ } Ċ Ċ internal Ġfun Ġmigrate ( dataSource : ĠH ikari DataSource , Ġinit Sql : ĠString Ġ= Ġ"") : ĠInt Ġ= ĊĠĠĠ ĠFly way . configure (). dataSource ( dataSource ). init Sql ( init Sql ). load (). migrate () Ċ Ċ internal Ġfun Ġclean ( dataSource : ĠH ikari DataSource ) Ġ= ĠFly way . configure (). dataSource ( dataSource ). load (). clean () Ċ