rollback sqlite update

This commit is contained in:
2025-10-04 14:20:18 +06:00
parent 1dd71175f4
commit a247dbcb02
3 changed files with 74 additions and 3 deletions

View File

@@ -6,7 +6,6 @@
* `Kotlin`: `2.2.10` -> `2.2.20` * `Kotlin`: `2.2.10` -> `2.2.20`
* `KSLog`: `1.5.0` -> `1.5.1` * `KSLog`: `1.5.0` -> `1.5.1`
* `Ktor`: `3.2.3` -> `3.3.0` * `Ktor`: `3.2.3` -> `3.3.0`
* `SQLite`: `3.50.1.0` -> `3.50.3.0`
* `KotlinX Browser`: `0.3` -> `0.5.0` * `KotlinX Browser`: `0.3` -> `0.5.0`
* `Koin`: `4.1.0` -> `4.1.1` * `Koin`: `4.1.0` -> `4.1.1`

View File

@@ -12,7 +12,8 @@ jb-compose = "1.8.2"
jb-exposed = "0.61.0" jb-exposed = "0.61.0"
jb-dokka = "2.0.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" korlibs = "5.4.0"
uuid = "0.8.4" uuid = "0.8.4"

View File

@@ -1,10 +1,81 @@
package dev.inmo.micro_utils.repos.exposed package dev.inmo.micro_utils.repos.exposed
import org.jetbrains.exposed.sql.* 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 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 <R> 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<String>) {
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) { fun Table.initTable(database: Database) {
transaction(database) { SchemaUtils.createMissingTablesAndColumns(this@initTable) } initTable(database = database, inBatch = false, withLogs = true)
} }
fun <T> T.initTable() where T: ExposedRepo, T: Table = initTable(database) fun <T> T.initTable() where T: ExposedRepo, T: Table = initTable(database)