mirror of
https://github.com/xHyroM/lighteco.git
synced 2024-11-12 18:38:07 +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 {
|
||||
@Comment("Storage provider.")
|
||||
@Comment("Available providers: h2, sqlite, mysql, mariadb")
|
||||
@Comment("Available providers: h2, sqlite, mysql, mariadb, postgresql")
|
||||
public StorageType provider = StorageType.H2;
|
||||
|
||||
@Comment("Data storage settings.")
|
||||
|
@ -14,5 +14,5 @@ public class StorageConfig extends OkaeriConfig {
|
|||
public StorageDataConfig data = new StorageDataConfig();
|
||||
|
||||
@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.hikari.MariaDBConnectionFactory;
|
||||
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;
|
||||
|
||||
|
@ -51,6 +52,10 @@ public class StorageFactory {
|
|||
this.plugin,
|
||||
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());
|
||||
};
|
||||
}
|
||||
|
|
|
@ -6,27 +6,32 @@ public enum SqlStatements {
|
|||
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 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(
|
||||
"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 (?, ?, ?) 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(
|
||||
"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 mysql;
|
||||
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.mysql = mysql;
|
||||
this.mariadb = mariadb;
|
||||
this.postgresql = postgresql != null ? postgresql : mariadb;
|
||||
}
|
||||
|
||||
public String get(StorageType implementationName) {
|
||||
|
@ -40,8 +45,15 @@ public enum SqlStatements {
|
|||
case MARIADB -> {
|
||||
return this.mariadb;
|
||||
}
|
||||
case POSTGRESQL -> {
|
||||
return this.postgresql;
|
||||
}
|
||||
}
|
||||
|
||||
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 (PreparedStatement ps = c.prepareStatement(this.statementProcessor.apply(LOAD_WHOLE_USER))) {
|
||||
ps.setString(1, uniqueIdString);
|
||||
if (this.connectionFactory.getImplementationName() == StorageType.MARIADB)
|
||||
if (SqlStatements.mustDuplicateParameters(this.connectionFactory.getImplementationName()))
|
||||
ps.setString(2, uniqueIdString);
|
||||
|
||||
ResultSet rs = ps.executeQuery();
|
||||
|
@ -120,7 +120,7 @@ public class SqlStorageProvider implements StorageProvider {
|
|||
psGlobal.setString(1, uniqueIdString);
|
||||
psGlobal.setString(2, currency.getIdentifier());
|
||||
psGlobal.setBigDecimal(3, balance);
|
||||
if (this.connectionFactory.getImplementationName() == StorageType.MARIADB)
|
||||
if (SqlStatements.mustDuplicateParameters(this.connectionFactory.getImplementationName()))
|
||||
psGlobal.setBigDecimal(4, balance);
|
||||
|
||||
psGlobal.addBatch();
|
||||
|
@ -129,7 +129,7 @@ public class SqlStorageProvider implements StorageProvider {
|
|||
psLocal.setString(1, uniqueIdString);
|
||||
psLocal.setString(2, currency.getIdentifier());
|
||||
psLocal.setBigDecimal(3, balance);
|
||||
if (this.connectionFactory.getImplementationName() == StorageType.MARIADB)
|
||||
if (SqlStatements.mustDuplicateParameters(this.connectionFactory.getImplementationName()))
|
||||
psLocal.setBigDecimal(4, balance);
|
||||
|
||||
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