UltimateStacker/src/main/java/com/songoda/ultimatestacker/database/DataManager.java

242 lines
10 KiB
Java
Raw Normal View History

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;
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;
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()) {
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()) {
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"));
2022-08-07 16:39:49 +02:00
if (world == null)
continue;
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
}