Created
July 30, 2013 19:44
-
-
Save riking/6116236 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java b/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java | |
index 9a03c3a..1f1f156 100644 | |
--- a/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java | |
+++ b/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java | |
@@ -13,9 +13,12 @@ import java.util.Comparator; | |
import java.util.HashMap; | |
import java.util.List; | |
import java.util.Map; | |
+import java.util.concurrent.Callable; | |
+import java.util.concurrent.ExecutionException; | |
import org.bukkit.Bukkit; | |
import org.bukkit.OfflinePlayer; | |
+import org.bukkit.entity.Player; | |
import com.gmail.nossr50.mcMMO; | |
import com.gmail.nossr50.config.Config; | |
@@ -51,6 +54,26 @@ public final class FlatfileDatabaseManager implements DatabaseManager { | |
FileWriter out = null; | |
String usersFilePath = mcMMO.getUsersFilePath(); | |
+ List<String> onlinePlayers = Collections.EMPTY_LIST; | |
+ try { | |
+ onlinePlayers = Bukkit.getScheduler().callSyncMethod(mcMMO.p, new Callable<List<String>>() { | |
+ @Override | |
+ public List<String> call() { | |
+ Player[] players = Bukkit.getOnlinePlayers(); | |
+ if (players.length == 0) { | |
+ return null; | |
+ } | |
+ ArrayList<String> names = new ArrayList<String>(); | |
+ for (Player p : players) { | |
+ names.add(p.getName()); | |
+ } | |
+ return names; | |
+ } | |
+ }).get(); | |
+ } catch (InterruptedException e1) { | |
+ } catch (ExecutionException e1) { | |
+ } | |
+ | |
// This code is O(n) instead of O(n²) | |
synchronized (fileWritingLock) { | |
try { | |
@@ -60,6 +83,11 @@ public final class FlatfileDatabaseManager implements DatabaseManager { | |
while ((line = in.readLine()) != null) { | |
String[] character = line.split(":"); | |
+ if (onlinePlayers.contains(character[0])) { | |
+ // Skip | |
+ writer.append(line).append("\r\n"); | |
+ continue; | |
+ } | |
Map<SkillType, Integer> skills = getSkillMapFromLine(character); | |
boolean powerless = true; | |
diff --git a/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java b/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java | |
index b0faac7..230793a 100644 | |
--- a/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java | |
+++ b/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java | |
@@ -8,12 +8,19 @@ import java.sql.SQLException; | |
import java.sql.Statement; | |
import java.util.ArrayList; | |
import java.util.Collection; | |
+import java.util.Collections; | |
import java.util.HashMap; | |
import java.util.List; | |
import java.util.Map; | |
import java.util.Properties; | |
+import java.util.concurrent.Callable; | |
+import java.util.concurrent.ExecutionException; | |
+import java.util.concurrent.Future; | |
import java.util.logging.Level; | |
+import org.bukkit.Bukkit; | |
+import org.bukkit.entity.Player; | |
+ | |
import com.gmail.nossr50.mcMMO; | |
import com.gmail.nossr50.config.Config; | |
import com.gmail.nossr50.datatypes.MobHealthbarType; | |
@@ -58,6 +65,21 @@ public final class SQLDatabaseManager implements DatabaseManager { | |
checkConnected(); | |
mcMMO.p.getLogger().info("Purging powerless users..."); | |
+ Future<List<String>> future = Bukkit.getScheduler().callSyncMethod(mcMMO.p, new Callable<List<String>>() { | |
+ @Override | |
+ public List<String> call() { | |
+ Player[] players = Bukkit.getOnlinePlayers(); | |
+ if (players.length == 0) { | |
+ return null; | |
+ } | |
+ ArrayList<String> names = new ArrayList<String>(); | |
+ for (Player p : players) { | |
+ names.add(p.getName()); | |
+ } | |
+ return names; | |
+ } | |
+ }); | |
+ | |
Collection<ArrayList<String>> usernames = read("SELECT u.user FROM " + tablePrefix + "skills AS s, " + tablePrefix + "users AS u WHERE s.user_id = u.id AND (s.taming+s.mining+s.woodcutting+s.repair+s.unarmed+s.herbalism+s.excavation+s.archery+s.swords+s.axes+s.acrobatics+s.fishing) = 0").values(); | |
write("DELETE FROM u, e, h, s, c USING " + tablePrefix + "users u " + | |
@@ -67,7 +89,7 @@ public final class SQLDatabaseManager implements DatabaseManager { | |
"JOIN " + tablePrefix + "cooldowns c ON (u.id = c.user_id) " + | |
"WHERE (s.taming+s.mining+s.woodcutting+s.repair+s.unarmed+s.herbalism+s.excavation+s.archery+s.swords+s.axes+s.acrobatics+s.fishing) = 0"); | |
- processPurge(usernames); | |
+ processPurge(usernames, future); | |
mcMMO.p.getLogger().info("Purged " + usernames.size() + " users from the database."); | |
} | |
@@ -86,7 +108,7 @@ public final class SQLDatabaseManager implements DatabaseManager { | |
"JOIN " + tablePrefix + "cooldowns c ON (u.id = c.user_id) " + | |
"WHERE ((" + currentTime + " - lastlogin * " + Misc.TIME_CONVERSION_FACTOR + ") > " + PURGE_TIME + ")"); | |
- processPurge(usernames); | |
+ processPurge(usernames, null); | |
mcMMO.p.getLogger().info("Purged " + usernames.size() + " users from the database.");; | |
} | |
@@ -984,9 +1006,22 @@ public final class SQLDatabaseManager implements DatabaseManager { | |
} | |
} | |
- private void processPurge(Collection<ArrayList<String>> usernames) { | |
- for (ArrayList<String> user : usernames) { | |
- Misc.profileCleanup(user.get(0)); | |
+ private void processPurge(Collection<ArrayList<String>> usernames, Future<List<String>> skipFuture) { | |
+ try { | |
+ List<String> online; | |
+ if (skipFuture != null) { | |
+ online = skipFuture.get(); | |
+ } else { | |
+ online = Collections.EMPTY_LIST; | |
+ } | |
+ | |
+ for (ArrayList<String> user : usernames) { | |
+ if (!online.contains(user)) { | |
+ Misc.profileCleanup(user.get(0)); | |
+ } | |
+ } | |
+ } catch (InterruptedException e) { | |
+ } catch (ExecutionException e) { | |
} | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment