diff --git a/CommonCore/SQL/src/de/steamwar/sql/Leaderboard.kt b/CommonCore/SQL/src/de/steamwar/sql/Leaderboard.kt index 923b176c..ac964429 100644 --- a/CommonCore/SQL/src/de/steamwar/sql/Leaderboard.kt +++ b/CommonCore/SQL/src/de/steamwar/sql/Leaderboard.kt @@ -34,6 +34,7 @@ import org.jetbrains.exposed.v1.dao.flushCache import org.jetbrains.exposed.v1.javatime.CurrentTimestamp import org.jetbrains.exposed.v1.javatime.timestamp import org.jetbrains.exposed.v1.jdbc.select +import org.jetbrains.exposed.v1.jdbc.upsert object LeaderboardTable : CompositeIdTable("Leaderboard") { val userId = reference("UserId", SteamwarUserTable) @@ -41,6 +42,8 @@ object LeaderboardTable : CompositeIdTable("Leaderboard") { val time = long("Time") val updatedAt = timestamp("UpdatedAt").defaultExpression(CurrentTimestamp) val bestTime = bool("BestTime") + + override val primaryKey = PrimaryKey(userId, name) } class Leaderboard(id: EntityID) : CompositeEntity(id) { @@ -71,20 +74,14 @@ class Leaderboard(id: EntityID) : CompositeEntity(id) { @JvmStatic fun upsert(userId: Int, name: String, time: Long, bestTime: Boolean) = useDb { - findById(CompositeID { + LeaderboardTable.upsert( + onUpdateExclude = listOf(LeaderboardTable.updatedAt, LeaderboardTable.userId, LeaderboardTable.name), + where = { (LeaderboardTable.userId eq userId) and (LeaderboardTable.name eq name) } + ) { it[LeaderboardTable.userId] = userId it[LeaderboardTable.name] = name - })?.also { - it.time = time - it.bestTime = bestTime - } ?: new( - CompositeID { - it[LeaderboardTable.userId] = userId - it[LeaderboardTable.name] = name - } - ) { - this.time = time - this.bestTime = bestTime + it[LeaderboardTable.time] = time + it[LeaderboardTable.bestTime] = bestTime } } }