From a247dbcb0293c1f9b27c585454a8f310adefb75a Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Sat, 4 Oct 2025 14:20:18 +0600 Subject: [PATCH] rollback sqlite update --- CHANGELOG.md | 1 - gradle/libs.versions.toml | 3 +- .../exposed/ExposedTableInitialization.kt | 73 ++++++++++++++++++- 3 files changed, 74 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 34a4367d350..b0b76332859 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,6 @@ * `Kotlin`: `2.2.10` -> `2.2.20` * `KSLog`: `1.5.0` -> `1.5.1` * `Ktor`: `3.2.3` -> `3.3.0` - * `SQLite`: `3.50.1.0` -> `3.50.3.0` * `KotlinX Browser`: `0.3` -> `0.5.0` * `Koin`: `4.1.0` -> `4.1.1` diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 4a4271c6e3a..1e203933469 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -12,7 +12,8 @@ jb-compose = "1.8.2" jb-exposed = "0.61.0" jb-dokka = "2.0.0" -sqlite = "3.50.3.0" +# 3.50.3.0 contains bug https://github.com/InsanusMokrassar/MicroUtils/actions/runs/18138301958/job/51629588088 +sqlite = "3.50.1.0" korlibs = "5.4.0" uuid = "0.8.4" diff --git a/repos/exposed/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/exposed/ExposedTableInitialization.kt b/repos/exposed/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/exposed/ExposedTableInitialization.kt index 8b0587c96b2..5d7802338bf 100644 --- a/repos/exposed/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/exposed/ExposedTableInitialization.kt +++ b/repos/exposed/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/exposed/ExposedTableInitialization.kt @@ -1,10 +1,81 @@ package dev.inmo.micro_utils.repos.exposed import org.jetbrains.exposed.sql.* +import org.jetbrains.exposed.sql.SchemaUtils.addMissingColumnsStatements +import org.jetbrains.exposed.sql.SchemaUtils.checkMappingConsistence +import org.jetbrains.exposed.sql.SchemaUtils.createStatements +import org.jetbrains.exposed.sql.transactions.TransactionManager import org.jetbrains.exposed.sql.transactions.transaction +/** + * Code in this function mostly duplicates Exposed [SchemaUtils.createMissingTablesAndColumns]. It made due to deprecation + * status of the last one and potential lost of it in future updates. + * + * Code doing: + * + * * Creating missed tables + * * Altering missed tables (where possible) + * * Calculate problems with [checkMappingConsistence] and add them in execution too + * + * All changes made in [transaction] with [database] as its `db` argument + */ +fun initTablesInTransaction(vararg tables: Table, database: Database, inBatch: Boolean = false, withLogs: Boolean = true) { + transaction(database) { + fun logTimeSpent(message: String, withLogs: Boolean, block: () -> R): R { + return if (withLogs) { + val start = System.currentTimeMillis() + val answer = block() + exposedLogger.info(message + " took " + (System.currentTimeMillis() - start) + "ms") + answer + } else { + block() + } + } + fun Transaction.execStatements(inBatch: Boolean, statements: List) { + if (inBatch) { + execInBatch(statements) + } else { + for (statement in statements) { + exec(statement) + } + } + } + with(TransactionManager.current()) { + db.dialect.resetCaches() + val createStatements = logTimeSpent("Preparing create tables statements", withLogs) { + createStatements(*tables) + } + logTimeSpent("Executing create tables statements", withLogs) { + execStatements(inBatch, createStatements) + commit() + } + + val alterStatements = logTimeSpent("Preparing alter table statements", withLogs) { + addMissingColumnsStatements(tables = tables, withLogs) + } + logTimeSpent("Executing alter table statements", withLogs) { + execStatements(inBatch, alterStatements) + commit() + } + val executedStatements = createStatements + alterStatements + logTimeSpent("Checking mapping consistence", withLogs) { + val modifyTablesStatements = checkMappingConsistence( + tables = tables, + withLogs + ).filter { it !in executedStatements } + execStatements(inBatch, modifyTablesStatements) + commit() + } + db.dialect.resetCaches() + } + } +} + +fun Table.initTable(database: Database, inBatch: Boolean, withLogs: Boolean) { + initTablesInTransaction(this, database = database, inBatch = inBatch, withLogs = withLogs) +} fun Table.initTable(database: Database) { - transaction(database) { SchemaUtils.createMissingTablesAndColumns(this@initTable) } + initTable(database = database, inBatch = false, withLogs = true) } fun T.initTable() where T: ExposedRepo, T: Table = initTable(database)