diff --git a/Changelog.txt b/Changelog.txt
index 40ce18c04..f3159210a 100644
--- a/Changelog.txt
+++ b/Changelog.txt
@@ -1,3 +1,7 @@
+Version 2.1.66
+ Fixed a bug that could happen if a player was removed from the DB when using MySQL/MariaDB when the user was offline
+ Fixed a minor memory leak for MySQL
+
Version 2.1.65
Corrected a bug that would cause RetroMode to use Linear formula regardless of setting
diff --git a/pom.xml b/pom.xml
index a5032ca57..c3640a50b 100755
--- a/pom.xml
+++ b/pom.xml
@@ -2,7 +2,7 @@
4.0.0
com.gmail.nossr50.mcMMO
mcMMO
- 2.1.65
+ 2.1.66-SNAPSHOT
mcMMO
https://github.com/mcMMO-Dev/mcMMO
diff --git a/src/main/java/com/gmail/nossr50/commands/database/McremoveCommand.java b/src/main/java/com/gmail/nossr50/commands/database/McremoveCommand.java
index 5fe1ca89a..ba02d762c 100644
--- a/src/main/java/com/gmail/nossr50/commands/database/McremoveCommand.java
+++ b/src/main/java/com/gmail/nossr50/commands/database/McremoveCommand.java
@@ -5,6 +5,7 @@ import com.gmail.nossr50.mcMMO;
import com.gmail.nossr50.util.commands.CommandUtils;
import com.gmail.nossr50.util.player.UserManager;
import com.google.common.collect.ImmutableList;
+import org.bukkit.Bukkit;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.command.TabExecutor;
@@ -12,6 +13,7 @@ import org.bukkit.util.StringUtil;
import java.util.ArrayList;
import java.util.List;
+import java.util.UUID;
public class McremoveCommand implements TabExecutor {
@Override
@@ -24,7 +26,13 @@ public class McremoveCommand implements TabExecutor {
return true;
}
- if (mcMMO.getDatabaseManager().removeUser(playerName)) {
+ UUID uuid = null;
+
+ if(Bukkit.getPlayer(playerName) != null) {
+ uuid = Bukkit.getPlayer(playerName).getUniqueId();
+ }
+
+ if (mcMMO.getDatabaseManager().removeUser(playerName, uuid)) {
sender.sendMessage(LocaleLoader.getString("Commands.mcremove.Success", playerName));
}
else {
diff --git a/src/main/java/com/gmail/nossr50/database/DatabaseManager.java b/src/main/java/com/gmail/nossr50/database/DatabaseManager.java
index 47be98437..314b91800 100644
--- a/src/main/java/com/gmail/nossr50/database/DatabaseManager.java
+++ b/src/main/java/com/gmail/nossr50/database/DatabaseManager.java
@@ -30,9 +30,17 @@ public interface DatabaseManager {
* Remove a user from the database.
*
* @param playerName The name of the user to remove
+ * @param uuid player UUID, can be null
* @return true if the user was successfully removed, false otherwise
*/
- public boolean removeUser(String playerName);
+ public boolean removeUser(String playerName, UUID uuid);
+
+ /**
+ * Removes any cache used for faster lookups
+ * Currently only used for SQL
+ * @param uuid target UUID to cleanup
+ */
+ public void cleanupUser(UUID uuid);
/**
* Save a user to the database.
diff --git a/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java b/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java
index 907638b54..c9e305a14 100644
--- a/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java
+++ b/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java
@@ -185,7 +185,8 @@ public final class FlatfileDatabaseManager implements DatabaseManager {
mcMMO.p.getLogger().info("Purged " + removedPlayers + " users from the database.");
}
- public boolean removeUser(String playerName) {
+ public boolean removeUser(String playerName, UUID uuid) {
+ //NOTE: UUID is unused for FlatFile for this interface implementation
boolean worked = false;
BufferedReader in = null;
@@ -240,6 +241,11 @@ public final class FlatfileDatabaseManager implements DatabaseManager {
return worked;
}
+ @Override
+ public void cleanupUser(UUID uuid) {
+ //Not used in FlatFile
+ }
+
public boolean saveUser(PlayerProfile profile) {
String playerName = profile.getPlayerName();
UUID uuid = profile.getUniqueId();
diff --git a/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java b/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java
index 04c8d533b..6d2fe9728 100644
--- a/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java
+++ b/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java
@@ -15,6 +15,7 @@ import com.gmail.nossr50.runnables.database.UUIDUpdateAsyncTask;
import com.gmail.nossr50.util.Misc;
import org.apache.tomcat.jdbc.pool.DataSource;
import org.apache.tomcat.jdbc.pool.PoolProperties;
+import org.bukkit.Bukkit;
import org.bukkit.scheduler.BukkitRunnable;
import java.sql.*;
@@ -172,7 +173,7 @@ public final class SQLDatabaseManager implements DatabaseManager {
mcMMO.p.getLogger().info("Purged " + purged + " users from the database.");
}
- public boolean removeUser(String playerName) {
+ public boolean removeUser(String playerName, UUID uuid) {
boolean success = false;
Connection connection = null;
PreparedStatement statement = null;
@@ -200,12 +201,20 @@ public final class SQLDatabaseManager implements DatabaseManager {
}
if (success) {
+ if(uuid != null)
+ cleanupUser(uuid);
+
Misc.profileCleanup(playerName);
}
return success;
}
+ public void cleanupUser(UUID uuid) {
+ if(cachedUserIDs.containsKey(uuid))
+ cachedUserIDs.remove(uuid);
+ }
+
public boolean saveUser(PlayerProfile profile) {
boolean success = true;
PreparedStatement statement = null;
diff --git a/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java b/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java
index 68b1d911c..548536fc2 100644
--- a/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java
+++ b/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java
@@ -1008,5 +1008,8 @@ public class McMMOPlayer {
if (inParty()) {
party.removeOnlineMember(thisPlayer);
}
+
+ //Remove user from cache
+ mcMMO.getDatabaseManager().cleanupUser(thisPlayer.getUniqueId());
}
}