From dfbc7be6f2530a0636e99bdd5da85a31c32a6462 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Sun, 4 Sep 2022 14:37:22 +0600 Subject: [PATCH] add option waitForConnection in database config --- CHANGELOG.md | 3 ++ .../inmo/plagubot/config/DatabaseConfig.kt | 32 ++++++++++++++----- template.config.json | 2 +- 3 files changed, 28 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bedbdfa..83614d6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,9 @@ ## 2.3.0 +* `Bot`: + * Add option `waitForConnection` in database config + ## 2.2.0 * `Versions`: diff --git a/bot/src/main/kotlin/dev/inmo/plagubot/config/DatabaseConfig.kt b/bot/src/main/kotlin/dev/inmo/plagubot/config/DatabaseConfig.kt index 7d38b13..0291200 100644 --- a/bot/src/main/kotlin/dev/inmo/plagubot/config/DatabaseConfig.kt +++ b/bot/src/main/kotlin/dev/inmo/plagubot/config/DatabaseConfig.kt @@ -6,6 +6,7 @@ import org.jetbrains.exposed.sql.Database import org.jetbrains.exposed.sql.transactions.transactionManager import org.koin.core.scope.Scope import org.sqlite.JDBC +import java.lang.Exception import java.sql.Connection inline val Scope.database: Database? @@ -16,15 +17,30 @@ data class DatabaseConfig( val url: String = "jdbc:sqlite:file:test?mode=memory&cache=shared", val driver: String = JDBC::class.qualifiedName!!, val username: String = "", - val password: String = "" + val password: String = "", + val waitForConnection: Boolean = true ) { @Transient - val database: Database = Database.connect( - url, - driver, - username, - password - ).also { - it.transactionManager.defaultIsolationLevel = Connection.TRANSACTION_SERIALIZABLE // Or Connection.TRANSACTION_READ_UNCOMMITTED + val database: Database by lazy(LazyThreadSafetyMode.SYNCHRONIZED) { + while (true) { + return@lazy try { + Database.connect( + url, + driver, + username, + password + ).also { + it.transactionManager.defaultIsolationLevel = Connection.TRANSACTION_SERIALIZABLE // Or Connection.TRANSACTION_READ_UNCOMMITTED + } + } catch (e: Throwable) { + if (waitForConnection) { + Thread.sleep(1000L) + continue + } else { + throw e + } + } + } + error("Unable to get database by some reason") } } diff --git a/template.config.json b/template.config.json index 0d12e3e..ad6d9c5 100644 --- a/template.config.json +++ b/template.config.json @@ -4,7 +4,7 @@ "driver": "org.sqlite.JDBC", "username": "OPTIONAL username", "password": "OPTIONAL password", - "initAutomatically": false + "waitForConnection": true }, "botToken": "1234567890:ABCDEFGHIJKLMNOP_qrstuvwxyz12345678", "plugins": [