Improved MySQLDataHandler.kt

This commit is contained in:
Auxilor
2021-11-01 19:38:30 +00:00
parent 173d04595f
commit 33940f5778
2 changed files with 55 additions and 25 deletions

View File

@@ -53,4 +53,13 @@ public class PersistentDataKey<T> {
Eco.getHandler().getKeyRegistry().registerKey(this);
return this;
}
@Override
public String toString() {
return "PersistentDataKey{"
+ "key=" + key
+ ", defaultValue=" + defaultValue
+ ", type=" + type
+ '}';
}
}

View File

@@ -11,6 +11,7 @@ import org.jetbrains.exposed.sql.Column
import org.jetbrains.exposed.sql.Database
import org.jetbrains.exposed.sql.DoubleColumnType
import org.jetbrains.exposed.sql.IntegerColumnType
import org.jetbrains.exposed.sql.ResultRow
import org.jetbrains.exposed.sql.SchemaUtils
import org.jetbrains.exposed.sql.VarCharColumnType
import org.jetbrains.exposed.sql.insert
@@ -23,6 +24,8 @@ import java.util.UUID
class MySQLDataHandler(
plugin: EcoSpigotPlugin
) : DataHandler {
private val columns = mutableMapOf<String, Column<*>>()
init {
Database.connect(
"jdbc:mysql://" +
@@ -40,8 +43,12 @@ class MySQLDataHandler(
}
override fun updateKeys() {
for (key in Eco.getHandler().keyRegistry.registeredKeys) {
registerColumn(key, Players)
transaction {
for (key in Eco.getHandler().keyRegistry.registeredKeys) {
registerColumn(key, Players)
}
SchemaUtils.createMissingTablesAndColumns(Players)
}
}
@@ -51,13 +58,9 @@ class MySQLDataHandler(
override fun <T> write(uuid: UUID, key: NamespacedKey, value: T) {
transaction {
Players.select { Players.id eq uuid }.firstOrNull() ?: run {
Players.insert {
it[id] = uuid
}
}
val column: Column<T> =
Players.columns.stream().filter { it.name == key.toString() }.findFirst().get() as Column<T>
getPlayer(uuid)
val column: Column<T> = getColumn(key.toString()) as Column<T>
Players.update({ Players.id eq uuid }) {
it[column] = value
}
@@ -67,32 +70,50 @@ class MySQLDataHandler(
override fun <T> read(uuid: UUID, key: NamespacedKey): T? {
var value: T? = null
transaction {
val player = Players.select { Players.id eq uuid }.firstOrNull() ?: return@transaction
value = player[Players.columns.stream().filter { it.name == key.toString() }.findFirst().get()] as T?
val player = getPlayer(uuid)
value = player[getColumn(key.toString())] as T?
}
return value
}
object Players : UUIDTable("Eco_Players") {
object Players : UUIDTable("eco_players") {
}
private fun <T> registerColumn(key: PersistentDataKey<T>, table: UUIDTable) {
transaction {
table.apply {
when (key.type) {
PersistentDataKeyType.INT -> registerColumn<Int>(key.key.toString(), IntegerColumnType())
.default(key.defaultValue as Int)
PersistentDataKeyType.DOUBLE -> registerColumn<Double>(key.key.toString(), DoubleColumnType())
.default(key.defaultValue as Double)
PersistentDataKeyType.BOOLEAN -> registerColumn<Boolean>(key.key.toString(), BooleanColumnType())
.default(key.defaultValue as Boolean)
PersistentDataKeyType.STRING -> registerColumn<String>(key.key.toString(), VarCharColumnType(128))
.default(key.defaultValue as String)
table.apply {
when (key.type) {
PersistentDataKeyType.INT -> registerColumn<Int>(key.key.toString(), IntegerColumnType())
.default(key.defaultValue as Int)
PersistentDataKeyType.DOUBLE -> registerColumn<Double>(key.key.toString(), DoubleColumnType())
.default(key.defaultValue as Double)
PersistentDataKeyType.BOOLEAN -> registerColumn<Boolean>(key.key.toString(), BooleanColumnType())
.default(key.defaultValue as Boolean)
PersistentDataKeyType.STRING -> registerColumn<String>(key.key.toString(), VarCharColumnType(128))
.default(key.defaultValue as String)
else -> throw NullPointerException("Null value found!")
}
else -> throw NullPointerException("Null value found!")
}
}
}
private fun getColumn(name: String): Column<*> {
val cached = columns[name]
if (cached != null) {
return cached
}
columns[name] = Players.columns.stream().filter { it.name == name }.findFirst().get()
return getColumn(name)
}
private fun getPlayer(uuid: UUID): ResultRow {
Players.select { Players.id eq uuid }.firstOrNull() ?: run {
Players.insert {
it[id] = uuid
}
}
return Players.select { Players.id eq uuid }.first()
}
}