From 87a61380f1e3d2aaa803da3a80921d67772e286b Mon Sep 17 00:00:00 2001 From: Rsl1122 Date: Wed, 23 Jan 2019 18:28:11 +0200 Subject: [PATCH] Refactored RemoveOperations#player into a Transaction --- .../commands/manage/ManageRemoveCommand.java | 3 +- .../java/com/djrapitops/plan/db/SQLDB.java | 3 +- .../transactions/RemovePlayerTransaction.java | 76 +++++++++++++++++++ .../db/sql/queries/OptionalFetchQueries.java | 21 +++++ .../databases/operation/RemoveOperations.java | 4 - .../databases/sql/operation/SQLRemoveOps.java | 23 ------ .../com/djrapitops/plan/db/CommonDBTest.java | 3 +- 7 files changed, 103 insertions(+), 30 deletions(-) create mode 100644 Plan/common/src/main/java/com/djrapitops/plan/db/access/transactions/RemovePlayerTransaction.java diff --git a/Plan/common/src/main/java/com/djrapitops/plan/command/commands/manage/ManageRemoveCommand.java b/Plan/common/src/main/java/com/djrapitops/plan/command/commands/manage/ManageRemoveCommand.java index 85bca8581..76d421e55 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/command/commands/manage/ManageRemoveCommand.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/command/commands/manage/ManageRemoveCommand.java @@ -18,6 +18,7 @@ package com.djrapitops.plan.command.commands.manage; import com.djrapitops.plan.api.exceptions.database.DBOpException; import com.djrapitops.plan.db.Database; +import com.djrapitops.plan.db.access.transactions.RemovePlayerTransaction; import com.djrapitops.plan.system.database.DBSystem; import com.djrapitops.plan.system.locale.Locale; import com.djrapitops.plan.system.locale.lang.CmdHelpLang; @@ -118,7 +119,7 @@ public class ManageRemoveCommand extends CommandNode { sender.sendMessage(locale.getString(ManageLang.PROGRESS_START)); - db.remove().player(uuid); + db.executeTransaction(new RemovePlayerTransaction(uuid)); sender.sendMessage(locale.getString(ManageLang.PROGRESS_SUCCESS)); } catch (DBOpException e) { diff --git a/Plan/common/src/main/java/com/djrapitops/plan/db/SQLDB.java b/Plan/common/src/main/java/com/djrapitops/plan/db/SQLDB.java index cb623d8a7..e8ac9da9a 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/db/SQLDB.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/db/SQLDB.java @@ -23,6 +23,7 @@ import com.djrapitops.plan.db.access.ExecStatement; import com.djrapitops.plan.db.access.Query; import com.djrapitops.plan.db.access.QueryStatement; import com.djrapitops.plan.db.access.transactions.CreateTablesTransaction; +import com.djrapitops.plan.db.access.transactions.RemovePlayerTransaction; import com.djrapitops.plan.db.access.transactions.Transaction; import com.djrapitops.plan.db.patches.*; import com.djrapitops.plan.db.sql.tables.*; @@ -304,7 +305,7 @@ public abstract class SQLDB extends AbstractDatabase { .map(Map.Entry::getKey) .collect(Collectors.toList()); for (UUID uuid : inactivePlayers) { - removeOps.player(uuid); + executeTransaction(new RemovePlayerTransaction(uuid)); } int removed = inactivePlayers.size(); if (removed > 0) { diff --git a/Plan/common/src/main/java/com/djrapitops/plan/db/access/transactions/RemovePlayerTransaction.java b/Plan/common/src/main/java/com/djrapitops/plan/db/access/transactions/RemovePlayerTransaction.java new file mode 100644 index 000000000..c306ce983 --- /dev/null +++ b/Plan/common/src/main/java/com/djrapitops/plan/db/access/transactions/RemovePlayerTransaction.java @@ -0,0 +1,76 @@ +/* + * This file is part of Player Analytics (Plan). + * + * Plan is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License v3 as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Plan is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Plan. If not, see . + */ +package com.djrapitops.plan.db.access.transactions; + +import com.djrapitops.plan.db.access.ExecStatement; +import com.djrapitops.plan.db.sql.queries.OptionalFetchQueries; +import com.djrapitops.plan.db.sql.tables.*; + +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.util.UUID; + +/** + * Transaction for removing a player's data from the database. + * + * @author Rsl1122 + */ +public class RemovePlayerTransaction extends Transaction { + + private final UUID playerUUID; + + public RemovePlayerTransaction(UUID playerUUID) { + this.playerUUID = playerUUID; + } + + @Override + protected boolean shouldBeExecuted() { + return playerUUID != null; + } + + @Override + protected void execute() { + query(OptionalFetchQueries.playerUserName(playerUUID)).ifPresent(this::deleteWebUser); + + deleteFromTable(GeoInfoTable.TABLE_NAME); + deleteFromTable(NicknamesTable.TABLE_NAME); + deleteFromTable(KillsTable.TABLE_NAME); + deleteFromTable(WorldTimesTable.TABLE_NAME); + deleteFromTable(SessionsTable.TABLE_NAME); + deleteFromTable(PingTable.TABLE_NAME); + deleteFromTable(UserInfoTable.TABLE_NAME); + deleteFromTable(UsersTable.TABLE_NAME); + } + + private void deleteWebUser(String username) { + execute(new ExecStatement("DELETE FROM " + SecurityTable.TABLE_NAME + " WHERE " + SecurityTable.USERNAME + "=?") { + @Override + public void prepare(PreparedStatement statement) throws SQLException { + statement.setString(1, username); + } + }); + } + + private void deleteFromTable(String tableName) { + execute(new ExecStatement("DELETE FROM " + tableName + " WHERE (uuid=?)") { + @Override + public void prepare(PreparedStatement statement) throws SQLException { + statement.setString(1, playerUUID.toString()); + } + }); + } +} \ No newline at end of file diff --git a/Plan/common/src/main/java/com/djrapitops/plan/db/sql/queries/OptionalFetchQueries.java b/Plan/common/src/main/java/com/djrapitops/plan/db/sql/queries/OptionalFetchQueries.java index 75e49b127..847d0c8ca 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/db/sql/queries/OptionalFetchQueries.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/db/sql/queries/OptionalFetchQueries.java @@ -19,6 +19,7 @@ package com.djrapitops.plan.db.sql.queries; import com.djrapitops.plan.db.access.Query; import com.djrapitops.plan.db.access.QueryStatement; import com.djrapitops.plan.db.sql.tables.ServerTable; +import com.djrapitops.plan.db.sql.tables.UsersTable; import com.djrapitops.plan.system.info.server.Server; import org.apache.commons.lang3.math.NumberUtils; @@ -75,4 +76,24 @@ public class OptionalFetchQueries { return db -> db.query(matchingServerIdentifier("BungeeCord")); } + public static Query> playerUserName(UUID playerUUID) { + String sql = "SELECT " + UsersTable.USER_NAME + + " FROM " + UsersTable.TABLE_NAME + + " WHERE " + UsersTable.USER_UUID + "=?"; + return new QueryStatement>(sql) { + @Override + public void prepare(PreparedStatement statement) throws SQLException { + statement.setString(1, playerUUID.toString()); + } + + @Override + public Optional processResults(ResultSet set) throws SQLException { + if (set.next()) { + return Optional.of(set.getString(UsersTable.USER_NAME)); + } + return Optional.empty(); + } + }; + } + } \ No newline at end of file diff --git a/Plan/common/src/main/java/com/djrapitops/plan/system/database/databases/operation/RemoveOperations.java b/Plan/common/src/main/java/com/djrapitops/plan/system/database/databases/operation/RemoveOperations.java index 3d609ffe3..6b7ac5afd 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/system/database/databases/operation/RemoveOperations.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/system/database/databases/operation/RemoveOperations.java @@ -16,12 +16,8 @@ */ package com.djrapitops.plan.system.database.databases.operation; -import java.util.UUID; - public interface RemoveOperations { - void player(UUID uuid); - void everything(); void webUser(String name); diff --git a/Plan/common/src/main/java/com/djrapitops/plan/system/database/databases/sql/operation/SQLRemoveOps.java b/Plan/common/src/main/java/com/djrapitops/plan/system/database/databases/sql/operation/SQLRemoveOps.java index 95d776bf3..b7aee1ef7 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/system/database/databases/sql/operation/SQLRemoveOps.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/system/database/databases/sql/operation/SQLRemoveOps.java @@ -18,37 +18,14 @@ package com.djrapitops.plan.system.database.databases.sql.operation; import com.djrapitops.plan.db.SQLDB; import com.djrapitops.plan.db.sql.tables.Table; -import com.djrapitops.plan.db.sql.tables.UserUUIDTable; import com.djrapitops.plan.system.database.databases.operation.RemoveOperations; -import java.util.UUID; - public class SQLRemoveOps extends SQLOps implements RemoveOperations { public SQLRemoveOps(SQLDB db) { super(db); } - @Override - public void player(UUID uuid) { - if (uuid == null) { - return; - } - - String webUser = usersTable.getPlayerName(uuid); - - for (Table t : db.getAllTablesInRemoveOrder()) { - if (!(t instanceof UserUUIDTable)) { - continue; - } - - UserUUIDTable table = (UserUUIDTable) t; - table.removeUser(uuid); - } - - securityTable.removeUser(webUser); - } - @Override public void everything() { for (Table table : db.getAllTablesInRemoveOrder()) { diff --git a/Plan/common/src/test/java/com/djrapitops/plan/db/CommonDBTest.java b/Plan/common/src/test/java/com/djrapitops/plan/db/CommonDBTest.java index a61c2741b..1716b2d6f 100644 --- a/Plan/common/src/test/java/com/djrapitops/plan/db/CommonDBTest.java +++ b/Plan/common/src/test/java/com/djrapitops/plan/db/CommonDBTest.java @@ -29,6 +29,7 @@ import com.djrapitops.plan.data.store.objects.Nickname; import com.djrapitops.plan.data.time.GMTimes; import com.djrapitops.plan.data.time.WorldTimes; import com.djrapitops.plan.db.access.Query; +import com.djrapitops.plan.db.access.transactions.RemovePlayerTransaction; import com.djrapitops.plan.db.patches.Patch; import com.djrapitops.plan.db.sql.queries.LargeFetchQueries; import com.djrapitops.plan.db.sql.tables.*; @@ -539,7 +540,7 @@ public abstract class CommonDBTest { assertTrue(usersTable.isRegistered(playerUUID)); - db.remove().player(playerUUID); + db.executeTransaction(new RemovePlayerTransaction(playerUUID)); assertFalse(usersTable.isRegistered(playerUUID)); assertFalse(userInfoTable.isRegistered(playerUUID));