From 8c36f318c7a8fb7b24786e0e1d8d6e5e24acc014 Mon Sep 17 00:00:00 2001 From: Aurora Lahtela <24460436+AuroraLS3@users.noreply.github.com> Date: Sat, 30 Mar 2024 10:11:15 +0200 Subject: [PATCH] Prevent duplicate key exception from being thrown entirely Affects issues: - Fixed #3543 --- .../storage/database/sql/building/Sql.java | 12 ++++++++++ .../tables/webuser/WebPermissionTable.java | 4 ++++ .../patches/UpdateWebPermissionsPatch.java | 23 ++----------------- ...StoreMissingWebPermissionsTransaction.java | 2 +- 4 files changed, 19 insertions(+), 22 deletions(-) diff --git a/Plan/common/src/main/java/com/djrapitops/plan/storage/database/sql/building/Sql.java b/Plan/common/src/main/java/com/djrapitops/plan/storage/database/sql/building/Sql.java index fc00e0423..32f19a967 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/storage/database/sql/building/Sql.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/storage/database/sql/building/Sql.java @@ -118,6 +118,8 @@ public abstract class Sql { public abstract String dateToHour(String sql); + public abstract String insertOrIgnore(); + // https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html public static class MySQL extends Sql { @@ -150,6 +152,11 @@ public abstract class Sql { public String dateToHour(String sql) { return "HOUR(" + sql + ") % 24"; } + + @Override + public String insertOrIgnore() { + return "INSERT IGNORE INTO "; + } } // https://sqlite.org/lang_datefunc.html @@ -184,5 +191,10 @@ public abstract class Sql { public String dateToHour(String sql) { return "strftime('%H'," + sql + ')'; } + + @Override + public String insertOrIgnore() { + return "INSERT OR IGNORE INTO "; + } } } diff --git a/Plan/common/src/main/java/com/djrapitops/plan/storage/database/sql/tables/webuser/WebPermissionTable.java b/Plan/common/src/main/java/com/djrapitops/plan/storage/database/sql/tables/webuser/WebPermissionTable.java index 02173c304..34d57ae1b 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/storage/database/sql/tables/webuser/WebPermissionTable.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/storage/database/sql/tables/webuser/WebPermissionTable.java @@ -41,6 +41,10 @@ public class WebPermissionTable { /* Static information class */ } + public static String safeInsertSQL(DBType dbType) { + return dbType.getSql().insertOrIgnore() + TABLE_NAME + " (" + PERMISSION + ") VALUES (?)"; + } + public static String createTableSQL(DBType dbType) { return CreateTableBuilder.create(TABLE_NAME, dbType) .column(ID, Sql.INT).primaryKey() diff --git a/Plan/common/src/main/java/com/djrapitops/plan/storage/database/transactions/patches/UpdateWebPermissionsPatch.java b/Plan/common/src/main/java/com/djrapitops/plan/storage/database/transactions/patches/UpdateWebPermissionsPatch.java index eb75d27cf..0fa7ceb58 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/storage/database/transactions/patches/UpdateWebPermissionsPatch.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/storage/database/transactions/patches/UpdateWebPermissionsPatch.java @@ -17,7 +17,6 @@ package com.djrapitops.plan.storage.database.transactions.patches; import com.djrapitops.plan.delivery.domain.auth.WebPermission; -import com.djrapitops.plan.exceptions.database.DBOpException; import com.djrapitops.plan.storage.database.queries.objects.WebUserQueries; import com.djrapitops.plan.storage.database.sql.tables.webuser.WebPermissionTable; import com.djrapitops.plan.storage.database.transactions.ExecBatchStatement; @@ -56,19 +55,11 @@ public class UpdateWebPermissionsPatch extends Patch { @Override protected void applyPatch() { - try { - storeMissing(); - } catch (DBOpException failed) { - if (failed.isDuplicateKeyViolation()) { - retry(failed); - } else { - throw failed; - } - } + storeMissing(); } private void storeMissing() { - execute(new ExecBatchStatement(WebPermissionTable.INSERT_STATEMENT) { + execute(new ExecBatchStatement(WebPermissionTable.safeInsertSQL(dbType)) { @Override public void prepare(PreparedStatement statement) throws SQLException { for (String permission : missingPermissions) { @@ -78,14 +69,4 @@ public class UpdateWebPermissionsPatch extends Patch { } }); } - - private void retry(DBOpException failed) { - try { - if (hasBeenApplied()) return; - storeMissing(); - } catch (DBOpException anotherFail) { - anotherFail.addSuppressed(failed); - throw anotherFail; - } - } } diff --git a/Plan/common/src/main/java/com/djrapitops/plan/storage/database/transactions/webuser/StoreMissingWebPermissionsTransaction.java b/Plan/common/src/main/java/com/djrapitops/plan/storage/database/transactions/webuser/StoreMissingWebPermissionsTransaction.java index ef1811bdd..10cf5385d 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/storage/database/transactions/webuser/StoreMissingWebPermissionsTransaction.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/storage/database/transactions/webuser/StoreMissingWebPermissionsTransaction.java @@ -50,7 +50,7 @@ public class StoreMissingWebPermissionsTransaction extends Transaction { missingPermissions.add(permission); } } - execute(new ExecBatchStatement(WebPermissionTable.INSERT_STATEMENT) { + execute(new ExecBatchStatement(WebPermissionTable.safeInsertSQL(dbType)) { @Override public void prepare(PreparedStatement statement) throws SQLException { for (String permission : missingPermissions) {