2019-08-02 15:59:10 +02:00
|
|
|
package com.songoda.ultimatestacker.database;
|
|
|
|
|
2020-08-25 01:01:11 +02:00
|
|
|
import com.songoda.core.compatibility.CompatibleMaterial;
|
2019-09-03 22:38:00 +02:00
|
|
|
import com.songoda.core.database.DataManagerAbstract;
|
|
|
|
import com.songoda.core.database.DatabaseConnector;
|
2023-01-02 13:38:58 +01:00
|
|
|
import com.songoda.core.database.DatabaseType;
|
2020-08-25 01:01:11 +02:00
|
|
|
import com.songoda.ultimatestacker.stackable.block.BlockStack;
|
|
|
|
import com.songoda.ultimatestacker.stackable.spawner.SpawnerStack;
|
2019-09-03 22:38:00 +02:00
|
|
|
import org.bukkit.Bukkit;
|
|
|
|
import org.bukkit.Location;
|
2019-08-19 00:46:35 +02:00
|
|
|
import org.bukkit.World;
|
2019-09-03 22:38:00 +02:00
|
|
|
import org.bukkit.plugin.Plugin;
|
2019-08-02 15:59:10 +02:00
|
|
|
|
2022-08-07 16:39:49 +02:00
|
|
|
import java.sql.Connection;
|
2020-08-25 01:01:11 +02:00
|
|
|
import java.sql.PreparedStatement;
|
|
|
|
import java.sql.ResultSet;
|
2022-08-07 16:39:49 +02:00
|
|
|
import java.sql.SQLException;
|
2020-08-25 01:01:11 +02:00
|
|
|
import java.sql.Statement;
|
2020-09-01 20:44:39 +02:00
|
|
|
import java.util.Collection;
|
|
|
|
import java.util.HashMap;
|
|
|
|
import java.util.Map;
|
2020-08-25 01:01:11 +02:00
|
|
|
import java.util.function.Consumer;
|
|
|
|
|
2019-09-03 22:38:00 +02:00
|
|
|
public class DataManager extends DataManagerAbstract {
|
2019-08-02 15:59:10 +02:00
|
|
|
|
|
|
|
public DataManager(DatabaseConnector databaseConnector, Plugin plugin) {
|
2019-09-03 22:38:00 +02:00
|
|
|
super(databaseConnector, plugin);
|
2019-08-02 15:59:10 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
public void bulkUpdateSpawners(Collection<SpawnerStack> spawnerStacks) {
|
2022-08-09 20:01:00 +02:00
|
|
|
try (Connection connection = this.databaseConnector.getConnection()) {
|
2019-08-03 06:23:36 +02:00
|
|
|
String updateSpawner = "UPDATE " + this.getTablePrefix() + "spawners SET amount = ? WHERE id = ?";
|
2022-08-07 16:39:49 +02:00
|
|
|
PreparedStatement statement = connection.prepareStatement(updateSpawner);
|
|
|
|
for (SpawnerStack spawnerStack : spawnerStacks) {
|
|
|
|
statement.setInt(1, spawnerStack.getAmount());
|
|
|
|
statement.setInt(2, spawnerStack.getId());
|
|
|
|
statement.addBatch();
|
2019-08-02 15:59:10 +02:00
|
|
|
}
|
2022-08-07 16:39:49 +02:00
|
|
|
statement.executeBatch();
|
2022-08-09 20:01:00 +02:00
|
|
|
} catch (Exception ex) {
|
|
|
|
ex.printStackTrace();
|
|
|
|
}
|
2019-08-02 15:59:10 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
public void updateSpawner(SpawnerStack spawnerStack) {
|
2022-08-07 16:39:49 +02:00
|
|
|
this.runAsync(() -> {
|
2022-08-09 20:01:00 +02:00
|
|
|
try (Connection connection = this.databaseConnector.getConnection()) {
|
2022-08-07 16:39:49 +02:00
|
|
|
|
|
|
|
String updateSpawner = "UPDATE " + this.getTablePrefix() + "spawners SET amount = ? WHERE id = ?";
|
|
|
|
|
|
|
|
PreparedStatement statement = connection.prepareStatement(updateSpawner);
|
2019-08-02 15:59:10 +02:00
|
|
|
statement.setInt(1, spawnerStack.getAmount());
|
2019-08-02 20:51:15 +02:00
|
|
|
statement.setInt(2, spawnerStack.getId());
|
2019-08-02 15:59:10 +02:00
|
|
|
statement.executeUpdate();
|
2022-08-07 16:39:49 +02:00
|
|
|
} catch (SQLException exception) {
|
|
|
|
exception.printStackTrace();
|
2019-08-02 15:59:10 +02:00
|
|
|
}
|
2022-08-07 16:39:49 +02:00
|
|
|
});
|
2019-08-02 15:59:10 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
public void createSpawner(SpawnerStack spawnerStack) {
|
2022-08-07 16:39:49 +02:00
|
|
|
this.runAsync(() -> {
|
2022-08-09 20:01:00 +02:00
|
|
|
try (Connection connection = this.databaseConnector.getConnection()) {
|
2023-01-25 23:20:44 +01:00
|
|
|
String createSpawner = "INSERT " + getSyntax("INTO ", DatabaseType.MYSQL) + getSyntax("OR REPLACE INTO ", DatabaseType.SQLITE) + this.getTablePrefix() + "spawners (amount, world, x, y, z) VALUES (?, ?, ?, ?, ?)";
|
2022-08-07 16:39:49 +02:00
|
|
|
PreparedStatement statement = connection.prepareStatement(createSpawner);
|
2019-08-02 15:59:10 +02:00
|
|
|
statement.setInt(1, spawnerStack.getAmount());
|
|
|
|
|
|
|
|
statement.setString(2, spawnerStack.getWorld().getName());
|
|
|
|
statement.setInt(3, spawnerStack.getX());
|
|
|
|
statement.setInt(4, spawnerStack.getY());
|
|
|
|
statement.setInt(5, spawnerStack.getZ());
|
|
|
|
statement.executeUpdate();
|
2022-08-07 16:39:49 +02:00
|
|
|
int spawnerId = this.lastInsertedId(connection, "spawners");
|
|
|
|
this.sync(() -> spawnerStack.setId(spawnerId));
|
|
|
|
} catch (Exception ex) {
|
|
|
|
ex.printStackTrace();
|
2019-08-02 15:59:10 +02:00
|
|
|
}
|
2022-08-07 16:39:49 +02:00
|
|
|
});
|
2020-08-25 01:01:11 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
public void updateBlock(BlockStack blockStack) {
|
2023-04-05 22:05:14 +02:00
|
|
|
if (blockStack.getAmount() == 0) return;
|
2022-08-07 16:39:49 +02:00
|
|
|
this.runAsync(() -> {
|
2022-08-09 20:01:00 +02:00
|
|
|
try (Connection connection = this.databaseConnector.getConnection()) {
|
2022-08-07 16:39:49 +02:00
|
|
|
String updateBlock = "UPDATE " + this.getTablePrefix() + "blocks SET amount = ? WHERE id = ?";
|
|
|
|
PreparedStatement statement = connection.prepareStatement(updateBlock);
|
|
|
|
if (blockStack.getAmount() == 0) return;
|
2020-08-25 01:01:11 +02:00
|
|
|
statement.setInt(1, blockStack.getAmount());
|
|
|
|
statement.setInt(2, blockStack.getId());
|
|
|
|
statement.executeUpdate();
|
2022-08-07 16:39:49 +02:00
|
|
|
} catch (Exception ex) {
|
|
|
|
ex.printStackTrace();
|
2020-08-25 01:01:11 +02:00
|
|
|
}
|
2022-08-07 16:39:49 +02:00
|
|
|
});
|
2020-08-25 01:01:11 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
public void createBlock(BlockStack blockStack) {
|
2022-08-07 16:39:49 +02:00
|
|
|
this.runAsync(() -> {
|
2022-08-09 20:01:00 +02:00
|
|
|
try (Connection connection = this.databaseConnector.getConnection()) {
|
2023-01-25 23:20:44 +01:00
|
|
|
String createSpawner = "INSERT " + getSyntax("INTO ", DatabaseType.MYSQL) + getSyntax("OR REPLACE INTO ", DatabaseType.SQLITE) + this.getTablePrefix() + "blocks (amount, material, world, x, y, z) VALUES (?, ?, ?, ?, ?, ?)";
|
2022-08-07 16:39:49 +02:00
|
|
|
PreparedStatement statement = connection.prepareStatement(createSpawner);
|
2020-08-25 01:01:11 +02:00
|
|
|
statement.setInt(1, blockStack.getAmount());
|
|
|
|
statement.setString(2, blockStack.getMaterial().name());
|
|
|
|
|
|
|
|
statement.setString(3, blockStack.getWorld().getName());
|
|
|
|
statement.setInt(4, blockStack.getX());
|
|
|
|
statement.setInt(5, blockStack.getY());
|
|
|
|
statement.setInt(6, blockStack.getZ());
|
|
|
|
statement.executeUpdate();
|
2022-08-07 16:39:49 +02:00
|
|
|
int blockId = this.lastInsertedId(connection, "blocks");
|
|
|
|
this.sync(() -> blockStack.setId(blockId));
|
|
|
|
} catch (Exception ex) {
|
|
|
|
ex.printStackTrace();
|
2020-08-25 01:01:11 +02:00
|
|
|
}
|
2022-08-07 16:39:49 +02:00
|
|
|
});
|
2020-08-25 01:01:11 +02:00
|
|
|
}
|
|
|
|
|
2019-08-02 15:59:10 +02:00
|
|
|
public void deleteSpawner(SpawnerStack spawnerStack) {
|
2022-08-07 16:39:49 +02:00
|
|
|
this.runAsync(() -> {
|
2022-08-09 20:01:00 +02:00
|
|
|
try (Connection connection = this.databaseConnector.getConnection()) {
|
2022-08-07 16:39:49 +02:00
|
|
|
String deleteSpawner = "DELETE FROM " + this.getTablePrefix() + "spawners WHERE id = ?";
|
|
|
|
PreparedStatement statement = connection.prepareStatement(deleteSpawner);
|
2019-08-02 20:51:15 +02:00
|
|
|
statement.setInt(1, spawnerStack.getId());
|
2019-08-02 15:59:10 +02:00
|
|
|
statement.executeUpdate();
|
2022-08-07 16:39:49 +02:00
|
|
|
} catch (Exception ex) {
|
|
|
|
ex.printStackTrace();
|
2019-08-02 15:59:10 +02:00
|
|
|
}
|
2022-08-07 16:39:49 +02:00
|
|
|
});
|
2019-08-02 15:59:10 +02:00
|
|
|
}
|
|
|
|
|
2020-08-25 01:01:11 +02:00
|
|
|
public void deleteBlock(BlockStack blockStack) {
|
2022-08-07 16:39:49 +02:00
|
|
|
this.runAsync(() -> {
|
2022-08-09 20:01:00 +02:00
|
|
|
try (Connection connection = this.databaseConnector.getConnection()) {
|
2022-08-07 16:39:49 +02:00
|
|
|
String deleteBlock = "DELETE FROM " + this.getTablePrefix() + "blocks WHERE id = ?";
|
|
|
|
PreparedStatement statement = connection.prepareStatement(deleteBlock);
|
2020-08-25 01:01:11 +02:00
|
|
|
statement.setInt(1, blockStack.getId());
|
|
|
|
statement.executeUpdate();
|
2022-08-07 16:39:49 +02:00
|
|
|
} catch (Exception ex) {
|
|
|
|
ex.printStackTrace();
|
2020-08-25 01:01:11 +02:00
|
|
|
}
|
2022-08-07 16:39:49 +02:00
|
|
|
});
|
2020-08-25 01:01:11 +02:00
|
|
|
}
|
|
|
|
|
2019-08-02 15:59:10 +02:00
|
|
|
public void getSpawners(Consumer<Map<Location, SpawnerStack>> callback) {
|
2022-08-07 16:39:49 +02:00
|
|
|
this.runAsync(() -> {
|
|
|
|
try (Connection connection = this.databaseConnector.getConnection()){
|
|
|
|
String selectSpawners = "SELECT * FROM " + this.getTablePrefix() + "spawners";
|
2019-08-02 15:59:10 +02:00
|
|
|
|
2022-08-07 16:39:49 +02:00
|
|
|
Map<Location, SpawnerStack> spawners = new HashMap<>();
|
2019-08-02 15:59:10 +02:00
|
|
|
|
2022-08-07 16:39:49 +02:00
|
|
|
try (Statement statement = connection.createStatement()) {
|
|
|
|
ResultSet result = statement.executeQuery(selectSpawners);
|
|
|
|
while (result.next()) {
|
|
|
|
World world = Bukkit.getWorld(result.getString("world"));
|
2019-08-19 00:46:35 +02:00
|
|
|
|
2022-08-07 16:39:49 +02:00
|
|
|
if (world == null)
|
|
|
|
continue;
|
2019-08-19 00:46:35 +02:00
|
|
|
|
2022-08-07 16:39:49 +02:00
|
|
|
int spawnerId = result.getInt("id");
|
2019-08-02 20:51:15 +02:00
|
|
|
|
2022-08-07 16:39:49 +02:00
|
|
|
int amount = result.getInt("amount");
|
2019-08-02 15:59:10 +02:00
|
|
|
|
2022-08-07 16:39:49 +02:00
|
|
|
int x = result.getInt("x");
|
|
|
|
int y = result.getInt("y");
|
|
|
|
int z = result.getInt("z");
|
|
|
|
Location location = new Location(world, x, y, z);
|
2019-08-02 15:59:10 +02:00
|
|
|
|
2022-08-07 16:39:49 +02:00
|
|
|
SpawnerStack spawnerStack = new SpawnerStack(location, amount);
|
|
|
|
spawnerStack.setId(spawnerId);
|
|
|
|
spawners.put(location, spawnerStack);
|
|
|
|
}
|
|
|
|
} catch (Exception e) {
|
|
|
|
e.printStackTrace();
|
2019-08-02 15:59:10 +02:00
|
|
|
}
|
|
|
|
|
2022-08-07 16:39:49 +02:00
|
|
|
this.sync(() -> callback.accept(spawners));
|
|
|
|
} catch (Exception ex) {
|
|
|
|
ex.printStackTrace();
|
|
|
|
}
|
|
|
|
});
|
2019-08-02 15:59:10 +02:00
|
|
|
}
|
2020-08-25 01:01:11 +02:00
|
|
|
|
|
|
|
public void getBlocks(Consumer<Map<Location, BlockStack>> callback) {
|
2022-08-07 16:39:49 +02:00
|
|
|
this.runAsync(() -> {
|
|
|
|
try (Connection connection = this.databaseConnector.getConnection()) {
|
|
|
|
String selectBlocks = "SELECT * FROM " + this.getTablePrefix() + "blocks";
|
|
|
|
|
|
|
|
Map<Location, BlockStack> blocks = new HashMap<>();
|
2020-08-25 01:01:11 +02:00
|
|
|
|
2022-08-07 16:39:49 +02:00
|
|
|
Statement statement = connection.createStatement();
|
2020-08-25 01:01:11 +02:00
|
|
|
|
|
|
|
ResultSet result = statement.executeQuery(selectBlocks);
|
|
|
|
while (result.next()) {
|
|
|
|
World world = Bukkit.getWorld(result.getString("world"));
|
|
|
|
|
|
|
|
if (world == null)
|
|
|
|
continue;
|
|
|
|
|
|
|
|
int blockId = result.getInt("id");
|
|
|
|
|
|
|
|
CompatibleMaterial material = CompatibleMaterial.getMaterial(result.getString("material"));
|
|
|
|
|
|
|
|
int amount = result.getInt("amount");
|
|
|
|
|
|
|
|
int x = result.getInt("x");
|
|
|
|
int y = result.getInt("y");
|
|
|
|
int z = result.getInt("z");
|
|
|
|
Location location = new Location(world, x, y, z);
|
|
|
|
|
|
|
|
BlockStack blockStack = new BlockStack(material, location, amount);
|
|
|
|
blockStack.setId(blockId);
|
2023-04-07 18:58:21 +02:00
|
|
|
if (amount == 0) {
|
|
|
|
//remove from database
|
|
|
|
this.deleteBlock(blockStack);
|
|
|
|
continue;
|
|
|
|
}
|
2020-08-25 01:01:11 +02:00
|
|
|
blocks.put(location, blockStack);
|
2022-08-07 16:39:49 +02:00
|
|
|
|
|
|
|
this.sync(() -> callback.accept(blocks));
|
2020-08-25 01:01:11 +02:00
|
|
|
}
|
2022-08-07 16:39:49 +02:00
|
|
|
} catch (Exception ex) {
|
|
|
|
ex.printStackTrace();
|
2020-08-25 01:01:11 +02:00
|
|
|
}
|
2022-08-07 16:39:49 +02:00
|
|
|
});
|
2020-08-25 01:01:11 +02:00
|
|
|
}
|
2023-04-07 18:58:21 +02:00
|
|
|
|
|
|
|
public void bulkUpdateBlocks(Collection<BlockStack> stacks) {
|
|
|
|
try (Connection connection = this.databaseConnector.getConnection()) {
|
|
|
|
String updateSpawner = "UPDATE " + this.getTablePrefix() + "blocks SET amount = ? WHERE id = ?";
|
|
|
|
PreparedStatement statement = connection.prepareStatement(updateSpawner);
|
|
|
|
for (BlockStack spawnerStack : stacks) {
|
|
|
|
statement.setInt(1, spawnerStack.getAmount());
|
|
|
|
statement.setInt(2, spawnerStack.getId());
|
|
|
|
statement.addBatch();
|
|
|
|
}
|
|
|
|
statement.executeBatch();
|
|
|
|
} catch (Exception ex) {
|
|
|
|
ex.printStackTrace();
|
|
|
|
}
|
|
|
|
}
|
2019-08-02 15:59:10 +02:00
|
|
|
}
|