mirror of
https://github.com/xHyroM/lighteco.git
synced 2024-12-18 02:21:09 +01:00
feat: postresql
This commit is contained in:
parent
75d80b0480
commit
0e3af38d55
6 changed files with 86 additions and 9 deletions
|
@ -6,7 +6,7 @@ import eu.okaeri.configs.annotation.Comment;
|
||||||
|
|
||||||
public class StorageConfig extends OkaeriConfig {
|
public class StorageConfig extends OkaeriConfig {
|
||||||
@Comment("Storage provider.")
|
@Comment("Storage provider.")
|
||||||
@Comment("Available providers: h2, sqlite, mysql, mariadb")
|
@Comment("Available providers: h2, sqlite, mysql, mariadb, postgresql")
|
||||||
public StorageType provider = StorageType.H2;
|
public StorageType provider = StorageType.H2;
|
||||||
|
|
||||||
@Comment("Data storage settings.")
|
@Comment("Data storage settings.")
|
||||||
|
@ -14,5 +14,5 @@ public class StorageConfig extends OkaeriConfig {
|
||||||
public StorageDataConfig data = new StorageDataConfig();
|
public StorageDataConfig data = new StorageDataConfig();
|
||||||
|
|
||||||
@Comment("Table prefix.")
|
@Comment("Table prefix.")
|
||||||
public String tablePrefix = "lighteco_";
|
public String tablePrefix = "lighteco";
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,6 +9,7 @@ import dev.xhyrom.lighteco.common.storage.provider.sql.connection.file.H2Connect
|
||||||
import dev.xhyrom.lighteco.common.storage.provider.sql.connection.file.SqliteConnectionFactory;
|
import dev.xhyrom.lighteco.common.storage.provider.sql.connection.file.SqliteConnectionFactory;
|
||||||
import dev.xhyrom.lighteco.common.storage.provider.sql.connection.hikari.MariaDBConnectionFactory;
|
import dev.xhyrom.lighteco.common.storage.provider.sql.connection.hikari.MariaDBConnectionFactory;
|
||||||
import dev.xhyrom.lighteco.common.storage.provider.sql.connection.hikari.MySQLConnectionFactory;
|
import dev.xhyrom.lighteco.common.storage.provider.sql.connection.hikari.MySQLConnectionFactory;
|
||||||
|
import dev.xhyrom.lighteco.common.storage.provider.sql.connection.hikari.PostgreSQLConnectionFactory;
|
||||||
|
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
|
@ -51,6 +52,10 @@ public class StorageFactory {
|
||||||
this.plugin,
|
this.plugin,
|
||||||
new MariaDBConnectionFactory(this.plugin.getConfig().storage.data)
|
new MariaDBConnectionFactory(this.plugin.getConfig().storage.data)
|
||||||
);
|
);
|
||||||
|
case POSTGRESQL -> new SqlStorageProvider(
|
||||||
|
this.plugin,
|
||||||
|
new PostgreSQLConnectionFactory(this.plugin.getConfig().storage.data)
|
||||||
|
);
|
||||||
default -> throw new IllegalArgumentException("Unknown storage provider: " + type.name());
|
default -> throw new IllegalArgumentException("Unknown storage provider: " + type.name());
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,27 +6,32 @@ public enum SqlStatements {
|
||||||
SAVE_USER_LOCAL_CURRENCY(
|
SAVE_USER_LOCAL_CURRENCY(
|
||||||
"INSERT INTO {prefix}_{context}_users (uuid, currency_identifier, balance) VALUES (?1, ?2, ?3) ON CONFLICT (uuid, currency_identifier) DO UPDATE SET balance=?3;",
|
"INSERT INTO {prefix}_{context}_users (uuid, currency_identifier, balance) VALUES (?1, ?2, ?3) ON CONFLICT (uuid, currency_identifier) DO UPDATE SET balance=?3;",
|
||||||
"INSERT INTO {prefix}_{context}_users (uuid, currency_identifier, balance) VALUES (?1, ?2, ?3) ON DUPLICATE KEY UPDATE balance=?3;",
|
"INSERT INTO {prefix}_{context}_users (uuid, currency_identifier, balance) VALUES (?1, ?2, ?3) ON DUPLICATE KEY UPDATE balance=?3;",
|
||||||
"INSERT INTO {prefix}_{context}_users (uuid, currency_identifier, balance) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE balance=?;"
|
"INSERT INTO {prefix}_{context}_users (uuid, currency_identifier, balance) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE balance=?;",
|
||||||
|
"INSERT INTO {prefix}_{context}_users (uuid, currency_identifier, balance) VALUES (?, ?, ?) ON CONFLICT (uuid, currency_identifier) DO UPDATE SET balance=?;"
|
||||||
),
|
),
|
||||||
SAVE_USER_GLOBAL_CURRENCY(
|
SAVE_USER_GLOBAL_CURRENCY(
|
||||||
"INSERT INTO {prefix}_users (uuid, currency_identifier, balance) VALUES (?1, ?2, ?3) ON CONFLICT (uuid, currency_identifier) DO UPDATE SET balance=?3;",
|
"INSERT INTO {prefix}_users (uuid, currency_identifier, balance) VALUES (?1, ?2, ?3) ON CONFLICT (uuid, currency_identifier) DO UPDATE SET balance=?3;",
|
||||||
"INSERT INTO {prefix}_users (uuid, currency_identifier, balance) VALUES (?1, ?2, ?3) ON DUPLICATE KEY UPDATE balance=?3;",
|
"INSERT INTO {prefix}_users (uuid, currency_identifier, balance) VALUES (?1, ?2, ?3) ON DUPLICATE KEY UPDATE balance=?3;",
|
||||||
"INSERT INTO {prefix}_users (uuid, currency_identifier, balance) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE balance=?;"
|
"INSERT INTO {prefix}_users (uuid, currency_identifier, balance) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE balance=?;",
|
||||||
|
"INSERT INTO {prefix}_users (uuid, currency_identifier, balance) VALUES (?, ?, ?) ON CONFLICT (uuid, currency_identifier) DO UPDATE SET balance=?;"
|
||||||
),
|
),
|
||||||
LOAD_WHOLE_USER(
|
LOAD_WHOLE_USER(
|
||||||
"SELECT currency_identifier, balance FROM ( SELECT currency_identifier, balance FROM '{prefix}_users' WHERE uuid = ?1 UNION ALL SELECT currency_identifier, balance FROM '{prefix}_{context}_users' WHERE uuid = ?1 ) AS combined_currencies;",
|
"SELECT currency_identifier, balance FROM ( SELECT currency_identifier, balance FROM '{prefix}_users' WHERE uuid = ?1 UNION ALL SELECT currency_identifier, balance FROM '{prefix}_{context}_users' WHERE uuid = ?1 ) AS combined_currencies;",
|
||||||
"SELECT currency_identifier, balance FROM ( SELECT currency_identifier, balance FROM '{prefix}_users' WHERE uuid = ?1 UNION ALL SELECT currency_identifier, balance FROM '{prefix}_{context}_users' WHERE uuid = ?1 ) AS combined_currencies;",
|
"SELECT currency_identifier, balance FROM ( SELECT currency_identifier, balance FROM '{prefix}_users' WHERE uuid = ?1 UNION ALL SELECT currency_identifier, balance FROM '{prefix}_{context}_users' WHERE uuid = ?1 ) AS combined_currencies;",
|
||||||
"SELECT currency_identifier, balance FROM ( SELECT currency_identifier, balance FROM '{prefix}_users' WHERE uuid = ? UNION ALL SELECT currency_identifier, balance FROM '{prefix}_{context}_users' WHERE uuid = ? ) AS combined_currencies;"
|
"SELECT currency_identifier, balance FROM ( SELECT currency_identifier, balance FROM '{prefix}_users' WHERE uuid = ? UNION ALL SELECT currency_identifier, balance FROM '{prefix}_{context}_users' WHERE uuid = ? ) AS combined_currencies;",
|
||||||
|
null
|
||||||
);
|
);
|
||||||
|
|
||||||
public final String sqlite;
|
public final String sqlite;
|
||||||
public final String mysql;
|
public final String mysql;
|
||||||
public final String mariadb;
|
public final String mariadb;
|
||||||
|
public final String postgresql;
|
||||||
|
|
||||||
SqlStatements(String sqlite, String mysql, String mariadb) {
|
SqlStatements(String sqlite, String mysql, String mariadb, String postgresql) {
|
||||||
this.sqlite = sqlite;
|
this.sqlite = sqlite;
|
||||||
this.mysql = mysql;
|
this.mysql = mysql;
|
||||||
this.mariadb = mariadb;
|
this.mariadb = mariadb;
|
||||||
|
this.postgresql = postgresql != null ? postgresql : mariadb;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String get(StorageType implementationName) {
|
public String get(StorageType implementationName) {
|
||||||
|
@ -40,8 +45,15 @@ public enum SqlStatements {
|
||||||
case MARIADB -> {
|
case MARIADB -> {
|
||||||
return this.mariadb;
|
return this.mariadb;
|
||||||
}
|
}
|
||||||
|
case POSTGRESQL -> {
|
||||||
|
return this.postgresql;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
throw new IllegalArgumentException("Unknown implementation: " + implementationName);
|
throw new IllegalArgumentException("Unknown implementation: " + implementationName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static boolean mustDuplicateParameters(StorageType implementationName) {
|
||||||
|
return implementationName == StorageType.MARIADB || implementationName == StorageType.POSTGRESQL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -83,7 +83,7 @@ public class SqlStorageProvider implements StorageProvider {
|
||||||
try (Connection c = this.connectionFactory.getConnection()) {
|
try (Connection c = this.connectionFactory.getConnection()) {
|
||||||
try (PreparedStatement ps = c.prepareStatement(this.statementProcessor.apply(LOAD_WHOLE_USER))) {
|
try (PreparedStatement ps = c.prepareStatement(this.statementProcessor.apply(LOAD_WHOLE_USER))) {
|
||||||
ps.setString(1, uniqueIdString);
|
ps.setString(1, uniqueIdString);
|
||||||
if (this.connectionFactory.getImplementationName() == StorageType.MARIADB)
|
if (SqlStatements.mustDuplicateParameters(this.connectionFactory.getImplementationName()))
|
||||||
ps.setString(2, uniqueIdString);
|
ps.setString(2, uniqueIdString);
|
||||||
|
|
||||||
ResultSet rs = ps.executeQuery();
|
ResultSet rs = ps.executeQuery();
|
||||||
|
@ -120,7 +120,7 @@ public class SqlStorageProvider implements StorageProvider {
|
||||||
psGlobal.setString(1, uniqueIdString);
|
psGlobal.setString(1, uniqueIdString);
|
||||||
psGlobal.setString(2, currency.getIdentifier());
|
psGlobal.setString(2, currency.getIdentifier());
|
||||||
psGlobal.setBigDecimal(3, balance);
|
psGlobal.setBigDecimal(3, balance);
|
||||||
if (this.connectionFactory.getImplementationName() == StorageType.MARIADB)
|
if (SqlStatements.mustDuplicateParameters(this.connectionFactory.getImplementationName()))
|
||||||
psGlobal.setBigDecimal(4, balance);
|
psGlobal.setBigDecimal(4, balance);
|
||||||
|
|
||||||
psGlobal.addBatch();
|
psGlobal.addBatch();
|
||||||
|
@ -129,7 +129,7 @@ public class SqlStorageProvider implements StorageProvider {
|
||||||
psLocal.setString(1, uniqueIdString);
|
psLocal.setString(1, uniqueIdString);
|
||||||
psLocal.setString(2, currency.getIdentifier());
|
psLocal.setString(2, currency.getIdentifier());
|
||||||
psLocal.setBigDecimal(3, balance);
|
psLocal.setBigDecimal(3, balance);
|
||||||
if (this.connectionFactory.getImplementationName() == StorageType.MARIADB)
|
if (SqlStatements.mustDuplicateParameters(this.connectionFactory.getImplementationName()))
|
||||||
psLocal.setBigDecimal(4, balance);
|
psLocal.setBigDecimal(4, balance);
|
||||||
|
|
||||||
psLocal.addBatch();
|
psLocal.addBatch();
|
||||||
|
|
|
@ -0,0 +1,47 @@
|
||||||
|
package dev.xhyrom.lighteco.common.storage.provider.sql.connection.hikari;
|
||||||
|
|
||||||
|
import dev.xhyrom.lighteco.common.config.storage.StorageDataConfig;
|
||||||
|
import dev.xhyrom.lighteco.common.storage.StorageType;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.function.Function;
|
||||||
|
|
||||||
|
public class PostgreSQLConnectionFactory extends DriverBasedHikariConnectionFactory {
|
||||||
|
public PostgreSQLConnectionFactory(StorageDataConfig configuration) {
|
||||||
|
super(configuration);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public StorageType getImplementationName() {
|
||||||
|
return StorageType.POSTGRESQL;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected String defaultPort() {
|
||||||
|
return "5432";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected String driverClassName() {
|
||||||
|
return "org.postgresql.Driver";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected String driverJdbcIdentifier() {
|
||||||
|
return "postgresql";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void overrideProperties(Map<String, Object> properties) {
|
||||||
|
super.overrideProperties(properties);
|
||||||
|
|
||||||
|
// Doesn't work with PostgreSQL
|
||||||
|
properties.remove("useUnicode");
|
||||||
|
properties.remove("characterEncoding");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Function<String, String> getStatementProcessor() {
|
||||||
|
return s -> s.replace("\'", "\"");
|
||||||
|
}
|
||||||
|
}
|
13
common/src/main/resources/schema/postgresql.sql
Normal file
13
common/src/main/resources/schema/postgresql.sql
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
CREATE TABLE IF NOT EXISTS "{prefix}_users" (
|
||||||
|
"uuid" VARCHAR(36) NOT NULL,
|
||||||
|
"currency_identifier" VARCHAR(255) NOT NULL,
|
||||||
|
"balance" DECIMAL(10, 2) NOT NULL,
|
||||||
|
PRIMARY KEY ("uuid", "currency_identifier")
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS "{prefix}_{context}_users" (
|
||||||
|
"uuid" VARCHAR(36) NOT NULL,
|
||||||
|
"currency_identifier" VARCHAR(255) NOT NULL,
|
||||||
|
"balance" DECIMAL(10, 2) NOT NULL,
|
||||||
|
PRIMARY KEY ("uuid", "currency_identifier")
|
||||||
|
);
|
Loading…
Reference in a new issue