// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ . // ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌· // ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀ // ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌ // ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀ // Magicbane Emulator Project © 2013 - 2022 // www.magicbane.com package engine.db.archive; import engine.Enum; import engine.gameManager.DbManager; import engine.objects.City; import engine.workthreads.WarehousePushThread; import java.sql.*; import java.util.concurrent.LinkedBlockingQueue; public class CityRecord extends DataRecord { private static final LinkedBlockingQueue recordPool = new LinkedBlockingQueue<>(); private Enum.RecordEventType eventType; private City city; private String cityHash; private String cityGuildHash; private String cityName; private String cityMotto; private float locX; private float locY; private String zoneHash; private java.time.LocalDateTime establishedDatetime; private CityRecord(City city) { this.recordType = Enum.DataRecordType.CITY; this.city = city; this.eventType = Enum.RecordEventType.CREATE; } public static CityRecord borrow(City city, Enum.RecordEventType eventType) { CityRecord cityRecord; cityRecord = recordPool.poll(); if (cityRecord == null) { cityRecord = new CityRecord(city); cityRecord.eventType = eventType; } else { cityRecord.recordType = Enum.DataRecordType.CITY; cityRecord.eventType = eventType; cityRecord.city = city; } if (cityRecord.city.getHash() == null) cityRecord.city.setHash(DataWarehouse.hasher.encrypt(cityRecord.city.getObjectUUID())); cityRecord.cityHash = cityRecord.city.getHash(); cityRecord.cityName = cityRecord.city.getCityName(); cityRecord.cityMotto = cityRecord.city.getMotto(); cityRecord.cityGuildHash = cityRecord.city.getGuild().getHash(); cityRecord.locX = cityRecord.city.getTOL().getLoc().x; cityRecord.locY = -cityRecord.city.getTOL().getLoc().z; // flip sign on 'y' coordinate cityRecord.zoneHash = cityRecord.city.getParent().hash; if (cityRecord.eventType.equals(Enum.RecordEventType.CREATE)) cityRecord.establishedDatetime = cityRecord.city.established; else cityRecord.establishedDatetime = java.time.LocalDateTime.now(); return cityRecord; } public static PreparedStatement buildCityPushStatement(Connection connection, ResultSet rs) throws SQLException { PreparedStatement outStatement = null; String queryString = "INSERT INTO `warehouse_cityhistory` (`event_number`, `city_id`, `city_name`, `city_motto`, `guild_id`, `loc_x`, `loc_y`, `zone_id`, `eventType`, `datetime`) VALUES(?,?,?,?,?,?,?,?,?,?)"; outStatement = connection.prepareStatement(queryString); // Bind record data outStatement.setInt(1, rs.getInt("event_number")); outStatement.setString(2, rs.getString("city_id")); outStatement.setString(3, rs.getString("city_name")); outStatement.setString(4, rs.getString("city_motto")); outStatement.setString(5, rs.getString("guild_id")); outStatement.setFloat(6, rs.getFloat("loc_x")); outStatement.setFloat(7, rs.getFloat("loc_y")); outStatement.setString(8, rs.getString("zone_id")); outStatement.setString(9, rs.getString("eventType")); outStatement.setTimestamp(10, rs.getTimestamp("datetime")); return outStatement; } public static PreparedStatement buildCityQueryStatement(Connection connection) throws SQLException { PreparedStatement outStatement = null; String queryString = "SELECT * FROM `warehouse_cityhistory` WHERE `event_number` > ?"; outStatement = connection.prepareStatement(queryString); outStatement.setInt(1, WarehousePushThread.cityIndex); return outStatement; } void reset() { this.city = null; this.cityHash = null; this.cityGuildHash = null; this.cityMotto = null; this.zoneHash = null; this.establishedDatetime = null; } public void release() { this.reset(); recordPool.add(this); } public void write() { try (Connection connection = DbManager.getConnection(); PreparedStatement statement = this.buildCityInsertStatement(connection)) { statement.execute(); } catch (SQLException e) { e.printStackTrace(); } } private PreparedStatement buildCityInsertStatement(Connection connection) throws SQLException { PreparedStatement outStatement = null; String queryString = "INSERT INTO `warehouse_cityhistory` (`city_id`, `city_name`, `city_motto`, `guild_id`, `loc_x`, `loc_y`, `zone_id`, `eventType`, `datetime`) VALUES(?,?,?,?,?,?,?,?,?)"; outStatement = connection.prepareStatement(queryString); // Bind character data outStatement.setString(1, this.cityHash); outStatement.setString(2, this.cityName); outStatement.setString(3, this.cityMotto); outStatement.setString(4, this.cityGuildHash); outStatement.setFloat(5, this.locX); outStatement.setFloat(6, this.locY); outStatement.setString(7, this.zoneHash); outStatement.setString(8, this.eventType.name()); outStatement.setTimestamp(9, Timestamp.valueOf(this.establishedDatetime)); return outStatement; } }