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.sql.Types; import net.scapeemulator.game.model.player.Item; import net.scapeemulator.game.model.player.Player; import net.scapeemulator.game.model.player.inventory.Inventory; public abstract class ItemsTable extends Table<Player> { private final PreparedStatement loadStatement; private final PreparedStatement saveStatement; private final String type; public ItemsTable(Connection connection, String type) throws SQLException { this.loadStatement = connection.prepareStatement("SELECT * FROM items WHERE player_id = ? AND type = ?;"); this.saveStatement = connection.prepareStatement("INSERT INTO items (player_id, type, slot, item, amount) VALUES (?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE item = VALUES(item), amount = VALUES(amount);"); this.type = type; } public abstract Inventory getInventory(Player player); @Override public void load(Player player) throws SQLException, IOException { loadStatement.setInt(1, player.getDatabaseId()); loadStatement.setString(2, type); Inventory inventory = getInventory(player); boolean locked = inventory.locked(); inventory.unlock(); inventory.silence(); try (ResultSet set = loadStatement.executeQuery()) { while (set.next()) { int slot = set.getInt("slot"); int item = set.getInt("item"); int amount = set.getInt("amount"); if (set.wasNull()) { inventory.set(slot, null); } else { inventory.set(slot, new Item(item, amount)); } } } if(locked) { inventory.lock(); } inventory.unsilence(); } @Override public void save(Player player) throws SQLException, IOException { saveStatement.setInt(1, player.getDatabaseId()); saveStatement.setString(2, type); Inventory inventory = getInventory(player); Item[] items = inventory.toArray(); for (int slot = 0; slot < items.length; slot++) { Item item = items[slot]; saveStatement.setInt(3, slot); if (item == null) { saveStatement.setNull(4, Types.INTEGER); saveStatement.setNull(5, Types.INTEGER); } else { saveStatement.setInt(4, item.getId()); saveStatement.setInt(5, item.getAmount()); } saveStatement.addBatch(); } saveStatement.executeBatch(); } }