package eu.mhsl.minecraft.pixelblocks; import eu.mhsl.minecraft.pixelblocks.utils.Direction; import eu.mhsl.minecraft.pixelblocks.pixelblock.PixelBlock; import org.bukkit.Bukkit; import org.bukkit.Location; import java.sql.*; import java.util.UUID; public class PixelBlockDatabase { private final Connection db; private final PreparedStatement getAllPixelBlocks; private final PreparedStatement deletePixelBlock; private final PreparedStatement insertOrReplacePixelBlock; public PixelBlockDatabase(String url) { try { Class.forName("org.sqlite.JDBC"); this.db = DriverManager.getConnection(url); this.db.createStatement().execute( "CREATE TABLE IF NOT EXISTS pixelblocks (" + "uuid CHAR(36) PRIMARY KEY, " + "owner CHAR(36), " + "locationWorldName CHAR(36), " + "locationX DOUBLE, " + "locationY DOUBLE, " + "locationZ DOUBLE, " + "entryLocationWorldName CHAR(36), " + "entryLocationX DOUBLE, " + "entryLocationY DOUBLE, " + "entryLocationZ DOUBLE, " + "direction CHAR(36)" + ")" ); this.deletePixelBlock = this.db.prepareStatement("DELETE FROM pixelblocks WHERE uuid = ?"); this.getAllPixelBlocks = this.db.prepareStatement("SELECT * FROM pixelblocks"); this.insertOrReplacePixelBlock = this.db.prepareStatement( "INSERT OR REPLACE INTO pixelblocks(uuid, owner, " + "locationWorldName, locationX, locationY, locationZ, " + "entryLocationWorldName, entryLocationX, entryLocationY, entryLocationZ, direction) " + "VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);" ); } catch (SQLException | RuntimeException | ClassNotFoundException e) { throw new RuntimeException("Error while initializing database", e); } } public void close() throws SQLException { deletePixelBlock.close(); getAllPixelBlocks.close(); insertOrReplacePixelBlock.close(); db.close(); } public void deletePixelBlock(PixelBlock pixelBlock) { Bukkit.getScheduler().runTaskAsynchronously(Main.plugin, () -> { try { this.deletePixelBlock.setString(1, pixelBlock.getBlockUUID().toString()); this.deletePixelBlock.executeUpdate(); } catch (SQLException e) { throw new RuntimeException("Failed to delete PixelBlock from the database", e); } }); } public void savePixelBlock(PixelBlock pixelBlock) { Bukkit.getScheduler().runTask(Main.plugin, () -> { try { this.insertOrReplacePixelBlock.setString(1, pixelBlock.getBlockUUID().toString()); this.insertOrReplacePixelBlock.setString(2, pixelBlock.getOwnerUUID().toString()); this.insertOrReplacePixelBlock.setString(3, pixelBlock.getPixelBlockLocation().getWorld().getName()); this.insertOrReplacePixelBlock.setDouble(4, pixelBlock.getPixelBlockLocation().getX()); this.insertOrReplacePixelBlock.setDouble(5, pixelBlock.getPixelBlockLocation().getY()); this.insertOrReplacePixelBlock.setDouble(6, pixelBlock.getPixelBlockLocation().getZ()); if (pixelBlock.hasLastEntryLocation()) { this.insertOrReplacePixelBlock.setString(7, pixelBlock.getLastEntryLocation().getWorld().getName()); this.insertOrReplacePixelBlock.setDouble(8, pixelBlock.getLastEntryLocation().getX()); this.insertOrReplacePixelBlock.setDouble(9, pixelBlock.getLastEntryLocation().getY()); this.insertOrReplacePixelBlock.setDouble(10, pixelBlock.getLastEntryLocation().getZ()); } else { this.insertOrReplacePixelBlock.setString(7, pixelBlock.getPixelBlockLocation().getWorld().getName()); this.insertOrReplacePixelBlock.setDouble(8, pixelBlock.getPixelBlockLocation().getX()); this.insertOrReplacePixelBlock.setDouble(9, pixelBlock.getPixelBlockLocation().getY()); this.insertOrReplacePixelBlock.setDouble(10, pixelBlock.getPixelBlockLocation().getZ()); } this.insertOrReplacePixelBlock.setString(11, pixelBlock.getFacingDirection().toString()); this.insertOrReplacePixelBlock.executeUpdate(); } catch (SQLException e) { throw new RuntimeException("Failed to create or update PixelBlock in the database", e); } }); } public void loadPixelBlocks() { try { ResultSet allPixelBlocks = this.getAllPixelBlocks.executeQuery(); while (allPixelBlocks.next()) { Location blockLocation = new Location( Bukkit.getWorld(allPixelBlocks.getString("locationWorldName")), allPixelBlocks.getDouble("locationX"), allPixelBlocks.getDouble("locationY"), allPixelBlocks.getDouble("locationZ") ); Location entryLocation = new Location( Bukkit.getWorld(allPixelBlocks.getString("entryLocationWorldName")), allPixelBlocks.getDouble("entryLocationX"), allPixelBlocks.getDouble("entryLocationY"), allPixelBlocks.getDouble("entryLocationZ") ); PixelBlock block = new PixelBlock( blockLocation, UUID.fromString(allPixelBlocks.getString("owner")), UUID.fromString(allPixelBlocks.getString("uuid")), Direction.valueOf(allPixelBlocks.getString("direction")) ); block.setLastEntryLocation(entryLocation); } } catch (SQLException e) { throw new RuntimeException("Failed loading PixelBlocks from the database", e); } } }