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;
}
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();
}

View file

@ -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;
}

View file

@ -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<UUID, MarriageData> marriageDataCache = CacheBuilder.newBuilder().expireAfterWrite(60L, TimeUnit.SECONDS).build();
private final LockedReference<Connection> 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<MData> list = Lists.newArrayList();
while(result.next()) {
list.add(new MarriageData(result));
list.add(new MarriageData(this, result));
}
return new ListQuery(pages, page, list);

View file

@ -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);
}
});
}
}

View file

@ -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;

View file

@ -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<UUID, MarriagePlayer> 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

View file

@ -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);
}
}