diff --git a/core/src/main/java/me/mastercapexd/auth/database/DatabaseHelper.java b/core/src/main/java/me/mastercapexd/auth/database/DatabaseHelper.java index d0a196e3..07265f1e 100644 --- a/core/src/main/java/me/mastercapexd/auth/database/DatabaseHelper.java +++ b/core/src/main/java/me/mastercapexd/auth/database/DatabaseHelper.java @@ -2,15 +2,21 @@ import java.io.File; import java.io.IOException; +import java.lang.reflect.Field; import java.net.URL; import java.sql.SQLException; +import java.util.List; import java.util.concurrent.Executors; +import java.util.function.Consumer; import com.bivashy.auth.api.AuthPlugin; import com.bivashy.auth.api.config.database.DatabaseSettings; import com.bivashy.auth.api.config.database.schema.SchemaSettings; +import com.j256.ormlite.db.DatabaseType; import com.j256.ormlite.field.DataPersisterManager; import com.j256.ormlite.jdbc.JdbcPooledConnectionSource; +import com.j256.ormlite.jdbc.db.DatabaseTypeUtils; +import com.j256.ormlite.jdbc.db.PostgresDatabaseType; import com.j256.ormlite.logger.Level; import com.j256.ormlite.logger.Logger; import com.j256.ormlite.support.ConnectionSource; @@ -23,6 +29,7 @@ import me.mastercapexd.auth.database.model.AccountLink; import me.mastercapexd.auth.database.model.AuthAccount; import me.mastercapexd.auth.database.persister.CryptoProviderPersister; +import me.mastercapexd.auth.database.type.IdentityPostgresDatabaseType; import me.mastercapexd.auth.util.DownloadUtil; import me.mastercapexd.auth.util.DriverUtil; import me.mastercapexd.auth.util.HashUtils; @@ -39,6 +46,12 @@ public DatabaseHelper(AuthPlugin plugin) { DatabaseSettings databaseConfiguration = plugin.getConfig().getDatabaseConfiguration(); SchemaSettings schemaSettings = databaseConfiguration.getSchemaSettings(); + // Related to https://github.com/j256/ormlite-core/issues/20 + modifyDatabaseType(databaseTypes -> { + databaseTypes.removeIf(databaseType -> databaseType instanceof PostgresDatabaseType); + databaseTypes.add(new IdentityPostgresDatabaseType()); + }); + Executors.newSingleThreadExecutor().execute(() -> { try { Logger.setGlobalLogLevel(Level.WARNING); @@ -75,6 +88,17 @@ public DatabaseHelper(AuthPlugin plugin) { }); } + private void modifyDatabaseType(Consumer> consumer) { + try { + Field field = DatabaseTypeUtils.class.getDeclaredField("databaseTypes"); + field.setAccessible(true); + List databaseTypes = (List) field.get(null); + consumer.accept(databaseTypes); + field.setAccessible(false); + } catch(NoSuchFieldException | IllegalAccessException ignored) { + } + } + public ConnectionSource getConnectionSource() { return connectionSource; } diff --git a/core/src/main/java/me/mastercapexd/auth/database/type/IdentityPostgresDatabaseType.java b/core/src/main/java/me/mastercapexd/auth/database/type/IdentityPostgresDatabaseType.java new file mode 100644 index 00000000..4e969991 --- /dev/null +++ b/core/src/main/java/me/mastercapexd/auth/database/type/IdentityPostgresDatabaseType.java @@ -0,0 +1,27 @@ +package me.mastercapexd.auth.database.type; + +import java.util.List; + +import com.j256.ormlite.field.FieldType; +import com.j256.ormlite.jdbc.db.PostgresDatabaseType; + +/** + * From: Source + */ +public class IdentityPostgresDatabaseType extends PostgresDatabaseType { + @Override + public boolean isIdSequenceNeeded() { + return driver.getMajorVersion() < 10; + } + + @Override + protected void configureGeneratedId(String tableName, StringBuilder sb, FieldType fieldType, + List statementsBefore, List statementsAfter, + List additionalArgs, List queriesAfter) { + if (fieldType.isAllowGeneratedIdInsert()) + sb.append("GENERATED BY DEFAULT AS IDENTITY "); + else + sb.append("GENERATED ALWAYS AS IDENTITY "); + configureId(sb, fieldType, statementsBefore, additionalArgs, queriesAfter); + } +} \ No newline at end of file