package net.scapeemulator.game.io.jdbc;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Iterator;
import java.util.Map.Entry;
import net.scapeemulator.game.model.player.Player;
import net.scapeemulator.game.model.player.PlayerVariables;
import net.scapeemulator.game.model.player.PlayerVariables.Variable;
public final class VariablesTable extends Table<Player> {
private final PreparedStatement loadStatement;
private final PreparedStatement saveStatement;
public VariablesTable(Connection connection) throws SQLException {
this.loadStatement = connection.prepareStatement("SELECT * FROM variables WHERE player_id = ?;");
this.saveStatement = connection.prepareStatement("INSERT INTO variables (player_id, variable, value) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE value = VALUES(value);");
}
@Override
public void load(Player player) throws SQLException, IOException {
loadStatement.setInt(1, player.getDatabaseId());
PlayerVariables vars = player.getVariables();
try (ResultSet set = loadStatement.executeQuery()) {
while (set.next()) {
String varS = set.getString("variable");
int value = set.getInt("value");
try {
Variable var = Variable.valueOf(varS);
vars.setVar(var, value);
} catch (IllegalArgumentException e) {
throw new IOException("unknown variable: " + varS);
}
}
}
}
@Override
public void save(Player player) throws SQLException, IOException {
saveStatement.setInt(1, player.getDatabaseId());
PlayerVariables vars = player.getVariables();
Iterator<Entry<Variable, Integer>> it = vars.getVariables().entrySet().iterator();
while (it.hasNext()) {
Entry<Variable, Integer> var = it.next();
if (var.getKey().shouldPersist()) {
saveStatement.setString(2, var.getKey().name());
saveStatement.setInt(3, var.getValue());
saveStatement.addBatch();
}
}
saveStatement.executeBatch();
}
}