Database tweaks

This commit is contained in:
Lennart ten Wolde 2016-02-23 21:58:24 +01:00
parent bdd9074d0f
commit 3486c8a13f
7 changed files with 83 additions and 46 deletions

View file

@ -45,7 +45,12 @@ public class CommandUpdate extends Command {
return; return;
} }
ItemStack inHand = player.getItemInHand();
player.setItemInHand(changelog); player.setItemInHand(changelog);
if(inHand != null) {
player.getInventory().addItem(inHand);
}
reply("&llenis> &bCheck my changelog out! (I put it in your hand)"); reply("&llenis> &bCheck my changelog out! (I put it in your hand)");
player.updateInventory(); player.updateInventory();
} }

View file

@ -84,13 +84,14 @@ public class MarriageCore extends MarriageBase {
player = dataManager.loadPlayer(uuid); player = dataManager.loadPlayer(uuid);
players.put(uuid, player); players.put(uuid, player);
} }
return player; return player;
} }
@Override @Override
public MData marry(MPlayer player1, MPlayer player2) { 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) player1).addMarriage(mdata);
((MarriagePlayer) player2).addMarriage(mdata); ((MarriagePlayer) player2).addMarriage(mdata);
dataManager.savePlayer((MarriagePlayer) player1); dataManager.savePlayer((MarriagePlayer) player1);
@ -102,6 +103,10 @@ public class MarriageCore extends MarriageBase {
return dataManager.listMarriages(scale, page); return dataManager.listMarriages(scale, page);
} }
public void setMPlayer(UUID uuid, MarriagePlayer mp) {
players.put(uuid, mp);
}
public DataManager getDataManager() { public DataManager getDataManager() {
return dataManager; return dataManager;
} }

View file

@ -15,6 +15,8 @@ import java.util.function.Consumer;
import java.util.function.Supplier; import java.util.function.Supplier;
import java.util.logging.Level; 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.google.common.collect.Lists;
import com.lenis0012.bukkit.marriage2.MPlayer; import com.lenis0012.bukkit.marriage2.MPlayer;
import com.lenis0012.bukkit.marriage2.misc.LockedReference; import com.lenis0012.bukkit.marriage2.misc.LockedReference;
@ -27,6 +29,8 @@ import com.lenis0012.bukkit.marriage2.misc.ListQuery;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
public class DataManager { public class DataManager {
// Create a data cache to overlap with the pre join event cache
private final Cache<UUID, MarriageData> marriageDataCache = CacheBuilder.newBuilder().expireAfterWrite(60L, TimeUnit.SECONDS).build();
private final LockedReference<Connection> supplier; private final LockedReference<Connection> supplier;
private final MarriageCore core; private final MarriageCore core;
private final String prefix; private final String prefix;
@ -120,35 +124,39 @@ public class DataManager {
player.save(ps); player.save(ps);
ps.executeUpdate(); 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) { } 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 { } finally {
supplier.finish(); 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 { private void loadMarriages(Connection connection, MarriagePlayer player, boolean alt) throws SQLException {
PreparedStatement ps = connection.prepareStatement(String.format( PreparedStatement ps = connection.prepareStatement(String.format(
@ -158,13 +166,17 @@ public class DataManager {
while(result.next()) { while(result.next()) {
UUID partnerId = UUID.fromString(result.getString(alt ? "player1" : "player2")); UUID partnerId = UUID.fromString(result.getString(alt ? "player1" : "player2"));
Player partner = Bukkit.getPlayer(partnerId); Player partner = Bukkit.getPlayer(partnerId);
MarriageData data;
if(partner != null && partner.isOnline()) { if(partner != null && partner.isOnline()) {
// Copy marriage data from partner to ensure a match. // Copy marriage data from partner to ensure a match.
MPlayer mpartner = core.getMPlayer(partnerId); data = (MarriageData) core.getMPlayer(partnerId).getMarriage();
player.addMarriage((MarriageData) mpartner.getMarriage()); } else if((data = marriageDataCache.getIfPresent(player.getUniqueId())) == null){
} else { data = new MarriageData(this, result);
player.addMarriage(new MarriageData(result)); marriageDataCache.put(data.getPlayer1Id(), data);
} marriageDataCache.put(data.getPllayer2Id(), data);
}
player.addMarriage(data);
} }
if(!alt) { if(!alt) {
@ -203,7 +215,7 @@ public class DataManager {
List<MData> list = Lists.newArrayList(); List<MData> list = Lists.newArrayList();
while(result.next()) { while(result.next()) {
list.add(new MarriageData(result)); list.add(new MarriageData(this, result));
} }
return new ListQuery(pages, page, list); return new ListQuery(pages, page, list);

View file

@ -5,12 +5,14 @@ import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.UUID; import java.util.UUID;
import com.lenis0012.bukkit.marriage2.internal.MarriagePlugin;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Location; import org.bukkit.Location;
import com.lenis0012.bukkit.marriage2.MData; import com.lenis0012.bukkit.marriage2.MData;
public class MarriageData implements MData { public class MarriageData implements MData {
private final DataManager dataManager;
private final UUID player1; private final UUID player1;
private final UUID player2; private final UUID player2;
private Location home; private Location home;
@ -18,12 +20,14 @@ public class MarriageData implements MData {
private int id = -1; private int id = -1;
private boolean saved = false; 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.player1 = player1;
this.player2 = player2; 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.id = data.getInt("id");
this.player1 = UUID.fromString(data.getString("player1")); this.player1 = UUID.fromString(data.getString("player1"));
this.player2 = UUID.fromString(data.getString("player2")); this.player2 = UUID.fromString(data.getString("player2"));
@ -84,6 +88,7 @@ public class MarriageData implements MData {
@Override @Override
public void setHome(Location home) { public void setHome(Location home) {
this.home = home; this.home = home;
saveAsync();
} }
@Override @Override
@ -99,6 +104,7 @@ public class MarriageData implements MData {
@Override @Override
public void setPVPEnabled(boolean pvpEnabled) { public void setPVPEnabled(boolean pvpEnabled) {
this.pvpEnabled = pvpEnabled; this.pvpEnabled = pvpEnabled;
saveAsync();
} }
@Override @Override
@ -107,11 +113,12 @@ public class MarriageData implements MData {
return me.toString().equalsIgnoreCase(player1.toString()) ? player2 : player1; return me.toString().equalsIgnoreCase(player1.toString()) ? player2 : player1;
} }
public boolean isSaved() { public void saveAsync() {
return saved; Bukkit.getScheduler().runTaskAsynchronously(MarriagePlugin.getInstance().getPlugin(), new Runnable() {
} @Override
public void run() {
public void setSaved(boolean saved) { dataManager.saveMarriage(MarriageData.this);
this.saved = saved; }
});
} }
} }

View file

@ -3,12 +3,9 @@ package com.lenis0012.bukkit.marriage2.internal.data;
import java.sql.PreparedStatement; import java.sql.PreparedStatement;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.List;
import java.util.UUID; import java.util.UUID;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import com.google.common.collect.Lists;
import com.lenis0012.bukkit.marriage2.Gender; import com.lenis0012.bukkit.marriage2.Gender;
import com.lenis0012.bukkit.marriage2.MData; import com.lenis0012.bukkit.marriage2.MData;
import com.lenis0012.bukkit.marriage2.MPlayer; import com.lenis0012.bukkit.marriage2.MPlayer;

View file

@ -1,5 +1,11 @@
package com.lenis0012.bukkit.marriage2.listeners; 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.entity.Player;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority; import org.bukkit.event.EventPriority;
@ -11,7 +17,11 @@ import org.bukkit.event.player.PlayerQuitEvent;
import com.lenis0012.bukkit.marriage2.internal.MarriageCore; import com.lenis0012.bukkit.marriage2.internal.MarriageCore;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
public class DatabaseListener implements Listener { public class DatabaseListener implements Listener {
private final Cache<UUID, MarriagePlayer> cache = CacheBuilder.newBuilder().expireAfterWrite(30L, TimeUnit.SECONDS).build();
private final MarriageCore core; private final MarriageCore core;
public DatabaseListener(MarriageCore core) { public DatabaseListener(MarriageCore core) {
@ -21,13 +31,14 @@ public class DatabaseListener implements Listener {
@EventHandler(priority = EventPriority.MONITOR) @EventHandler(priority = EventPriority.MONITOR)
public void onPlayerLogin(AsyncPlayerPreLoginEvent event) { public void onPlayerLogin(AsyncPlayerPreLoginEvent event) {
if(event.getLoginResult() == Result.ALLOWED) { if(event.getLoginResult() == Result.ALLOWED) {
core.getMPlayer(event.getUniqueId()); cache.put(event.getUniqueId(), core.getDataManager().loadPlayer(event.getUniqueId()));
} }
} }
@EventHandler(priority = EventPriority.LOWEST) @EventHandler(priority = EventPriority.LOWEST)
public void onPlayerJoin(PlayerJoinEvent event) { public void onPlayerJoin(PlayerJoinEvent event) {
core.getMPlayer(event.getPlayer().getUniqueId()); final UUID userId = event.getPlayer().getUniqueId();
core.setMPlayer(userId, cache.getIfPresent(userId));
} }
@EventHandler @EventHandler

View file

@ -49,7 +49,7 @@ public class Updater {
if(updateFile.exists()) { if(updateFile.exists()) {
BConfig config = new BConfig(core, updateFile); BConfig config = new BConfig(core, updateFile);
this.apiKey = config.get("api-key", String.class); this.apiKey = config.get("api-key", String.class);
this.enabled = !config.getOrDefault("disable", false); // this.enabled = !config.getOrDefault("disable", false);
} }
} }