From c689c21f3757faaa43afa2402e9e49a06c1e894f Mon Sep 17 00:00:00 2001 From: Linnea Gräf Date: Sat, 5 Oct 2024 11:15:30 +0200 Subject: Add last launch meta --- .../kotlin/moe/nea/ledger/database/DBSchema.kt | 34 +++++++++++++++++++++- .../kotlin/moe/nea/ledger/database/Database.kt | 7 ++++- 2 files changed, 39 insertions(+), 2 deletions(-) (limited to 'src/main/kotlin') 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).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, Any>) { + operator fun set(key: Column, 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 { var hasAdvanced = false diff --git a/src/main/kotlin/moe/nea/ledger/database/Database.kt b/src/main/kotlin/moe/nea/ledger/database/Database.kt index d14a0e2..633b3a0 100644 --- a/src/main/kotlin/moe/nea/ledger/database/Database.kt +++ b/src/main/kotlin/moe/nea/ledger/database/Database.kt @@ -17,7 +17,12 @@ object Database { fun init() { MetaTable.createIfNotExists(connection) val meta = MetaTable.selectAll(connection).associate { it[MetaTable.key] to it[MetaTable.value] } - println("Old Meta: $meta") + val lastLaunch = meta["lastLaunch"]?.toLong() ?: 0L + println("Last launch $lastLaunch") + MetaTable.insert(connection, Table.OnConflict.REPLACE) { + it[MetaTable.key] = "lastLaunch" + it[MetaTable.value] = System.currentTimeMillis().toString() + } } } \ No newline at end of file -- cgit