mirror of
https://github.com/plan-player-analytics/Plan.git
synced 2024-11-01 00:10:12 +01:00
Attempt to fix duplicate key issue in UpdateWebPermissionsPatch
Affects issues: - #3543
This commit is contained in:
parent
95a20b54a3
commit
49269d3aab
@ -30,6 +30,7 @@ import java.util.Optional;
|
|||||||
public class DBOpException extends IllegalStateException implements ExceptionWithContext {
|
public class DBOpException extends IllegalStateException implements ExceptionWithContext {
|
||||||
|
|
||||||
public static final String CONSTRAINT_VIOLATION = "Constraint Violation";
|
public static final String CONSTRAINT_VIOLATION = "Constraint Violation";
|
||||||
|
public static final String DUPLICATE_KEY = "Duplicate key";
|
||||||
private final ErrorContext context;
|
private final ErrorContext context;
|
||||||
|
|
||||||
public DBOpException(String message) {
|
public DBOpException(String message) {
|
||||||
@ -77,7 +78,7 @@ public class DBOpException extends IllegalStateException implements ExceptionWit
|
|||||||
case 1022:
|
case 1022:
|
||||||
case 23001:
|
case 23001:
|
||||||
case 23505:
|
case 23505:
|
||||||
context.related("Duplicate key")
|
context.related(DUPLICATE_KEY)
|
||||||
.whatToDo("Report this, duplicate key exists in SQL.");
|
.whatToDo("Report this, duplicate key exists in SQL.");
|
||||||
break;
|
break;
|
||||||
// Constraint violation
|
// Constraint violation
|
||||||
@ -165,4 +166,9 @@ public class DBOpException extends IllegalStateException implements ExceptionWit
|
|||||||
&& getCause() != null
|
&& getCause() != null
|
||||||
&& getCause().getMessage().contains("user_id");
|
&& getCause().getMessage().contains("user_id");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isDuplicateKeyViolation() {
|
||||||
|
return context != null
|
||||||
|
&& context.getRelated().contains(DBOpException.CONSTRAINT_VIOLATION);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
package com.djrapitops.plan.storage.database.transactions.patches;
|
package com.djrapitops.plan.storage.database.transactions.patches;
|
||||||
|
|
||||||
import com.djrapitops.plan.delivery.domain.auth.WebPermission;
|
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.queries.objects.WebUserQueries;
|
||||||
import com.djrapitops.plan.storage.database.sql.tables.webuser.WebPermissionTable;
|
import com.djrapitops.plan.storage.database.sql.tables.webuser.WebPermissionTable;
|
||||||
import com.djrapitops.plan.storage.database.transactions.ExecBatchStatement;
|
import com.djrapitops.plan.storage.database.transactions.ExecBatchStatement;
|
||||||
@ -55,6 +56,18 @@ public class UpdateWebPermissionsPatch extends Patch {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void applyPatch() {
|
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) {
|
execute(new ExecBatchStatement(WebPermissionTable.INSERT_STATEMENT) {
|
||||||
@Override
|
@Override
|
||||||
public void prepare(PreparedStatement statement) throws SQLException {
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user