From 3486c8a13f931475e348ac9a8a9d299d6f3e245f Mon Sep 17 00:00:00 2001 From: Lennart ten Wolde <0p1q9o2w@hotmail.nl> Date: Tue, 23 Feb 2016 21:58:24 +0100 Subject: [PATCH] Database tweaks --- .../marriage2/commands/CommandUpdate.java | 5 ++ .../marriage2/internal/MarriageCore.java | 9 ++- .../marriage2/internal/data/DataManager.java | 72 +++++++++++-------- .../marriage2/internal/data/MarriageData.java | 23 +++--- .../internal/data/MarriagePlayer.java | 3 - .../marriage2/listeners/DatabaseListener.java | 15 +++- .../bukkit/marriage2/misc/update/Updater.java | 2 +- 7 files changed, 83 insertions(+), 46 deletions(-) diff --git a/src/main/java/com/lenis0012/bukkit/marriage2/commands/CommandUpdate.java b/src/main/java/com/lenis0012/bukkit/marriage2/commands/CommandUpdate.java index d090d95..44694b9 100644 --- a/src/main/java/com/lenis0012/bukkit/marriage2/commands/CommandUpdate.java +++ b/src/main/java/com/lenis0012/bukkit/marriage2/commands/CommandUpdate.java @@ -45,7 +45,12 @@ public class CommandUpdate extends Command { return; } + ItemStack inHand = player.getItemInHand(); player.setItemInHand(changelog); + if(inHand != null) { + player.getInventory().addItem(inHand); + } + reply("&llenis> &bCheck my changelog out! (I put it in your hand)"); player.updateInventory(); } diff --git a/src/main/java/com/lenis0012/bukkit/marriage2/internal/MarriageCore.java b/src/main/java/com/lenis0012/bukkit/marriage2/internal/MarriageCore.java index 507b3e9..077e103 100644 --- a/src/main/java/com/lenis0012/bukkit/marriage2/internal/MarriageCore.java +++ b/src/main/java/com/lenis0012/bukkit/marriage2/internal/MarriageCore.java @@ -84,13 +84,14 @@ public class MarriageCore extends MarriageBase { player = dataManager.loadPlayer(uuid); players.put(uuid, player); } - + return player; } @Override public MData marry(MPlayer player1, MPlayer player2) { - MarriageData mdata = new MarriageData(player1.getUniqueId(), player2.getUniqueId()); + MarriageData mdata = new MarriageData(dataManager, player1.getUniqueId(), player2.getUniqueId()); + mdata.saveAsync(); ((MarriagePlayer) player1).addMarriage(mdata); ((MarriagePlayer) player2).addMarriage(mdata); dataManager.savePlayer((MarriagePlayer) player1); @@ -102,6 +103,10 @@ public class MarriageCore extends MarriageBase { return dataManager.listMarriages(scale, page); } + public void setMPlayer(UUID uuid, MarriagePlayer mp) { + players.put(uuid, mp); + } + public DataManager getDataManager() { return dataManager; } diff --git a/src/main/java/com/lenis0012/bukkit/marriage2/internal/data/DataManager.java b/src/main/java/com/lenis0012/bukkit/marriage2/internal/data/DataManager.java index 6699fb1..b1fef1a 100644 --- a/src/main/java/com/lenis0012/bukkit/marriage2/internal/data/DataManager.java +++ b/src/main/java/com/lenis0012/bukkit/marriage2/internal/data/DataManager.java @@ -15,6 +15,8 @@ import java.util.function.Consumer; import java.util.function.Supplier; import java.util.logging.Level; +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; import com.google.common.collect.Lists; import com.lenis0012.bukkit.marriage2.MPlayer; import com.lenis0012.bukkit.marriage2.misc.LockedReference; @@ -27,6 +29,8 @@ import com.lenis0012.bukkit.marriage2.misc.ListQuery; import org.bukkit.entity.Player; public class DataManager { + // Create a data cache to overlap with the pre join event cache + private final Cache marriageDataCache = CacheBuilder.newBuilder().expireAfterWrite(60L, TimeUnit.SECONDS).build(); private final LockedReference supplier; private final MarriageCore core; private final String prefix; @@ -120,35 +124,39 @@ public class DataManager { player.save(ps); ps.executeUpdate(); } - - // Save marriages - if(player.getMarriage() != null) { - MarriageData mdata = (MarriageData) player.getMarriage(); - ps = connection.prepareStatement(String.format("SELECT * FROM %smarriages WHERE player1=? AND player2=?;", prefix)); - ps.setString(1, mdata.getPlayer1Id().toString()); - ps.setString(2, mdata.getPllayer2Id().toString()); - result = ps.executeQuery(); - if(result.next()) { - // Update existing entry - ps = connection.prepareStatement(String.format( - "UPDATE %smarriages SET player1=?,player2=?,home_world=?,home_x=?,home_y=?,home_z=?,home_yaw=?,home_pitch=?,pvp_enabled=? WHERE id=?;", prefix)); - mdata.save(ps); - ps.setInt(10, mdata.getId()); - ps.executeUpdate(); - } else { - mdata.setSaved(true); - ps = connection.prepareStatement(String.format( - "INSERT INTO %smarriages (player1,player2,home_world,home_x,home_y,home_z,home_yaw,home_pitch,pvp_enabled) VALUES(?,?,?,?,?,?,?,?,?);", prefix)); - mdata.save(ps); - ps.executeUpdate(); - } - } } catch (SQLException e) { - core.getLogger().log(Level.WARNING, "Failed to load player data", e); + core.getLogger().log(Level.WARNING, "Failed to save player data", e); } finally { supplier.finish(); } } + + public void saveMarriage(MarriageData mdata) { + Connection connection = supplier.access(); + try { + PreparedStatement ps = connection.prepareStatement(String.format("SELECT * FROM %smarriages WHERE player1=? AND player2=?;", prefix)); + ps.setString(1, mdata.getPlayer1Id().toString()); + ps.setString(2, mdata.getPllayer2Id().toString()); + ResultSet result = ps.executeQuery(); + if(result.next()) { + // Update existing entry + ps = connection.prepareStatement(String.format( + "UPDATE %smarriages SET player1=?,player2=?,home_world=?,home_x=?,home_y=?,home_z=?,home_yaw=?,home_pitch=?,pvp_enabled=? WHERE id=?;", prefix)); + mdata.save(ps); + ps.setInt(10, mdata.getId()); + ps.executeUpdate(); + } else { + ps = connection.prepareStatement(String.format( + "INSERT INTO %smarriages (player1,player2,home_world,home_x,home_y,home_z,home_yaw,home_pitch,pvp_enabled) VALUES(?,?,?,?,?,?,?,?,?);", prefix)); + mdata.save(ps); + ps.executeUpdate(); + } + } catch (SQLException e) { + core.getLogger().log(Level.WARNING, "Failed to save marriage data", e); + } finally { + supplier.finish(); + } + } private void loadMarriages(Connection connection, MarriagePlayer player, boolean alt) throws SQLException { PreparedStatement ps = connection.prepareStatement(String.format( @@ -158,13 +166,17 @@ public class DataManager { while(result.next()) { UUID partnerId = UUID.fromString(result.getString(alt ? "player1" : "player2")); Player partner = Bukkit.getPlayer(partnerId); + MarriageData data; if(partner != null && partner.isOnline()) { // Copy marriage data from partner to ensure a match. - MPlayer mpartner = core.getMPlayer(partnerId); - player.addMarriage((MarriageData) mpartner.getMarriage()); - } else { - player.addMarriage(new MarriageData(result)); - } + data = (MarriageData) core.getMPlayer(partnerId).getMarriage(); + } else if((data = marriageDataCache.getIfPresent(player.getUniqueId())) == null){ + data = new MarriageData(this, result); + marriageDataCache.put(data.getPlayer1Id(), data); + marriageDataCache.put(data.getPllayer2Id(), data); + } + + player.addMarriage(data); } if(!alt) { @@ -203,7 +215,7 @@ public class DataManager { List list = Lists.newArrayList(); while(result.next()) { - list.add(new MarriageData(result)); + list.add(new MarriageData(this, result)); } return new ListQuery(pages, page, list); diff --git a/src/main/java/com/lenis0012/bukkit/marriage2/internal/data/MarriageData.java b/src/main/java/com/lenis0012/bukkit/marriage2/internal/data/MarriageData.java index 7574b05..09c7230 100644 --- a/src/main/java/com/lenis0012/bukkit/marriage2/internal/data/MarriageData.java +++ b/src/main/java/com/lenis0012/bukkit/marriage2/internal/data/MarriageData.java @@ -5,12 +5,14 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.util.UUID; +import com.lenis0012.bukkit.marriage2.internal.MarriagePlugin; import org.bukkit.Bukkit; import org.bukkit.Location; import com.lenis0012.bukkit.marriage2.MData; public class MarriageData implements MData { + private final DataManager dataManager; private final UUID player1; private final UUID player2; private Location home; @@ -18,12 +20,14 @@ public class MarriageData implements MData { private int id = -1; private boolean saved = false; - public MarriageData(UUID player1, UUID player2) { + public MarriageData(DataManager dataManager, UUID player1, UUID player2) { + this.dataManager = dataManager; this.player1 = player1; this.player2 = player2; } - public MarriageData(ResultSet data) throws SQLException { + public MarriageData(DataManager dataManager, ResultSet data) throws SQLException { + this.dataManager = dataManager; this.id = data.getInt("id"); this.player1 = UUID.fromString(data.getString("player1")); this.player2 = UUID.fromString(data.getString("player2")); @@ -84,6 +88,7 @@ public class MarriageData implements MData { @Override public void setHome(Location home) { this.home = home; + saveAsync(); } @Override @@ -99,6 +104,7 @@ public class MarriageData implements MData { @Override public void setPVPEnabled(boolean pvpEnabled) { this.pvpEnabled = pvpEnabled; + saveAsync(); } @Override @@ -107,11 +113,12 @@ public class MarriageData implements MData { return me.toString().equalsIgnoreCase(player1.toString()) ? player2 : player1; } - public boolean isSaved() { - return saved; - } - - public void setSaved(boolean saved) { - this.saved = saved; + public void saveAsync() { + Bukkit.getScheduler().runTaskAsynchronously(MarriagePlugin.getInstance().getPlugin(), new Runnable() { + @Override + public void run() { + dataManager.saveMarriage(MarriageData.this); + } + }); } } \ No newline at end of file diff --git a/src/main/java/com/lenis0012/bukkit/marriage2/internal/data/MarriagePlayer.java b/src/main/java/com/lenis0012/bukkit/marriage2/internal/data/MarriagePlayer.java index 9c2c418..234c830 100644 --- a/src/main/java/com/lenis0012/bukkit/marriage2/internal/data/MarriagePlayer.java +++ b/src/main/java/com/lenis0012/bukkit/marriage2/internal/data/MarriagePlayer.java @@ -3,12 +3,9 @@ package com.lenis0012.bukkit.marriage2.internal.data; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; -import java.util.List; import java.util.UUID; import java.util.concurrent.TimeUnit; -import com.google.common.collect.Lists; - import com.lenis0012.bukkit.marriage2.Gender; import com.lenis0012.bukkit.marriage2.MData; import com.lenis0012.bukkit.marriage2.MPlayer; diff --git a/src/main/java/com/lenis0012/bukkit/marriage2/listeners/DatabaseListener.java b/src/main/java/com/lenis0012/bukkit/marriage2/listeners/DatabaseListener.java index 16672f8..e3b4f34 100644 --- a/src/main/java/com/lenis0012/bukkit/marriage2/listeners/DatabaseListener.java +++ b/src/main/java/com/lenis0012/bukkit/marriage2/listeners/DatabaseListener.java @@ -1,5 +1,11 @@ package com.lenis0012.bukkit.marriage2.listeners; +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; +import com.lenis0012.bukkit.marriage2.MPlayer; +import com.lenis0012.bukkit.marriage2.internal.data.MarriagePlayer; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -11,7 +17,11 @@ import org.bukkit.event.player.PlayerQuitEvent; import com.lenis0012.bukkit.marriage2.internal.MarriageCore; +import java.util.UUID; +import java.util.concurrent.TimeUnit; + public class DatabaseListener implements Listener { + private final Cache cache = CacheBuilder.newBuilder().expireAfterWrite(30L, TimeUnit.SECONDS).build(); private final MarriageCore core; public DatabaseListener(MarriageCore core) { @@ -21,13 +31,14 @@ public class DatabaseListener implements Listener { @EventHandler(priority = EventPriority.MONITOR) public void onPlayerLogin(AsyncPlayerPreLoginEvent event) { if(event.getLoginResult() == Result.ALLOWED) { - core.getMPlayer(event.getUniqueId()); + cache.put(event.getUniqueId(), core.getDataManager().loadPlayer(event.getUniqueId())); } } @EventHandler(priority = EventPriority.LOWEST) public void onPlayerJoin(PlayerJoinEvent event) { - core.getMPlayer(event.getPlayer().getUniqueId()); + final UUID userId = event.getPlayer().getUniqueId(); + core.setMPlayer(userId, cache.getIfPresent(userId)); } @EventHandler diff --git a/src/main/java/com/lenis0012/bukkit/marriage2/misc/update/Updater.java b/src/main/java/com/lenis0012/bukkit/marriage2/misc/update/Updater.java index f125bad..ed82677 100644 --- a/src/main/java/com/lenis0012/bukkit/marriage2/misc/update/Updater.java +++ b/src/main/java/com/lenis0012/bukkit/marriage2/misc/update/Updater.java @@ -49,7 +49,7 @@ public class Updater { if(updateFile.exists()) { BConfig config = new BConfig(core, updateFile); this.apiKey = config.get("api-key", String.class); - this.enabled = !config.getOrDefault("disable", false); +// this.enabled = !config.getOrDefault("disable", false); } }