diff --git a/Plan/src/main/java/com/djrapitops/plan/database/tables/UsersTable.java b/Plan/src/main/java/com/djrapitops/plan/database/tables/UsersTable.java index 37c52223b..0681952b4 100644 --- a/Plan/src/main/java/com/djrapitops/plan/database/tables/UsersTable.java +++ b/Plan/src/main/java/com/djrapitops/plan/database/tables/UsersTable.java @@ -2,6 +2,7 @@ package main.java.com.djrapitops.plan.database.tables; import com.djrapitops.plugin.utilities.Verify; import main.java.com.djrapitops.plan.api.exceptions.DBCreateTableException; +import main.java.com.djrapitops.plan.data.UserInfo; import main.java.com.djrapitops.plan.database.databases.SQLDB; import main.java.com.djrapitops.plan.database.sql.*; @@ -21,6 +22,7 @@ public class UsersTable extends UserIDTable { private final String columnRegistered = "registered"; private final String columnName = "name"; private final String columnTimesKicked = "times_kicked"; + private String insertStatement; /** * @param db @@ -29,6 +31,10 @@ public class UsersTable extends UserIDTable { public UsersTable(SQLDB db, boolean usingMySQL) { super("plan_users", db, usingMySQL); statementSelectID = "(" + Select.from(tableName, tableName + "." + columnID).where(columnUUID + "=?").toString() + ")"; + insertStatement = Insert.values(tableName, + columnUUID, + columnRegistered, + columnName); } /** @@ -58,7 +64,7 @@ public class UsersTable extends UserIDTable { ResultSet set = null; try { statement = prepareStatement(Select.from(tableName, columnUUID).toString()); - statement.setFetchSize(2000); + statement.setFetchSize(5000); set = statement.executeQuery(); while (set.next()) { @@ -160,10 +166,7 @@ public class UsersTable extends UserIDTable { PreparedStatement statement = null; try { - statement = prepareStatement(Insert.values(tableName, - columnUUID, - columnRegistered, - columnName)); + statement = prepareStatement(insertStatement); statement.setString(1, uuid.toString()); statement.setLong(2, registered); statement.setString(3, name); @@ -300,4 +303,108 @@ public class UsersTable extends UserIDTable { public String getColumnName() { return columnName; } + + /** + * Inserts UUIDs, Register dates and Names to the table. + *

+ * This method is for batch operations, and should not be used to add information of users. + * Use UserInfoTable instead. + * + * @param users + * @throws SQLException + */ + public void insertUsers(Map users) throws SQLException { + if (Verify.isEmpty(users)) { + return; + } + PreparedStatement statement = null; + try { + statement = prepareStatement(insertStatement); + for (Map.Entry entry : users.entrySet()) { + UUID uuid = entry.getKey(); + UserInfo info = entry.getValue(); + long registered = info.getRegistered(); + String name = info.getName(); + + statement.setString(1, uuid.toString()); + statement.setLong(2, registered); + statement.setString(3, name); + statement.addBatch(); + } + + statement.executeBatch(); + commit(statement.getConnection()); + } finally { + close(statement); + } + } + + public Map getUsers() throws SQLException { + PreparedStatement statement = null; + ResultSet set = null; + try { + statement = prepareStatement(Select.all(tableName) + .toString()); + statement.setFetchSize(5000); + set = statement.executeQuery(); + Map users = new HashMap<>(); + if (set.next()) { + UUID uuid = UUID.fromString(set.getString(columnUUID)); + String name = set.getString(columnName); + long registered = set.getLong(columnRegistered); + + users.put(uuid, new UserInfo(uuid, name, registered, false, false)); + } + return users; + } finally { + endTransaction(statement); + close(set, statement); + } + } + + public void updateKicked(Map timesKicked) throws SQLException { + if (Verify.isEmpty(timesKicked)) { + return; + } + PreparedStatement statement = null; + try { + statement = prepareStatement("UPDATE " + tableName + " SET " + + columnTimesKicked + "=?" + + " WHERE " + columnUUID + "=?"); + for (Map.Entry entry : timesKicked.entrySet()) { + UUID uuid = entry.getKey(); + int kickCount = entry.getValue(); + statement.setInt(1, kickCount); + statement.setString(2, uuid.toString()); + statement.addBatch(); + } + + statement.executeBatch(); + commit(statement.getConnection()); + } finally { + close(statement); + } + } + + public Map getAllTimesKicked() throws SQLException { + PreparedStatement statement = null; + ResultSet set = null; + try { + statement = prepareStatement(Select.from(tableName, columnUUID, columnTimesKicked) + .toString()); + statement.setFetchSize(5000); + set = statement.executeQuery(); + Map timesKicked = new HashMap<>(); + while (set.next()) { + UUID uuid = UUID.fromString(set.getString(columnUUID)); + int kickCount = set.getInt(columnTimesKicked); + + timesKicked.put(uuid, kickCount); + } + return timesKicked; + } finally { + endTransaction(statement); + close(set, statement); + } + } } diff --git a/Plan/src/main/java/com/djrapitops/plan/database/tables/move/BatchOperationTable.java b/Plan/src/main/java/com/djrapitops/plan/database/tables/move/BatchOperationTable.java index 0c018f61b..90bff7967 100644 --- a/Plan/src/main/java/com/djrapitops/plan/database/tables/move/BatchOperationTable.java +++ b/Plan/src/main/java/com/djrapitops/plan/database/tables/move/BatchOperationTable.java @@ -8,6 +8,7 @@ import main.java.com.djrapitops.plan.api.exceptions.DBCreateTableException; import main.java.com.djrapitops.plan.database.databases.SQLDB; import main.java.com.djrapitops.plan.database.tables.ServerTable; import main.java.com.djrapitops.plan.database.tables.Table; +import main.java.com.djrapitops.plan.database.tables.UsersTable; import main.java.com.djrapitops.plan.systems.info.server.ServerInfo; import java.sql.SQLException; @@ -116,4 +117,14 @@ public class BatchOperationTable extends Table { } toDB.db.getWorldTable().saveWorlds(db.getWorldTable().getWorlds()); } + + public void copyUsers(BatchOperationTable toDB) throws SQLException { + if (toDB.equals(this)) { + return; + } + UsersTable fromTable = db.getUsersTable(); + UsersTable toTable = toDB.db.getUsersTable(); + toTable.insertUsers(fromTable.getUsers()); + toTable.updateKicked(fromTable.getAllTimesKicked()); + } } \ No newline at end of file