diff options
author | Linnea Gräf <nea@nea.moe> | 2024-10-05 11:15:30 +0200 |
---|---|---|
committer | Linnea Gräf <nea@nea.moe> | 2024-10-05 11:15:30 +0200 |
commit | c689c21f3757faaa43afa2402e9e49a06c1e894f (patch) | |
tree | f02702a8f6b1f83513458d0808f47a71eff13099 /src/main/kotlin/moe/nea/ledger/database/DBSchema.kt | |
parent | 71d7054571c6f7eca8c28b8f0bf396c16a28543c (diff) | |
download | money-ledger-c689c21f3757faaa43afa2402e9e49a06c1e894f.tar.gz money-ledger-c689c21f3757faaa43afa2402e9e49a06c1e894f.tar.bz2 money-ledger-c689c21f3757faaa43afa2402e9e49a06c1e894f.zip |
Add last launch meta
Diffstat (limited to 'src/main/kotlin/moe/nea/ledger/database/DBSchema.kt')
-rw-r--r-- | src/main/kotlin/moe/nea/ledger/database/DBSchema.kt | 34 |
1 files changed, 33 insertions, 1 deletions
diff --git a/src/main/kotlin/moe/nea/ledger/database/DBSchema.kt b/src/main/kotlin/moe/nea/ledger/database/DBSchema.kt index 49e2048..5c9099c 100644 --- a/src/main/kotlin/moe/nea/ledger/database/DBSchema.kt +++ b/src/main/kotlin/moe/nea/ledger/database/DBSchema.kt @@ -3,6 +3,7 @@ package moe.nea.ledger.database import java.sql.Connection import java.sql.PreparedStatement import java.sql.ResultSet +import java.sql.Timestamp import java.time.Instant interface DBSchema { @@ -122,12 +123,43 @@ abstract class Table(val name: String) { .execute() } + enum class OnConflict { + FAIL, + IGNORE, + REPLACE, + ; + + fun asSql(): String { + return name + } + } + + fun insert(connection: Connection, onConflict: OnConflict = OnConflict.FAIL, block: (InsertStatement) -> Unit) { + val insert = InsertStatement(HashMap()) + block(insert) + require(insert.properties.keys == columns.toSet()) + val columnNames = columns.joinToString { it.sqlName } + val valueNames = columns.joinToString { "?" } + val statement = + connection.prepareAndLog("INSERT OR ${onConflict.asSql()} INTO $sqlName ($columnNames) VALUES ($valueNames)") + for ((index, column) in columns.withIndex()) { + (column as Column<Any>).type.set(statement, index + 1, insert.properties[column]!!) + } + statement.execute() + } + fun selectAll(connection: Connection): Query { return Query(connection, columns, this) } } +class InsertStatement(val properties: MutableMap<Column<*>, Any>) { + operator fun <T : Any> set(key: Column<T>, value: T) { + properties[key] = value + } +} + fun Connection.prepareAndLog(statement: String): PreparedStatement { println("Preparing to execute $statement") return prepareStatement(statement) @@ -162,7 +194,7 @@ class Query( query += "OFFSET $skip " } } - val prepared = connection.prepareAndLog(query) + val prepared = connection.prepareAndLog(query.trim()) val results = prepared.executeQuery() return object : Iterator<ResultRow> { var hasAdvanced = false |