Experimental async MySQL implementation. Closes #2.

This commit is contained in:
AppleDash 2016-06-14 08:20:39 -04:00
parent eaca555fe4
commit 1f980b9fc8
4 changed files with 50 additions and 30 deletions

View File

@ -1,5 +1,5 @@
group 'org.appledash'
version '0.2.1-SNAPSHOT'
version '0.3.0-SNAPSHOT'
apply plugin: 'java'

View File

@ -99,6 +99,9 @@ public class SaneEconomy extends JavaPlugin {
}
getLogger().info("Connection successful!");
getLogger().info("Performing initial data load...");
mySQLBackend.reloadData();
getLogger().info("Data loaded!");
} else {
getLogger().severe("Unknown storage backend " + backendType + "!");
return false;

View File

@ -1,9 +1,13 @@
package org.appledash.saneeconomy.economy.backend.type;
import org.appledash.saneeconomy.SaneEconomy;
import org.appledash.saneeconomy.economy.backend.EconomyStorageBackend;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import java.sql.*;
import java.util.HashMap;
import java.util.UUID;
/**
* Created by AppleDash on 6/14/2016.
@ -14,6 +18,8 @@ public class EconomyStorageBackendMySQL implements EconomyStorageBackend {
private final String dbUser;
private final String dbPassword;
private final HashMap<UUID, Double> playerBalances = new HashMap<>();
public EconomyStorageBackendMySQL(String dbUrl, String dbUser, String dbPassword) {
this.dbUrl = dbUrl;
this.dbUser = dbUser;
@ -55,47 +61,58 @@ public class EconomyStorageBackendMySQL implements EconomyStorageBackend {
}
}
@Override
public synchronized boolean accountExists(Player player) {
return accountExists(player, openConnection());
}
@Override
public synchronized double getBalance(Player player) {
public void reloadData() {
Connection conn = openConnection();
try {
PreparedStatement statement = conn.prepareStatement("SELECT balance FROM `player_balances` WHERE `player_uuid` = ?");
statement.setString(1, player.getUniqueId().toString());
PreparedStatement ps = conn.prepareStatement("SELECT * FROM `player_balances`");
ResultSet rs = ps.executeQuery();
ResultSet rs = statement.executeQuery();
playerBalances.clear();
if (rs.next()) {
double bal = rs.getDouble("balance");
conn.close();
return bal;
while (rs.next()) {
playerBalances.put(UUID.fromString(rs.getString("player_uuid")), rs.getDouble("balance"));
}
conn.close();
} catch (SQLException e) {
throw new RuntimeException("SQL error has occurred.", e);
throw new RuntimeException("Failed to reload data from SQL.", e);
}
return 0.0D;
}
@Override
public synchronized void setBalance(Player player, double newBalance) {
Connection conn = openConnection();
ensureAccountExists(player, conn);
try {
PreparedStatement statement = conn.prepareStatement("UPDATE `player_balances` SET balance = ? WHERE `player_uuid` = ?");
statement.setDouble(1, newBalance);
statement.setString(2, player.getUniqueId().toString());
statement.executeUpdate();
conn.close();
} catch (SQLException e) {
throw new RuntimeException("SQL error has occurred.", e);
public synchronized boolean accountExists(Player player) {
return playerBalances.containsKey(player.getUniqueId());
}
@Override
public synchronized double getBalance(Player player) {
if (!accountExists(player)) {
return 0.0D;
}
return playerBalances.get(player.getUniqueId());
}
@Override
public synchronized void setBalance(final Player player, final double newBalance) {
final double oldBalance = playerBalances.get(player.getUniqueId());
playerBalances.put(player.getUniqueId(), newBalance);
Bukkit.getServer().getScheduler().scheduleAsyncDelayedTask(SaneEconomy.getInstance(), () -> {
Connection conn = openConnection();
ensureAccountExists(player, conn);
try {
PreparedStatement statement = conn.prepareStatement("UPDATE `player_balances` SET balance = ? WHERE `player_uuid` = ?");
statement.setDouble(1, newBalance);
statement.setString(2, player.getUniqueId().toString());
statement.executeUpdate();
conn.close();
} catch (SQLException e) {
/* Roll it back */
playerBalances.put(player.getUniqueId(), oldBalance);
throw new RuntimeException("SQL error has occurred.", e);
}
});
}
@Override

View File

@ -1,6 +1,6 @@
name: SaneEconomy
main: org.appledash.saneeconomy.SaneEconomy
version: 0.2.1
version: 0.3.0
commands:
balance:
aliases: [bal]