diff --git a/pom.xml b/pom.xml index 4244e50..4069585 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 at.pcgamingfreaks MinePacks - 1.11 + 1.11.1 in-project diff --git a/src/at/pcgamingfreaks/georgh/MinePacks/Database/Config.java b/src/at/pcgamingfreaks/georgh/MinePacks/Database/Config.java index b2566f9..23ceb37 100644 --- a/src/at/pcgamingfreaks/georgh/MinePacks/Database/Config.java +++ b/src/at/pcgamingfreaks/georgh/MinePacks/Database/Config.java @@ -31,7 +31,7 @@ public class Config { private MinePacks MP; private FileConfiguration config; - private static final int CONFIG_VERSION = 5; + private static final int CONFIG_VERSION = 6; public Config(MinePacks mp) { @@ -85,24 +85,26 @@ private void NewConfig(File file) config.set("BackpackTitle", ChatColor.AQUA + "%s Backpack"); config.set("command_cooldown", -1); config.set("drop_on_death", true); - config.set("Language","en"); + config.set("Language", "en"); config.set("LanguageUpdateMode","Overwrite"); config.set("Database.Type","sqlite"); config.set("Database.UpdatePlayer", true); + config.set("Database.AutoCleanup.MaxInactiveDays", -1); config.set("Database.UseUUIDs", Bukkit.getServer().getOnlineMode() && UUIDComp()); config.set("Database.UseUUIDSeparators", false); - config.set("Database.MySQL.Host", "localhost:3306"); - config.set("Database.MySQL.Database", "minecraft"); - config.set("Database.MySQL.User", "minecraft"); - config.set("Database.MySQL.Password", "minecraft"); - config.set("Database.Tables.User", "backpack_players"); - config.set("Database.Tables.Backpack", "backpacks"); - config.set("Database.Tables.Fields.User.Player_ID", "player_id"); - config.set("Database.Tables.Fields.User.Name", "name"); - config.set("Database.Tables.Fields.User.UUID", "uuid"); - config.set("Database.Tables.Fields.Backpack.Owner_ID", "owner"); - config.set("Database.Tables.Fields.Backpack.ItemStacks", "itemstacks"); - config.set("Database.Tables.Fields.Backpack.Version", "version"); + config.set("Database.MySQL.Host", "localhost:3306"); + config.set("Database.MySQL.Database", "minecraft"); + config.set("Database.MySQL.User", "minecraft"); + config.set("Database.MySQL.Password", "minecraft"); + config.set("Database.Tables.User", "backpack_players"); + config.set("Database.Tables.Backpack", "backpacks"); + config.set("Database.Tables.Fields.User.Player_ID", "player_id"); + config.set("Database.Tables.Fields.User.Name", "name"); + config.set("Database.Tables.Fields.User.UUID", "uuid"); + config.set("Database.Tables.Fields.Backpack.Owner_ID", "owner"); + config.set("Database.Tables.Fields.Backpack.ItemStacks", "itemstacks"); + config.set("Database.Tables.Fields.Backpack.Version", "version"); + config.set("Database.Tables.Fields.Backpack.LastUpdate", "lastupdate"); config.set("auto-update", true); config.set("Version",CONFIG_VERSION); @@ -128,10 +130,16 @@ private boolean UpdateConfig(File file) config.set("Database.Tables.Fields.Backpack.Owner_ID", "owner"); config.set("Database.Tables.Fields.Backpack.ItemStacks", "itemstacks"); config.set("Database.Tables.Fields.Backpack.Version", "version"); - case 2: config.set("Database.UseUUIDSeparators", false); - case 3: config.set("auto-update", true); - case 4: config.set("command_cooldown", -1); - break; + case 2: + config.set("Database.UseUUIDSeparators", false); + case 3: + config.set("auto-update", true); + case 4: + config.set("command_cooldown", -1); + case 5: + config.set("Database.AutoCleanup.MaxInactiveDays", -1); + config.set("Database.Tables.Fields.Backpack.LastUpdate", "lastupdate"); + break; case CONFIG_VERSION: return false; default: MP.log.info("Config File Version newer than expected!"); return false; } @@ -159,6 +167,11 @@ public String GetLanguageUpdateMode() return config.getString("LanguageUpdateMode"); } + public int GetAutoCleanupMaxInactiveDays() + { + return config.getInt("Database.AutoCleanup.MaxInactiveDays", -1); + } + public String GetDatabaseType() { return config.getString("Database.Type"); diff --git a/src/at/pcgamingfreaks/georgh/MinePacks/Database/Database.java b/src/at/pcgamingfreaks/georgh/MinePacks/Database/Database.java index 1d0b72f..938a3ad 100644 --- a/src/at/pcgamingfreaks/georgh/MinePacks/Database/Database.java +++ b/src/at/pcgamingfreaks/georgh/MinePacks/Database/Database.java @@ -31,6 +31,7 @@ public class Database protected MinePacks plugin; protected boolean UseUUIDs, UseUUIDSeparators; + protected long maxAge; private HashSet backpacks = new HashSet(); protected ItemStackSerializer itsSerializer = new ItemStackSerializer(); @@ -38,8 +39,9 @@ public class Database public Database(MinePacks mp) { plugin = mp; - UseUUIDSeparators = plugin.config.getUseUUIDSeparators(); - UseUUIDs = plugin.config.UseUUIDs(); + UseUUIDSeparators = plugin.config.getUseUUIDSeparators(); + UseUUIDs = plugin.config.UseUUIDs(); + maxAge = plugin.config.GetAutoCleanupMaxInactiveDays(); } public void Close() { } diff --git a/src/at/pcgamingfreaks/georgh/MinePacks/Database/Files.java b/src/at/pcgamingfreaks/georgh/MinePacks/Database/Files.java index c19c250..0986054 100644 --- a/src/at/pcgamingfreaks/georgh/MinePacks/Database/Files.java +++ b/src/at/pcgamingfreaks/georgh/MinePacks/Database/Files.java @@ -21,6 +21,7 @@ import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.FilenameFilter; +import java.util.Date; import javax.swing.filechooser.FileFilter; @@ -37,6 +38,7 @@ public class Files extends Database public Files(MinePacks mp) { super(mp); + maxAge *= 24 * 3600000L; saveFolder = new File(plugin.getDataFolder(), "backpacks"); if(!saveFolder.exists()) { @@ -44,16 +46,21 @@ public Files(MinePacks mp) } else { - CheckFileNames(); + CheckFiles(); } } - private void CheckFileNames() + private void CheckFiles() { File[] allFiles = saveFolder.listFiles(new BackpackFileFilter()); int len; for (File file : allFiles) { + if(maxAge > 0 && (new Date()).getTime() - file.lastModified() > maxAge) // Check if the file is older then x days + { + file.delete(); // Delete old files + continue; // We don't have to check if the file name is correct cause we have the delted the file + } len = file.getName().length() - ext.length(); if(UseUUIDs) // Use UUID-based saving { diff --git a/src/at/pcgamingfreaks/georgh/MinePacks/Database/MySQL.java b/src/at/pcgamingfreaks/georgh/MinePacks/Database/MySQL.java index 007cdec..0f101c8 100644 --- a/src/at/pcgamingfreaks/georgh/MinePacks/Database/MySQL.java +++ b/src/at/pcgamingfreaks/georgh/MinePacks/Database/MySQL.java @@ -46,6 +46,18 @@ public MySQL(MinePacks mp) // Fire DB request every 10 minutes to keep database connection alive plugin.getServer().getScheduler().scheduleSyncRepeatingTask(plugin, new Runnable(){ @Override public void run() { try { GetConnection().createStatement().execute("SELECT 1"); } catch(Exception e) { } }}, 600*20, 600*20); + + if(maxAge > 0) + { + try + { + GetConnection().createStatement().execute("DELETE FROM `" + Table_Backpacks + "` WHERE `" + Field_BPLastUpdate + "` + INTERVAL " + maxAge + " day < NOW()"); + } + catch (SQLException e) + { + e.printStackTrace(); + } + } } protected void CheckUUIDs() @@ -143,7 +155,8 @@ protected void CheckDB() { Statement stmt = GetConnection().createStatement(); ResultSet res; - stmt.execute("CREATE TABLE IF NOT EXISTS `" + Table_Players + "` (`" + Field_PlayerID + "` INT UNSIGNED NOT NULL AUTO_INCREMENT,`" + Field_Name + "` CHAR(16) NOT NULL UNIQUE" + ((UseUUIDs) ? ",`" + Field_UUID + "` CHAR(36) UNIQUE" : "") + ", PRIMARY KEY (`" + Field_PlayerID + "`));"); + stmt.execute("CREATE TABLE IF NOT EXISTS `" + Table_Players + "` (`" + Field_PlayerID + "` INT UNSIGNED NOT NULL AUTO_INCREMENT,`" + Field_Name + "` CHAR(16) NOT NULL UNIQUE" + + ((UseUUIDs) ? ",`" + Field_UUID + "` CHAR(36) UNIQUE" : "") + ", PRIMARY KEY (`" + Field_PlayerID + "`));"); if(UseUUIDs) { res = stmt.executeQuery("SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = '" + Table_Players + "' AND COLUMN_NAME = '" + Field_UUID + "';"); @@ -162,12 +175,22 @@ protected void CheckDB() } res.close(); } - stmt.execute("CREATE TABLE IF NOT EXISTS `" + Table_Backpacks + "` (`" + Field_BPOwner + "` INT UNSIGNED NOT NULL, `" + Field_BPITS + "` BLOB, `" + Field_BPVersion + "` INT DEFAULT 0, PRIMARY KEY (`" + Field_BPOwner + "`));"); + stmt.execute("CREATE TABLE IF NOT EXISTS `" + Table_Backpacks + "` (`" + Field_BPOwner + "` INT UNSIGNED NOT NULL, `" + Field_BPITS + "` BLOB, `" + + Field_BPVersion + "` INT DEFAULT 0, " + ((maxAge > 0) ? "`" + Field_BPLastUpdate + "` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, " : "") + "PRIMARY KEY (`" + Field_BPOwner + "`));"); res = stmt.executeQuery("SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = '" + Table_Backpacks + "' AND COLUMN_NAME = '" + Field_BPVersion + "';"); if(!res.next()) { stmt.execute("ALTER TABLE `" + Table_Backpacks + "` ADD COLUMN `" + Field_BPVersion + "` INT DEFAULT 0;"); } + if(maxAge > 0) + { + res = stmt.executeQuery("SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = '" + Table_Backpacks + "' AND COLUMN_NAME = '" + Field_BPLastUpdate + "';"); + if(!res.next()) + { + stmt.execute("ALTER TABLE `" + Table_Backpacks + "` ADD COLUMN `" + Field_BPLastUpdate + "` TIMESTAMP DEFAULT CURRENT_TIMESTAMP;"); + } + res.close(); + } stmt.close(); } catch (SQLException e) @@ -176,6 +199,12 @@ protected void CheckDB() } } + protected void AddDateFieldToQuery() + { + Query_InsertBP = ") VALUES ("; + Query_UpdateBP = ",`" + Field_BPLastUpdate + "`=NOW()"; + } + // Plugin Functions public void UpdatePlayer(final Player player) { diff --git a/src/at/pcgamingfreaks/georgh/MinePacks/Database/SQL.java b/src/at/pcgamingfreaks/georgh/MinePacks/Database/SQL.java index 7abb96e..2b18459 100644 --- a/src/at/pcgamingfreaks/georgh/MinePacks/Database/SQL.java +++ b/src/at/pcgamingfreaks/georgh/MinePacks/Database/SQL.java @@ -34,7 +34,7 @@ public class SQL extends Database protected Connection conn = null; protected String Table_Players, Table_Backpacks; // Table Names - protected String Field_Name, Field_PlayerID, Field_UUID, Field_BPOwner, Field_BPITS, Field_BPVersion; // Table Fields + protected String Field_Name, Field_PlayerID, Field_UUID, Field_BPOwner, Field_BPITS, Field_BPVersion, Field_BPLastUpdate; // Table Fields protected String Query_UpdatePlayerGet, Query_UpdatePlayerUUID, Query_UpdatePlayerAdd, Query_GetPlayerID, Query_InsertBP, Query_UpdateBP, Query_GetBP; // DB Querys protected boolean UpdatePlayer; @@ -42,15 +42,16 @@ public SQL(MinePacks mp) { super(mp); // Load Settings - Table_Players = plugin.config.getUserTable(); - Table_Backpacks = plugin.config.getBackpackTable(); - Field_PlayerID = plugin.config.getDBFields("User.Player_ID"); - Field_Name = plugin.config.getDBFields("User.Name"); - Field_UUID = plugin.config.getDBFields("User.UUID"); - Field_BPOwner = plugin.config.getDBFields("Backpack.Owner_ID"); - Field_BPITS = plugin.config.getDBFields("Backpack.ItemStacks"); - Field_BPVersion = plugin.config.getDBFields("Backpack.Version"); - UpdatePlayer = plugin.config.getUpdatePlayer(); + Table_Players = plugin.config.getUserTable(); + Table_Backpacks = plugin.config.getBackpackTable(); + Field_PlayerID = plugin.config.getDBFields("User.Player_ID"); + Field_Name = plugin.config.getDBFields("User.Name"); + Field_UUID = plugin.config.getDBFields("User.UUID"); + Field_BPOwner = plugin.config.getDBFields("Backpack.Owner_ID"); + Field_BPITS = plugin.config.getDBFields("Backpack.ItemStacks"); + Field_BPVersion = plugin.config.getDBFields("Backpack.Version"); + Field_BPLastUpdate = plugin.config.getDBFields("Backpack.LastUpdate"); + UpdatePlayer = plugin.config.getUpdatePlayer(); } public void Close() @@ -79,8 +80,24 @@ protected void BuildQuerys() Query_GetPlayerID = "SELECT `" + Field_PlayerID + "` FROM `" + Table_Players + "` WHERE `" + Field_Name + "`=?;"; Query_GetBP = "SELECT `" + Field_BPOwner + "`,`" + Field_BPITS + "`,`" + Field_BPVersion + "` FROM `" + Table_Backpacks + "` INNER JOIN `" + Table_Players + "` ON `" + Table_Backpacks + "`.`" + Field_BPOwner + "`=`" + Table_Players + "`.`" + Field_PlayerID + "` WHERE `" + Field_Name + "`=?;"; } - Query_InsertBP = "INSERT INTO `" + Table_Backpacks + "` (`" + Field_BPOwner + "`, `" + Field_BPITS + "`, `" + Field_BPVersion + "`) VALUES (?,?,?);"; - Query_UpdateBP = "UPDATE `" + Table_Backpacks + "` SET `" + Field_BPITS + "`=?,`" + Field_BPVersion + "`=? WHERE `" + Field_BPOwner + "`=?;"; + Query_InsertBP = "INSERT INTO `" + Table_Backpacks + "` (`" + Field_BPOwner + "`, `" + Field_BPITS + "`, `" + Field_BPVersion + "`"; + Query_UpdateBP = "UPDATE `" + Table_Backpacks + "` SET `" + Field_BPITS + "`=?,`" + Field_BPVersion + "`=?"; + if(maxAge < 1) + { + Query_InsertBP += ") VALUES ("; + } + else + { + AddDateFieldToQuery(); + } + Query_InsertBP += "?,?,?);"; + Query_UpdateBP += " WHERE `" + Field_BPOwner + "`=?;"; + } + + protected void AddDateFieldToQuery() // Will be overwriten by the used DB System + { + Query_InsertBP = ", `" + Field_BPLastUpdate + "`) VALUES (?,"; + Query_UpdateBP = ",`" + Field_BPLastUpdate + "`=?"; } protected void CheckUUIDs() { } diff --git a/src/at/pcgamingfreaks/georgh/MinePacks/Database/SQLite.java b/src/at/pcgamingfreaks/georgh/MinePacks/Database/SQLite.java index 1a2bd1e..b1cc954 100644 --- a/src/at/pcgamingfreaks/georgh/MinePacks/Database/SQLite.java +++ b/src/at/pcgamingfreaks/georgh/MinePacks/Database/SQLite.java @@ -40,6 +40,7 @@ public SQLite(MinePacks mp) Field_BPOwner = "owner"; Field_BPITS = "itemstacks"; Field_BPVersion = "version"; + Field_BPLastUpdate = "lastupdate"; Table_Players = "backpack_players"; Table_Backpacks = "backpacks"; @@ -52,6 +53,18 @@ public SQLite(MinePacks mp) { CheckUUIDs(); // Check if there are user accounts without UUID } + + if(maxAge > 0) + { + try + { + GetConnection().createStatement().execute("DELETE FROM `" + Table_Backpacks + "` WHERE `" + Field_BPLastUpdate + "` < DATE('now', '-" + maxAge + " days')"); + } + catch (SQLException e) + { + e.printStackTrace(); + } + } } protected Connection GetConnection() @@ -98,6 +111,16 @@ protected void CheckDB() stmt.execute("ALTER TABLE `" + Table_Backpacks + "` ADD COLUMN `version` INT DEFAULT 0;"); } catch(SQLException e) { } + if(maxAge > 0) + { + try + { + ResultSet rs = stmt.executeQuery("SELECT DATE('now');"); + rs.next(); + stmt.execute("ALTER TABLE `" + Table_Backpacks + "` ADD COLUMN `lastupdate` DATE DEFAULT '" + rs.getString(1) + "';"); + } + catch(SQLException e) { } + } stmt.close(); } catch (SQLException e) @@ -135,4 +158,10 @@ protected void CheckUUIDs() e.printStackTrace(); } } + + protected void AddDateFieldToQuery() + { + Query_InsertBP = ") VALUES ("; + Query_UpdateBP = ",`" + Field_BPLastUpdate + "`=DATE('now')"; + } } \ No newline at end of file