Skip to content

Instantly share code, notes, and snippets.

@riking
Created July 30, 2013 19:44
Show Gist options
  • Save riking/6116236 to your computer and use it in GitHub Desktop.
Save riking/6116236 to your computer and use it in GitHub Desktop.
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