diff options
author | Dico Karssiens <dico.karssiens@gmail.com> | 2018-07-29 03:04:45 +0100 |
---|---|---|
committer | Dico Karssiens <dico.karssiens@gmail.com> | 2018-07-29 03:04:45 +0100 |
commit | 015a5f369d140c766ce5d94e3148e799f718aeaf (patch) | |
tree | 12b6361233d99c7f0f845a439b0a52358b605de1 | |
parent | d425a1e977cb03a7b9162e3dcb775cabeff52814 (diff) |
Exposed doesn't have an equivalent of insert or update aka upsert...
-rw-r--r-- | build.gradle.kts | 4 | ||||
-rw-r--r-- | src/main/kotlin/io/dico/parcels2/storage/ExposedBacking.kt | 12 | ||||
-rw-r--r-- | src/main/kotlin/io/dico/parcels2/storage/ExposedExtensions.kt | 51 |
3 files changed, 38 insertions, 29 deletions
diff --git a/build.gradle.kts b/build.gradle.kts index a1a6e4f..c3bd432 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -64,9 +64,11 @@ dependencies { compile(project(":dicore3:dicore3-command")) c.kotlinStd(kotlin("stdlib-jdk8")) + c.kotlinStd(kotlin("reflect")) c.kotlinStd(kotlinx("coroutines-core:0.23.4")) - c.kotlinStd("org.jetbrains.exposed:exposed:0.10.3") + compile("org.jetbrains.exposed:exposed:0.10.3") { isTransitive = false } + compile("joda-time:joda-time:2.10") compile("com.zaxxer:HikariCP:3.2.0") val jacksonVersion = "2.9.6" diff --git a/src/main/kotlin/io/dico/parcels2/storage/ExposedBacking.kt b/src/main/kotlin/io/dico/parcels2/storage/ExposedBacking.kt index fc0591c..32371f1 100644 --- a/src/main/kotlin/io/dico/parcels2/storage/ExposedBacking.kt +++ b/src/main/kotlin/io/dico/parcels2/storage/ExposedBacking.kt @@ -46,10 +46,9 @@ object AddedGlobalT : Table("parcels_added_global") { } object ParcelOptionsT : Table("parcel_options") { - val parcel_id = integer("parcel_id").references(ParcelsT.id, ReferenceOption.CASCADE) + val parcel_id = integer("parcel_id").primaryKey().references(ParcelsT.id, ReferenceOption.CASCADE) val interact_inventory = bool("interact_inventory").default(false) val interact_inputs = bool("interact_inputs").default(false) - val index_parcel_id = uniqueIndexR("index_parcel_id", parcel_id) } private class ExposedDatabaseException(message: String? = null) : Exception(message) @@ -248,7 +247,12 @@ class ExposedBacking(private val dataSourceFactory: () -> DataSource) : Backing override suspend fun setParcelAllowsInteractInventory(parcel: Parcel, value: Boolean): Unit = transaction { val id = getOrInitParcelId(parcel) - ParcelOptionsT.upsert(ParcelOptionsT.parcel_id) { + /*ParcelOptionsT.upsert(ParcelOptionsT.parcel_id) { + it[ParcelOptionsT.parcel_id] = id + it[ParcelOptionsT.interact_inventory] = value + }*/ + + ParcelOptionsT.replace { it[ParcelOptionsT.parcel_id] = id it[ParcelOptionsT.interact_inventory] = value } @@ -256,7 +260,7 @@ class ExposedBacking(private val dataSourceFactory: () -> DataSource) : Backing override suspend fun setParcelAllowsInteractInputs(parcel: Parcel, value: Boolean): Unit = transaction { val id = getOrInitParcelId(parcel) - ParcelOptionsT.upsert(ParcelOptionsT.parcel_id) { + ParcelOptionsT.replace { it[ParcelOptionsT.parcel_id] = id it[ParcelOptionsT.interact_inputs] = value } diff --git a/src/main/kotlin/io/dico/parcels2/storage/ExposedExtensions.kt b/src/main/kotlin/io/dico/parcels2/storage/ExposedExtensions.kt index bb6133d..30f9b02 100644 --- a/src/main/kotlin/io/dico/parcels2/storage/ExposedExtensions.kt +++ b/src/main/kotlin/io/dico/parcels2/storage/ExposedExtensions.kt @@ -33,40 +33,43 @@ class UpsertStatement<Key : Any>(table: Table, conflictColumn: Column<*>? = null val indexName: String val indexColumns: List<Column<*>> + private fun getUpdateStatement(): UpdateStatement { + val map: Map<Column<Any?>, Any?> = values.castUnchecked() + val statement = updateBody(table, UpdateStatement(table, null, combineAsConjunctions(indexColumns.castUnchecked(), map))) { + map.forEach { col, value -> if (col !in indexColumns) + it[col] = value + } + } + return statement + } + init { - if (conflictIndex != null) { - indexName = conflictIndex.indexName - indexColumns = conflictIndex.columns - } else if (conflictColumn != null) { - indexName = conflictColumn.name - indexColumns = listOf(conflictColumn) - } else { - throw IllegalArgumentException() + when { + conflictIndex != null -> { + indexName = conflictIndex.indexName + indexColumns = conflictIndex.columns + } + conflictColumn != null -> { + indexName = conflictColumn.name + indexColumns = listOf(conflictColumn) + } + else -> throw IllegalArgumentException() } } override fun prepareSQL(transaction: Transaction): String { val insertSQL = super.prepareSQL(transaction) - val args = arguments!!.first() - val map = mutableMapOf<Column<Any?>, Any?>().apply { args.forEach { put(it.first.castUnchecked(), it.second) } } + val updateStatement = getUpdateStatement() + val updateSQL = updateStatement.prepareSQL(transaction) + super.arguments = listOf(super.arguments!!.first(), updateStatement.firstDataSet) - val updateSQL = updateBody(table, UpdateStatement(table, null, combineAsConjunctions(indexColumns.castUnchecked(), map))) { - map.forEach { col, value -> - if (col !in columns) { - it[col] = value - } - } - }.prepareSQL(transaction) - - val builder = StringBuilder().apply { + return buildString { append(insertSQL) append(" ON CONFLICT(") append(indexName) append(") DO UPDATE ") append(updateSQL) - } - - return builder.toString().also { println(it) } + }.also { println(it) } } private companion object { @@ -100,10 +103,10 @@ inline fun <T : Table> T.upsert(conflictColumn: Column<*>? = null, conflictIndex execute(TransactionManager.current()) } -fun Table.indexR(customIndexName:String? = null, isUnique: Boolean = false, vararg columns: Column<*>): Index { +fun Table.indexR(customIndexName: String? = null, isUnique: Boolean = false, vararg columns: Column<*>): Index { val index = Index(columns.toList(), isUnique, customIndexName) indices.add(index) return index } -fun Table.uniqueIndexR(customIndexName:String? = null, vararg columns: Column<*>): Index = indexR(customIndexName, true, *columns) +fun Table.uniqueIndexR(customIndexName: String? = null, vararg columns: Column<*>): Index = indexR(customIndexName, true, *columns) |