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.Timestamp; import java.util.HashMap; import java.util.Iterator; import java.util.TreeSet; import net.scapeemulator.game.content.grandexchange.GEOffer; import net.scapeemulator.game.content.grandexchange.GrandExchange; import net.scapeemulator.game.content.grandexchange.OfferType; public final class GrandExchangeTable extends Table<GrandExchange> { private final PreparedStatement loadStatement; private final PreparedStatement saveStatement; public GrandExchangeTable(Connection connection) throws SQLException { this.loadStatement = connection.prepareStatement("SELECT * FROM grandexchange"); this.saveStatement = connection.prepareStatement("REPLACE INTO grandexchange (player_id, slot, timestamp, type, item, price, offer_amount, total_coins, amount_complete, unclaimed_coins, unclaimed_items, aborted) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);"); } @Override public void load(GrandExchange ge) throws SQLException, IOException { System.out.print("Loading Grand Exchange offers... "); int count = 0; try (ResultSet set = loadStatement.executeQuery()) { while (set.next()) { int playerId = set.getInt("player_id"); int slot = set.getInt("slot"); Timestamp timestamp = set.getTimestamp("timestamp"); OfferType type = OfferType.values()[set.getInt("type")]; int item = set.getInt("item"); int price = set.getInt("price"); int offerAmount = set.getInt("offer_amount"); int totalCoins = set.getInt("total_coins"); int amountComplete = set.getInt("amount_complete"); int unclaimedCoins = set.getInt("unclaimed_coins"); int unclaimedItems = set.getInt("unclaimed_items"); boolean cancelled = set.getInt("aborted") == 1; GEOffer offer = new GEOffer(playerId, slot, type, item, price, offerAmount, timestamp); offer.setTotalCoins(totalCoins); offer.setAmountComplete(amountComplete); offer.setUnclaimedCoins(unclaimedCoins); offer.setUnclaimedItems(unclaimedItems); offer.setAborted(cancelled); ge.addOffer(offer); count++; } System.out.println("complete! Loaded " + count + " offers."); } } @Override public void save(GrandExchange ge) throws SQLException { System.out.print("Saving Grand Exchange offers... "); int count = 0; for (HashMap<Integer, TreeSet<GEOffer>> offerMap : ge.getOfferMaps()) { for (TreeSet<GEOffer> offerSet : offerMap.values()) { Iterator<GEOffer> offers = offerSet.iterator(); while (offers.hasNext()) { GEOffer offer = offers.next(); saveStatement.setInt(1, offer.getPlayerId()); saveStatement.setInt(2, offer.getSlot()); saveStatement.setTimestamp(3, offer.getTimestamp()); saveStatement.setInt(4, offer.getType().ordinal()); saveStatement.setInt(5, offer.getItemId()); saveStatement.setInt(6, offer.getPrice()); saveStatement.setInt(7, offer.getOfferAmount()); saveStatement.setInt(8, offer.getTotalCoins()); saveStatement.setInt(9, offer.getAmountComplete()); saveStatement.setInt(10, offer.getUnclaimedCoins()); saveStatement.setInt(11, offer.getUnclaimedItems()); saveStatement.setInt(12, offer.isAborted() ? 1 : 0); saveStatement.addBatch(); count++; } } } saveStatement.executeBatch(); System.out.println("complete! Saved " + count + " offers."); } }