diff --git a/Plan/common/src/main/java/com/djrapitops/plan/exceptions/database/DBOpException.java b/Plan/common/src/main/java/com/djrapitops/plan/exceptions/database/DBOpException.java index ba6c53e44..d408f5b4b 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/exceptions/database/DBOpException.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/exceptions/database/DBOpException.java @@ -30,6 +30,7 @@ import java.util.Optional; public class DBOpException extends IllegalStateException implements ExceptionWithContext { public static final String CONSTRAINT_VIOLATION = "Constraint Violation"; + public static final String DUPLICATE_KEY = "Duplicate key"; private final ErrorContext context; public DBOpException(String message) { @@ -77,7 +78,7 @@ public class DBOpException extends IllegalStateException implements ExceptionWit case 1022: case 23001: case 23505: - context.related("Duplicate key") + context.related(DUPLICATE_KEY) .whatToDo("Report this, duplicate key exists in SQL."); break; // Constraint violation @@ -165,4 +166,9 @@ public class DBOpException extends IllegalStateException implements ExceptionWit && getCause() != null && getCause().getMessage().contains("user_id"); } + + public boolean isDuplicateKeyViolation() { + return context != null + && context.getRelated().contains(DBOpException.CONSTRAINT_VIOLATION); + } } 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 c10192675..eb75d27cf 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,6 +17,7 @@ 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; @@ -55,6 +56,18 @@ public class UpdateWebPermissionsPatch extends Patch { @Override protected void applyPatch() { + try { + storeMissing(); + } catch (DBOpException failed) { + if (failed.isDuplicateKeyViolation()) { + retry(failed); + } else { + throw failed; + } + } + } + + private void storeMissing() { execute(new ExecBatchStatement(WebPermissionTable.INSERT_STATEMENT) { @Override public void prepare(PreparedStatement statement) throws SQLException { @@ -65,4 +78,14 @@ public class UpdateWebPermissionsPatch extends Patch { } }); } + + private void retry(DBOpException failed) { + try { + if (hasBeenApplied()) return; + storeMissing(); + } catch (DBOpException anotherFail) { + anotherFail.addSuppressed(failed); + throw anotherFail; + } + } }