From e53fe3677843379b1a20134d453c5f00d333d2e6 Mon Sep 17 00:00:00 2001 From: riking Date: Wed, 31 Jul 2013 15:02:01 -0700 Subject: [PATCH 1/8] Use provided last-saved information for purge. The new method, OfflinePlayer.getLastPlayed(), is used as a backup for when the data is unparsable. TODO check if StringUtils is available here --- .../database/FlatfileDatabaseManager.java | 28 +++++++++++++------ 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java b/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java index 9a03c3a7f..6d8728728 100644 --- a/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java +++ b/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java @@ -26,6 +26,7 @@ import com.gmail.nossr50.datatypes.skills.AbilityType; import com.gmail.nossr50.datatypes.skills.SkillType; import com.gmail.nossr50.datatypes.spout.huds.HudType; import com.gmail.nossr50.util.Misc; +import com.gmail.nossr50.util.StringUtils; public final class FlatfileDatabaseManager implements DatabaseManager { private final HashMap> playerStatHash = new HashMap>(); @@ -117,19 +118,30 @@ public final class FlatfileDatabaseManager implements DatabaseManager { while ((line = in.readLine()) != null) { String[] character = line.split(":"); String name = character[0]; - OfflinePlayer player = Bukkit.getOfflinePlayer(name); - boolean old = true; - if (player != null) { - old = (currentTime - player.getLastPlayed()) > PURGE_TIME; + long lastPlayed = StringUtils.getLong(character[37]) * Misc.TIME_CONVERSION_FACTOR; + boolean rewrite = false; + + if (lastPlayed == 0) { + OfflinePlayer player = Bukkit.getOfflinePlayer(name); + lastPlayed = player.getLastPlayed(); + rewrite = true; } - if (!old) { - writer.append(line).append("\r\n"); - } - else { + if (currentTime - lastPlayed > PURGE_TIME) { removedPlayers++; Misc.profileCleanup(name); } + else { + if (rewrite) { + // Rewrite their data with a valid time + character[37] = Long.toString(lastPlayed); + String newLine = org.apache.commons.lang.StringUtils.join(character, ":"); + writer.append(newLine).append("\r\n"); + } + else { + writer.append(line).append("\r\n"); + } + } } // Write the new file From 1731e7ba367943f97fbd43b5edc102585971201c Mon Sep 17 00:00:00 2001 From: riking Date: Wed, 31 Jul 2013 16:12:59 -0700 Subject: [PATCH 2/8] Implement checkStructure() --- .../database/FlatfileDatabaseManager.java | 53 ++++++++++++++++++- 1 file changed, 51 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java b/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java index 6d8728728..069683b3d 100644 --- a/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java +++ b/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java @@ -586,10 +586,59 @@ public final class FlatfileDatabaseManager implements DatabaseManager { String[] character = line.split(":"); // If they're valid, rewrite them to the file. - if (character.length >= 37) { + if (character.length > 38) { writer.append(line).append("\r\n"); + } else if (character.length < 33) { + // Before Version 1.0 - Drop + mcMMO.p.getLogger().warning("Dropping malformed or before version 1.0 line from database - " + line); } else { - // Placeholder, repair row if needed (I.E. when new skills are added and such) + String oldVersion = null; + StringBuilder newLine = new StringBuilder(line); + if (character.length <= 33) { + // Introduction of HUDType + // Version 1.1.06 + // commit 78f79213cdd7190cd11ae54526f3b4ea42078e8a + newLine.append("STANDARD").append(":"); + oldVersion = "1.1.06"; + } + if (character.length <= 35) { + // Introduction of Fishing + // Version 1.2.00 + // commit a814b57311bc7734661109f0e77fc8bab3a0bd29 + newLine.append(0).append(":"); + newLine.append(0).append(":"); + if (oldVersion == null) oldVersion = "1.2.00"; + } + if (character.length <= 36) { + // Introduction of Blast Mining cooldowns + // Version 1.3.00-dev + // commit fadbaf429d6b4764b8f1ad0efaa524a090e82ef5 + newLine.append((int) 0).append(":"); + if (oldVersion == null) oldVersion = "1.3.00"; + } + if (character.length <= 37) { + // Making old-purge work with flatfile + // Version 1.4.00-dev + // commmit 3f6c07ba6aaf44e388cc3b882cac3d8f51d0ac28 + String playerName = character[0]; + // Try to get a accurate time, instead of "right now" + OfflinePlayer player = Bukkit.getOfflinePlayer(playerName); + long time = player.getLastPlayed(); + if (time == 0) { + time = System.currentTimeMillis(); + } + newLine.append(time / Misc.TIME_CONVERSION_FACTOR).append(":"); + if (oldVersion == null) oldVersion = "1.4.00"; + } + if (character.length <= 38) { + // Addition of mob healthbars + // Version 1.4.06 + // commit da29185b7dc7e0d992754bba555576d48fa08aa6 + newLine.append(Config.getInstance().getMobHealthbarDefault().toString()).append(":"); + if (oldVersion == null) oldVersion = "1.4.06"; + } + mcMMO.p.debug("Updating database line for player " + character[0] + " from before version " + oldVersion); + writer.append(newLine).append("\r\n"); } } From f49be46cec2ef18a7d8aede58a675f41899c773a Mon Sep 17 00:00:00 2001 From: riking Date: Wed, 31 Jul 2013 16:53:06 -0700 Subject: [PATCH 3/8] Add check for manual edits leaving out trailing colon --- .../com/gmail/nossr50/database/FlatfileDatabaseManager.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java b/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java index 069683b3d..8c4be2835 100644 --- a/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java +++ b/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java @@ -116,6 +116,10 @@ public final class FlatfileDatabaseManager implements DatabaseManager { String line = ""; while ((line = in.readLine()) != null) { + // Length checks depend on last character being ':' + if (line.charAt(line.length() - 1) != ':') { + line = line + ":"; + } String[] character = line.split(":"); String name = character[0]; long lastPlayed = StringUtils.getLong(character[37]) * Misc.TIME_CONVERSION_FACTOR; From 34f5343c990554e109d8858f968ca1e3269ec39b Mon Sep 17 00:00:00 2001 From: riking Date: Wed, 31 Jul 2013 16:59:10 -0700 Subject: [PATCH 4/8] Add announce boolean for suppressing messages for recent changes --- .../com/gmail/nossr50/database/FlatfileDatabaseManager.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java b/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java index 8c4be2835..8bede9fa3 100644 --- a/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java +++ b/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java @@ -598,6 +598,7 @@ public final class FlatfileDatabaseManager implements DatabaseManager { } else { String oldVersion = null; StringBuilder newLine = new StringBuilder(line); + boolean announce = false; if (character.length <= 33) { // Introduction of HUDType // Version 1.1.06 @@ -632,6 +633,7 @@ public final class FlatfileDatabaseManager implements DatabaseManager { time = System.currentTimeMillis(); } newLine.append(time / Misc.TIME_CONVERSION_FACTOR).append(":"); + announce = true; // TODO move this down if (oldVersion == null) oldVersion = "1.4.00"; } if (character.length <= 38) { @@ -641,7 +643,9 @@ public final class FlatfileDatabaseManager implements DatabaseManager { newLine.append(Config.getInstance().getMobHealthbarDefault().toString()).append(":"); if (oldVersion == null) oldVersion = "1.4.06"; } - mcMMO.p.debug("Updating database line for player " + character[0] + " from before version " + oldVersion); + if (announce) { + mcMMO.p.debug("Updating database line for player " + character[0] + " from before version " + oldVersion); + } writer.append(newLine).append("\r\n"); } } From cb8be8b82f41c535a461f9f40071adcc316595c3 Mon Sep 17 00:00:00 2001 From: riking Date: Wed, 31 Jul 2013 17:27:57 -0700 Subject: [PATCH 5/8] Use Long.parseLong because we have a use for the catch --- .../nossr50/database/FlatfileDatabaseManager.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java b/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java index 8bede9fa3..cc659665d 100644 --- a/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java +++ b/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java @@ -122,13 +122,13 @@ public final class FlatfileDatabaseManager implements DatabaseManager { } String[] character = line.split(":"); String name = character[0]; - long lastPlayed = StringUtils.getLong(character[37]) * Misc.TIME_CONVERSION_FACTOR; + long lastPlayed; boolean rewrite = false; - - if (lastPlayed == 0) { - OfflinePlayer player = Bukkit.getOfflinePlayer(name); - lastPlayed = player.getLastPlayed(); + try { + lastPlayed = Long.parseLong(character[37]) * Misc.TIME_CONVERSION_FACTOR; + } catch (NumberFormatException e) { rewrite = true; + lastPlayed = System.currentTimeMillis(); } if (currentTime - lastPlayed > PURGE_TIME) { From 82f8022f542aa4eb69a4097b42c743fb0a1e0bfd Mon Sep 17 00:00:00 2001 From: riking Date: Wed, 31 Jul 2013 17:43:25 -0700 Subject: [PATCH 6/8] Fix f49be46c - added code to wrong part of file --- .../gmail/nossr50/database/FlatfileDatabaseManager.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java b/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java index cc659665d..8cf21b833 100644 --- a/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java +++ b/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java @@ -116,10 +116,6 @@ public final class FlatfileDatabaseManager implements DatabaseManager { String line = ""; while ((line = in.readLine()) != null) { - // Length checks depend on last character being ':' - if (line.charAt(line.length() - 1) != ':') { - line = line + ":"; - } String[] character = line.split(":"); String name = character[0]; long lastPlayed; @@ -587,6 +583,10 @@ public final class FlatfileDatabaseManager implements DatabaseManager { String line = ""; while ((line = in.readLine()) != null) { + // Length checks depend on last character being ':' + if (line.charAt(line.length() - 1) != ':') { + line = line + ":"; + } String[] character = line.split(":"); // If they're valid, rewrite them to the file. From bbf16d805852de84f0d324e667828662e9d8a604 Mon Sep 17 00:00:00 2001 From: riking Date: Wed, 31 Jul 2013 18:05:05 -0700 Subject: [PATCH 7/8] Move duplicate player checks to checkStructure() --- .../nossr50/database/FlatfileDatabaseManager.java | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java b/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java index 8cf21b833..8226f8771 100644 --- a/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java +++ b/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java @@ -11,6 +11,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; @@ -497,20 +498,12 @@ public final class FlatfileDatabaseManager implements DatabaseManager { try { in = new BufferedReader(new FileReader(usersFilePath)); String line = ""; - ArrayList players = new ArrayList(); while ((line = in.readLine()) != null) { String[] data = line.split(":"); String playerName = data[0]; int powerLevel = 0; - // Prevent the same player from being added multiple times (I'd like to note that this shouldn't happen...) - if (players.contains(playerName)) { - continue; - } - - players.add(playerName); - Map skills = getSkillMapFromLine(data); powerLevel += putStat(acrobatics, playerName, skills.get(SkillType.ACROBATICS)); @@ -581,6 +574,7 @@ public final class FlatfileDatabaseManager implements DatabaseManager { in = new BufferedReader(new FileReader(usersFilePath)); StringBuilder writer = new StringBuilder(); String line = ""; + HashSet players = new HashSet(); while ((line = in.readLine()) != null) { // Length checks depend on last character being ':' @@ -589,6 +583,11 @@ public final class FlatfileDatabaseManager implements DatabaseManager { } String[] character = line.split(":"); + // Prevent the same player from being present multiple times + if (!players.add(character[0])) { + continue; + } + // If they're valid, rewrite them to the file. if (character.length > 38) { writer.append(line).append("\r\n"); From 7d43e7eba5f0fc26608fff2a791fba62a2decc75 Mon Sep 17 00:00:00 2001 From: riking Date: Wed, 7 Aug 2013 10:21:17 -0700 Subject: [PATCH 8/8] Move OfflinePlayer lastPlayed checks to purge --- .../database/FlatfileDatabaseManager.java | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java b/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java index 8226f8771..e6fa858de 100644 --- a/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java +++ b/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java @@ -119,13 +119,16 @@ public final class FlatfileDatabaseManager implements DatabaseManager { while ((line = in.readLine()) != null) { String[] character = line.split(":"); String name = character[0]; - long lastPlayed; + long lastPlayed = 0; boolean rewrite = false; try { lastPlayed = Long.parseLong(character[37]) * Misc.TIME_CONVERSION_FACTOR; } catch (NumberFormatException e) { + } + if (lastPlayed == 0) { + OfflinePlayer player = Bukkit.getOfflinePlayer(name); + lastPlayed = player.getLastPlayed(); rewrite = true; - lastPlayed = System.currentTimeMillis(); } if (currentTime - lastPlayed > PURGE_TIME) { @@ -624,14 +627,9 @@ public final class FlatfileDatabaseManager implements DatabaseManager { // Making old-purge work with flatfile // Version 1.4.00-dev // commmit 3f6c07ba6aaf44e388cc3b882cac3d8f51d0ac28 - String playerName = character[0]; - // Try to get a accurate time, instead of "right now" - OfflinePlayer player = Bukkit.getOfflinePlayer(playerName); - long time = player.getLastPlayed(); - if (time == 0) { - time = System.currentTimeMillis(); - } - newLine.append(time / Misc.TIME_CONVERSION_FACTOR).append(":"); + + // XXX Cannot create an OfflinePlayer at startup, use 0 and fix in purge + newLine.append("0").append(":"); announce = true; // TODO move this down if (oldVersion == null) oldVersion = "1.4.00"; }