PlotSquared/PlotSquared/src/main/java/com/intellectualcrafters/plot/database/SQLManager.java

1751 lines
82 KiB
Java
Raw Normal View History

2014-11-08 20:27:09 +01:00
////////////////////////////////////////////////////////////////////////////////////////////////////
// PlotSquared - A plot manager and world generator for the Bukkit API /
// Copyright (c) 2014 IntellectualSites/IntellectualCrafters /
// /
// This program is free software; you can redistribute it and/or modify /
// it under the terms of the GNU General Public License as published by /
// the Free Software Foundation; either version 3 of the License, or /
// (at your option) any later version. /
// /
// This program is distributed in the hope that it will be useful, /
// but WITHOUT ANY WARRANTY; without even the implied warranty of /
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the /
// GNU General Public License for more details. /
// /
// You should have received a copy of the GNU General Public License /
// along with this program; if not, write to the Free Software Foundation, /
// Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA /
// /
// You can contact us via: support@intellectualsites.com /
////////////////////////////////////////////////////////////////////////////////////////////////////
package com.intellectualcrafters.plot.database;
2015-02-15 06:39:44 +01:00
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Set;
import java.util.UUID;
import org.apache.commons.lang.StringUtils;
import org.bukkit.block.Biome;
2015-02-19 09:51:10 +01:00
import com.intellectualcrafters.plot.PlotSquared;
2014-11-16 10:48:18 +01:00
import com.intellectualcrafters.plot.flag.Flag;
import com.intellectualcrafters.plot.flag.FlagManager;
2015-02-15 06:39:44 +01:00
import com.intellectualcrafters.plot.object.BlockLoc;
import com.intellectualcrafters.plot.object.Plot;
import com.intellectualcrafters.plot.object.PlotCluster;
import com.intellectualcrafters.plot.object.PlotClusterId;
import com.intellectualcrafters.plot.object.PlotComment;
import com.intellectualcrafters.plot.object.PlotId;
2015-01-26 05:16:10 +01:00
import com.intellectualcrafters.plot.util.ClusterManager;
2015-02-20 05:32:40 +01:00
import com.intellectualcrafters.plot.util.TaskManager;
2015-01-07 07:44:03 +01:00
/**
* @author Citymonstret
*/
2014-11-19 18:18:18 +01:00
public class SQLManager implements AbstractDB {
2014-11-16 09:43:30 +01:00
// Public final
2014-12-18 03:15:11 +01:00
public final String SET_OWNER;
public final String GET_ALL_PLOTS;
public final String CREATE_PLOTS;
public final String CREATE_SETTINGS;
public final String CREATE_HELPERS;
public final String CREATE_PLOT;
2015-01-26 05:16:10 +01:00
public final String CREATE_CLUSTER;
private final String prefix;
2014-11-16 09:43:30 +01:00
// Private Final
2014-12-18 03:15:11 +01:00
private Connection connection;
2015-02-23 02:32:27 +01:00
2014-11-16 09:43:30 +01:00
/**
* Constructor
*
2014-12-18 03:15:11 +01:00
* @param c connection
* @param p prefix
2014-11-16 09:43:30 +01:00
*/
2014-12-16 06:03:20 +01:00
public SQLManager(final Connection c, final String p) {
2014-11-16 09:43:30 +01:00
// Private final
2014-12-16 06:03:20 +01:00
this.connection = c;
this.prefix = p;
// Set timout
2014-12-16 06:03:20 +01:00
// setTimout();
2014-11-16 09:43:30 +01:00
// Public final
2014-12-16 06:03:20 +01:00
this.SET_OWNER = "UPDATE `" + this.prefix + "plot` SET `owner` = ? WHERE `plot_id_x` = ? AND `plot_id_z` = ?";
this.GET_ALL_PLOTS = "SELECT `id`, `plot_id_x`, `plot_id_z`, `world` FROM `" + this.prefix + "plot`";
this.CREATE_PLOTS = "INSERT INTO `" + this.prefix + "plot`(`plot_id_x`, `plot_id_z`, `owner`, `world`) values ";
this.CREATE_SETTINGS = "INSERT INTO `" + this.prefix + "plot_settings` (`plot_plot_id`) values ";
this.CREATE_HELPERS = "INSERT INTO `" + this.prefix + "plot_helpers` (`plot_plot_id`, `user_uuid`) values ";
this.CREATE_PLOT = "INSERT INTO `" + this.prefix + "plot`(`plot_id_x`, `plot_id_z`, `owner`, `world`) VALUES(?, ?, ?, ?)";
2015-01-26 05:16:10 +01:00
this.CREATE_CLUSTER = "INSERT INTO `" + this.prefix + "cluster`(`pos1_x`, `pos1_z`, `pos2_x`, `pos2_z`, `owner`, `world`) VALUES(?, ?, ?, ?, ?, ?)";
2014-12-16 06:03:20 +01:00
// schedule reconnect
2015-02-19 09:51:10 +01:00
if (PlotSquared.getMySQL() != null) {
2015-02-20 05:32:40 +01:00
TaskManager.runTaskRepeat(new Runnable() {
2014-12-16 06:03:20 +01:00
@Override
public void run() {
try {
2015-02-19 09:51:10 +01:00
SQLManager.this.connection = PlotSquared.getMySQL().forceConnection();
2014-12-18 03:15:11 +01:00
} catch (final Exception e) {
e.printStackTrace();
}
}
2015-02-20 05:32:40 +01:00
}, 11000);
}
}
2015-02-23 02:32:27 +01:00
2014-11-05 04:42:08 +01:00
/**
* Set Plot owner
*
2014-12-18 03:15:11 +01:00
* @param plot Plot Object
* @param uuid Owner UUID
2014-11-05 04:42:08 +01:00
*/
@Override
public void setOwner(final Plot plot, final UUID uuid) {
2015-02-20 07:34:19 +01:00
TaskManager.runTaskAsync(new Runnable() {
2014-11-05 04:42:08 +01:00
@Override
public void run() {
try {
2014-12-16 06:03:20 +01:00
final PreparedStatement statement = SQLManager.this.connection.prepareStatement(SQLManager.this.SET_OWNER);
2014-11-05 04:42:08 +01:00
statement.setString(1, uuid.toString());
statement.setInt(2, plot.id.x);
statement.setInt(3, plot.id.y);
statement.executeUpdate();
statement.close();
2014-12-18 03:15:11 +01:00
} catch (final SQLException e) {
2014-11-05 04:42:08 +01:00
e.printStackTrace();
2015-02-20 07:34:19 +01:00
PlotSquared.log("&c[ERROR] " + "Could not set owner for plot " + plot.id);
2014-11-05 04:42:08 +01:00
}
}
});
}
2015-02-23 02:32:27 +01:00
2014-11-05 04:42:08 +01:00
@Override
public void createAllSettingsAndHelpers(final ArrayList<Plot> mylist) {
2015-02-20 07:34:19 +01:00
final int size = mylist.size();
int packet;
2015-02-19 09:51:10 +01:00
if (PlotSquared.getMySQL() != null) {
packet = Math.min(size, 50000);
2015-02-20 07:34:19 +01:00
} else {
packet = Math.min(size, 5000);
}
2015-02-20 07:34:19 +01:00
final int amount = size / packet;
for (int j = 0; j <= amount; j++) {
final List<Plot> plots = mylist.subList(j * packet, Math.min(size, (j + 1) * packet));
final HashMap<String, HashMap<PlotId, Integer>> stored = new HashMap<>();
final HashMap<Integer, ArrayList<UUID>> helpers = new HashMap<>();
try {
final PreparedStatement stmt = this.connection.prepareStatement(this.GET_ALL_PLOTS);
final ResultSet result = stmt.executeQuery();
while (result.next()) {
final int id = result.getInt("id");
final int idx = result.getInt("plot_id_x");
final int idz = result.getInt("plot_id_z");
final String world = result.getString("world");
if (!stored.containsKey(world)) {
stored.put(world, new HashMap<PlotId, Integer>());
}
stored.get(world).put(new PlotId(idx, idz), id);
2014-11-05 04:42:08 +01:00
}
2015-02-19 04:24:05 +01:00
result.close();
2015-02-16 04:46:57 +01:00
stmt.close();
} catch (final SQLException e) {
e.printStackTrace();
2014-11-05 04:42:08 +01:00
}
for (final Plot plot : plots) {
final String world = plot.world;
if (stored.containsKey(world)) {
final Integer id = stored.get(world).get(plot.id);
if (id != null) {
helpers.put(id, plot.helpers);
}
2014-11-05 04:42:08 +01:00
}
}
if (helpers.size() == 0) {
return;
2014-11-05 04:42:08 +01:00
}
// add plot settings
final Integer[] ids = helpers.keySet().toArray(new Integer[helpers.keySet().size()]);
StringBuilder statement = new StringBuilder(this.CREATE_SETTINGS);
for (int i = 0; i < (ids.length - 1); i++) {
statement.append("(?),");
2014-12-21 05:03:59 +01:00
}
statement.append("(?)");
PreparedStatement stmt = null;
try {
stmt = this.connection.prepareStatement(statement.toString());
for (int i = 0; i < ids.length; i++) {
stmt.setInt(i + 1, ids[i]);
}
stmt.executeUpdate();
stmt.close();
} catch (final SQLException e) {
2015-02-20 07:34:19 +01:00
for (final Integer id : ids) {
createPlotSettings(id, null);
}
2014-11-05 04:42:08 +01:00
}
// add plot helpers
String prefix = "";
statement = new StringBuilder(this.CREATE_HELPERS);
2014-11-05 04:42:08 +01:00
for (final Integer id : helpers.keySet()) {
for (final UUID helper : helpers.get(id)) {
statement.append(prefix + "(?, ?)");
prefix = ",";
2014-11-05 04:42:08 +01:00
}
}
if (prefix.equals("")) {
return;
}
2014-12-21 05:03:59 +01:00
try {
stmt = this.connection.prepareStatement(statement.toString());
int counter = 0;
2014-12-21 05:03:59 +01:00
for (final Integer id : helpers.keySet()) {
for (final UUID helper : helpers.get(id)) {
stmt.setInt((counter * 2) + 1, id);
stmt.setString((counter * 2) + 2, helper.toString());
counter++;
}
}
stmt.executeUpdate();
stmt.close();
} catch (final SQLException e) {
try {
for (final Integer id : helpers.keySet()) {
for (final UUID helper : helpers.get(id)) {
setHelper(id, helper);
}
2014-12-21 05:03:59 +01:00
}
2015-02-20 07:34:19 +01:00
} catch (final Exception e2) {
2014-12-21 05:03:59 +01:00
}
2015-02-20 07:34:19 +01:00
PlotSquared.log("&7[WARN] " + "Failed to set all helpers for plots");
2014-12-21 05:03:59 +01:00
}
2014-11-05 04:42:08 +01:00
}
}
2015-02-23 02:32:27 +01:00
2014-11-05 04:42:08 +01:00
/**
* Create a plot
*
* @param plots
*/
@Override
public void createPlots(final ArrayList<Plot> mylist) {
2015-02-20 07:34:19 +01:00
final int size = mylist.size();
int packet;
2015-02-19 09:51:10 +01:00
if (PlotSquared.getMySQL() != null) {
packet = Math.min(size, 50000);
2015-02-20 07:34:19 +01:00
} else {
packet = Math.min(size, 5000);
2014-11-05 04:42:08 +01:00
}
2015-02-20 07:34:19 +01:00
final int amount = size / packet;
for (int j = 0; j <= amount; j++) {
final List<Plot> plots = mylist.subList(j * packet, Math.min(size, (j + 1) * packet));
if (plots.size() == 0) {
return;
2014-11-05 04:42:08 +01:00
}
final StringBuilder statement = new StringBuilder(this.CREATE_PLOTS);
for (int i = 0; i < (plots.size() - 1); i++) {
statement.append("(?,?,?,?),");
}
statement.append("(?,?,?,?)");
PreparedStatement stmt = null;
2014-12-21 05:03:59 +01:00
try {
stmt = this.connection.prepareStatement(statement.toString());
for (int i = 0; i < plots.size(); i++) {
final Plot plot = plots.get(i);
stmt.setInt((i * 4) + 1, plot.id.x);
stmt.setInt((i * 4) + 2, plot.id.y);
2014-12-21 08:54:22 +01:00
try {
stmt.setString((i * 4) + 3, plot.owner.toString());
2015-02-20 07:34:19 +01:00
} catch (final Exception e) {
stmt.setString((i * 4) + 3, DBFunc.everyone.toString());
2014-12-21 08:54:22 +01:00
}
stmt.setString((i * 4) + 4, plot.world);
}
stmt.executeUpdate();
stmt.close();
} catch (final Exception e) {
e.printStackTrace();
2015-02-20 07:34:19 +01:00
PlotSquared.log("&6[WARN] " + "Could not bulk save. Conversion may be slower...");
try {
2015-02-20 07:34:19 +01:00
for (final Plot plot : plots) {
try {
createPlot(plot);
2015-02-20 07:34:19 +01:00
} catch (final Exception e3) {
PlotSquared.log("&c[ERROR] " + "Failed to save plot: " + plot.id);
}
}
2015-02-20 07:34:19 +01:00
} catch (final Exception e2) {
e2.printStackTrace();
2015-02-20 07:34:19 +01:00
PlotSquared.log("&c[ERROR] " + "Failed to save plots!");
2014-12-21 05:03:59 +01:00
}
}
2014-11-05 04:42:08 +01:00
}
}
2015-02-23 02:32:27 +01:00
2014-11-05 04:42:08 +01:00
/**
* Create a plot
*
* @param plot
*/
@Override
public void createPlot(final Plot plot) {
2015-02-20 07:34:19 +01:00
TaskManager.runTaskAsync(new Runnable() {
@Override
public void run() {
PreparedStatement stmt = null;
try {
stmt = SQLManager.this.connection.prepareStatement(SQLManager.this.CREATE_PLOT);
stmt.setInt(1, plot.id.x);
stmt.setInt(2, plot.id.y);
stmt.setString(3, plot.owner.toString());
stmt.setString(4, plot.world);
stmt.executeUpdate();
stmt.close();
} catch (final Exception e) {
e.printStackTrace();
2015-02-20 07:34:19 +01:00
PlotSquared.log("&c[ERROR] " + "Failed to save plot " + plot.id);
}
}
});
2014-11-05 04:42:08 +01:00
}
2015-02-23 02:32:27 +01:00
2014-12-22 17:04:56 +01:00
@Override
public void createPlotAndSettings(final Plot plot) {
2015-02-20 07:34:19 +01:00
TaskManager.runTaskAsync(new Runnable() {
2014-12-22 17:04:56 +01:00
@Override
public void run() {
PreparedStatement stmt = null;
try {
stmt = SQLManager.this.connection.prepareStatement(SQLManager.this.CREATE_PLOT);
stmt.setInt(1, plot.id.x);
stmt.setInt(2, plot.id.y);
stmt.setString(3, plot.owner.toString());
stmt.setString(4, plot.world);
stmt.executeUpdate();
stmt.close();
2015-02-20 07:34:19 +01:00
final int id = getId(plot.world, plot.id);
2014-12-22 17:04:56 +01:00
stmt = SQLManager.this.connection.prepareStatement("INSERT INTO `" + SQLManager.this.prefix + "plot_settings`(`plot_plot_id`) VALUES(" + "?)");
stmt.setInt(1, id);
stmt.executeUpdate();
stmt.close();
} catch (final Exception e) {
e.printStackTrace();
2015-02-20 07:34:19 +01:00
PlotSquared.log("&c[ERROR] " + "Failed to save plot " + plot.id);
2014-12-22 17:04:56 +01:00
}
}
});
}
2015-02-23 02:32:27 +01:00
2014-11-05 04:42:08 +01:00
/**
* Create tables
*
* @throws SQLException
*/
@Override
public void createTables(final String database, final boolean add_constraint) throws SQLException {
final boolean mysql = database.equals("mysql");
2014-12-16 06:03:20 +01:00
final Statement stmt = this.connection.createStatement();
2014-11-05 04:42:08 +01:00
if (mysql) {
2015-01-29 08:45:14 +01:00
stmt.addBatch("CREATE TABLE IF NOT EXISTS `" + this.prefix + "plot` (" + "`id` INT(11) NOT NULL AUTO_INCREMENT," + "`plot_id_x` INT(11) NOT NULL," + "`plot_id_z` INT(11) NOT NULL," + "`owner` VARCHAR(40) NOT NULL," + "`world` VARCHAR(45) NOT NULL," + "`timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP," + "PRIMARY KEY (`id`)" + ") ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=0");
2014-12-16 06:03:20 +01:00
stmt.addBatch("CREATE TABLE IF NOT EXISTS `" + this.prefix + "plot_denied` (" + "`plot_plot_id` INT(11) NOT NULL," + "`user_uuid` VARCHAR(40) NOT NULL" + ") ENGINE=InnoDB DEFAULT CHARSET=utf8");
stmt.addBatch("CREATE TABLE IF NOT EXISTS `" + this.prefix + "plot_helpers` (" + "`plot_plot_id` INT(11) NOT NULL," + "`user_uuid` VARCHAR(40) NOT NULL" + ") ENGINE=InnoDB DEFAULT CHARSET=utf8");
stmt.addBatch("CREATE TABLE IF NOT EXISTS `" + this.prefix + "plot_comments` (" + "`plot_plot_id` INT(11) NOT NULL," + "`comment` VARCHAR(40) NOT NULL," + "`tier` INT(11) NOT NULL," + "`sender` VARCHAR(40) NOT NULL" + ") ENGINE=InnoDB DEFAULT CHARSET=utf8");
stmt.addBatch("CREATE TABLE IF NOT EXISTS `" + this.prefix + "plot_trusted` (" + "`plot_plot_id` INT(11) NOT NULL," + "`user_uuid` VARCHAR(40) NOT NULL" + ") ENGINE=InnoDB DEFAULT CHARSET=utf8");
stmt.addBatch("CREATE TABLE IF NOT EXISTS `" + this.prefix + "plot_settings` (" + " `plot_plot_id` INT(11) NOT NULL," + " `biome` VARCHAR(45) DEFAULT 'FOREST'," + " `rain` INT(1) DEFAULT 0," + " `custom_time` TINYINT(1) DEFAULT '0'," + " `time` INT(11) DEFAULT '8000'," + " `deny_entry` TINYINT(1) DEFAULT '0'," + " `alias` VARCHAR(50) DEFAULT NULL," + " `flags` VARCHAR(512) DEFAULT NULL," + " `merged` INT(11) DEFAULT NULL," + " `position` VARCHAR(50) NOT NULL DEFAULT 'DEFAULT'," + " PRIMARY KEY (`plot_plot_id`)," + " UNIQUE KEY `unique_alias` (`alias`)" + ") ENGINE=InnoDB DEFAULT CHARSET=utf8");
stmt.addBatch("CREATE TABLE IF NOT EXISTS `" + this.prefix + "plot_ratings` ( `plot_plot_id` INT(11) NOT NULL, `rating` INT(2) NOT NULL, `player` VARCHAR(40) NOT NULL, PRIMARY KEY(`plot_plot_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8");
2014-11-05 04:42:08 +01:00
if (add_constraint) {
2014-12-16 06:03:20 +01:00
stmt.addBatch("ALTER TABLE `" + this.prefix + "plot_settings` ADD CONSTRAINT `" + this.prefix + "plot_settings_ibfk_1` FOREIGN KEY (`plot_plot_id`) REFERENCES `" + this.prefix + "plot` (`id`) ON DELETE CASCADE");
2014-11-05 04:42:08 +01:00
}
2015-01-29 08:45:14 +01:00
stmt.addBatch("CREATE TABLE IF NOT EXISTS `" + this.prefix + "cluster` (" + "`id` INT(11) NOT NULL AUTO_INCREMENT," + "`pos1_x` INT(11) NOT NULL," + "`pos1_z` INT(11) NOT NULL," + "`pos2_x` INT(11) NOT NULL," + "`pos2_z` INT(11) NOT NULL," + "`owner` VARCHAR(40) NOT NULL," + "`world` VARCHAR(45) NOT NULL," + "`timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP," + "PRIMARY KEY (`id`)" + ") ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=0");
stmt.addBatch("CREATE TABLE IF NOT EXISTS `" + this.prefix + "cluster_helpers` (" + "`cluster_id` INT(11) NOT NULL," + "`user_uuid` VARCHAR(40) NOT NULL" + ") ENGINE=InnoDB DEFAULT CHARSET=utf8");
2015-02-20 07:34:19 +01:00
stmt.addBatch("CREATE TABLE IF NOT EXISTS `" + this.prefix + "cluster_invited` (" + "`cluster_id` INT(11) NOT NULL," + "`user_uuid` VARCHAR(40) NOT NULL" + ") ENGINE=InnoDB DEFAULT CHARSET=utf8");
2015-01-26 05:16:10 +01:00
stmt.addBatch("CREATE TABLE IF NOT EXISTS `" + this.prefix + "cluster_settings` (" + " `cluster_id` INT(11) NOT NULL," + " `biome` VARCHAR(45) DEFAULT 'FOREST'," + " `rain` INT(1) DEFAULT 0," + " `custom_time` TINYINT(1) DEFAULT '0'," + " `time` INT(11) DEFAULT '8000'," + " `deny_entry` TINYINT(1) DEFAULT '0'," + " `alias` VARCHAR(50) DEFAULT NULL," + " `flags` VARCHAR(512) DEFAULT NULL," + " `merged` INT(11) DEFAULT NULL," + " `position` VARCHAR(50) NOT NULL DEFAULT 'DEFAULT'," + " PRIMARY KEY (`cluster_id`)" + ") ENGINE=InnoDB DEFAULT CHARSET=utf8");
2014-12-18 03:15:11 +01:00
} else {
2015-02-20 07:34:19 +01:00
stmt.addBatch("CREATE TABLE IF NOT EXISTS `" + this.prefix + "plot` (" + "`id` INTEGER PRIMARY KEY AUTOINCREMENT," + "`plot_id_x` INT(11) NOT NULL," + "`plot_id_z` INT(11) NOT NULL," + "`owner` VARCHAR(45) NOT NULL," + "`world` VARCHAR(45) NOT NULL," + "`timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP)");
2014-12-16 06:03:20 +01:00
stmt.addBatch("CREATE TABLE IF NOT EXISTS `" + this.prefix + "plot_denied` (" + "`plot_plot_id` INT(11) NOT NULL," + "`user_uuid` VARCHAR(40) NOT NULL" + ")");
stmt.addBatch("CREATE TABLE IF NOT EXISTS `" + this.prefix + "plot_helpers` (" + "`plot_plot_id` INT(11) NOT NULL," + "`user_uuid` VARCHAR(40) NOT NULL" + ")");
stmt.addBatch("CREATE TABLE IF NOT EXISTS `" + this.prefix + "plot_trusted` (" + "`plot_plot_id` INT(11) NOT NULL," + "`user_uuid` VARCHAR(40) NOT NULL" + ")");
stmt.addBatch("CREATE TABLE IF NOT EXISTS `" + this.prefix + "plot_comments` (" + "`plot_plot_id` INT(11) NOT NULL," + "`comment` VARCHAR(40) NOT NULL," + "`tier` INT(11) NOT NULL," + "`sender` VARCHAR(40) NOT NULL" + ")");
stmt.addBatch("CREATE TABLE IF NOT EXISTS `" + this.prefix + "plot_settings` (" + " `plot_plot_id` INT(11) NOT NULL," + " `biome` VARCHAR(45) DEFAULT 'FOREST'," + " `rain` INT(1) DEFAULT 0," + " `custom_time` TINYINT(1) DEFAULT '0'," + " `time` INT(11) DEFAULT '8000'," + " `deny_entry` TINYINT(1) DEFAULT '0'," + " `alias` VARCHAR(50) DEFAULT NULL," + " `flags` VARCHAR(512) DEFAULT NULL," + " `merged` INT(11) DEFAULT NULL," + " `position` VARCHAR(50) NOT NULL DEFAULT 'DEFAULT'," + " PRIMARY KEY (`plot_plot_id`)" + ")");
stmt.addBatch("CREATE TABLE IF NOT EXISTS `" + this.prefix + "plot_ratings` (`plot_plot_id` INT(11) NOT NULL, `rating` INT(2) NOT NULL, `player` VARCHAR(40) NOT NULL, PRIMARY KEY(`plot_plot_id`))");
2015-01-29 08:45:14 +01:00
stmt.addBatch("CREATE TABLE IF NOT EXISTS `" + this.prefix + "cluster` (" + "`id` INTEGER PRIMARY KEY AUTOINCREMENT," + "`pos1_x` INT(11) NOT NULL," + "`pos1_z` INT(11) NOT NULL," + "`pos2_x` INT(11) NOT NULL," + "`pos2_z` INT(11) NOT NULL," + "`owner` VARCHAR(40) NOT NULL," + "`world` VARCHAR(45) NOT NULL," + "`timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP" + ")");
2015-01-29 04:20:29 +01:00
stmt.addBatch("CREATE TABLE IF NOT EXISTS `" + this.prefix + "cluster_helpers` (" + "`cluster_id` INT(11) NOT NULL," + "`user_uuid` VARCHAR(40) NOT NULL" + ")");
stmt.addBatch("CREATE TABLE IF NOT EXISTS `" + this.prefix + "cluster_invited` (" + "`cluster_id` INT(11) NOT NULL," + "`user_uuid` VARCHAR(40) NOT NULL" + ")");
2015-01-26 05:16:10 +01:00
stmt.addBatch("CREATE TABLE IF NOT EXISTS `" + this.prefix + "cluster_settings` (" + " `cluster_id` INT(11) NOT NULL," + " `biome` VARCHAR(45) DEFAULT 'FOREST'," + " `rain` INT(1) DEFAULT 0," + " `custom_time` TINYINT(1) DEFAULT '0'," + " `time` INT(11) DEFAULT '8000'," + " `deny_entry` TINYINT(1) DEFAULT '0'," + " `alias` VARCHAR(50) DEFAULT NULL," + " `flags` VARCHAR(512) DEFAULT NULL," + " `merged` INT(11) DEFAULT NULL," + " `position` VARCHAR(50) NOT NULL DEFAULT 'DEFAULT'," + " PRIMARY KEY (`cluster_id`)" + ")");
2014-11-05 04:42:08 +01:00
}
stmt.executeBatch();
stmt.clearBatch();
stmt.close();
}
2015-02-23 02:32:27 +01:00
2014-11-05 04:42:08 +01:00
/**
* Delete a plot
*
* @param plot
*/
@Override
public void delete(final String world, final Plot plot) {
2015-02-19 09:51:10 +01:00
PlotSquared.removePlot(world, plot.id, false);
2015-02-20 07:34:19 +01:00
TaskManager.runTaskAsync(new Runnable() {
2014-11-05 04:42:08 +01:00
@Override
public void run() {
PreparedStatement stmt = null;
final int id = getId(world, plot.id);
try {
2014-12-16 06:03:20 +01:00
stmt = SQLManager.this.connection.prepareStatement("DELETE FROM `" + SQLManager.this.prefix + "plot_settings` WHERE `plot_plot_id` = ?");
2014-11-05 04:42:08 +01:00
stmt.setInt(1, id);
stmt.executeUpdate();
stmt.close();
2014-12-16 06:03:20 +01:00
stmt = SQLManager.this.connection.prepareStatement("DELETE FROM `" + SQLManager.this.prefix + "plot_helpers` WHERE `plot_plot_id` = ?");
2014-11-05 04:42:08 +01:00
stmt.setInt(1, id);
stmt.executeUpdate();
stmt.close();
2014-12-16 06:03:20 +01:00
stmt = SQLManager.this.connection.prepareStatement("DELETE FROM `" + SQLManager.this.prefix + "plot_trusted` WHERE `plot_plot_id` = ?");
2014-11-05 04:42:08 +01:00
stmt.setInt(1, id);
stmt.executeUpdate();
stmt.close();
2014-12-16 06:03:20 +01:00
stmt = SQLManager.this.connection.prepareStatement("DELETE FROM `" + SQLManager.this.prefix + "plot_comments` WHERE `plot_plot_id` = ?");
2014-11-06 08:23:21 +01:00
stmt.setInt(1, id);
stmt.executeUpdate();
2014-12-16 06:03:20 +01:00
stmt = SQLManager.this.connection.prepareStatement("DELETE FROM `" + SQLManager.this.prefix + "plot` WHERE `id` = ?");
2014-11-05 04:42:08 +01:00
stmt.setInt(1, id);
stmt.executeUpdate();
stmt.close();
2014-12-18 03:15:11 +01:00
} catch (final SQLException e) {
2014-11-05 04:42:08 +01:00
e.printStackTrace();
2015-02-19 11:23:36 +01:00
PlotSquared.log("&c[ERROR] " + "Failed to delete plot " + plot.id);
2014-11-05 04:42:08 +01:00
}
}
});
}
2015-02-23 02:32:27 +01:00
2014-11-05 04:42:08 +01:00
/**
* Create plot settings
*
* @param id
* @param plot
*/
@Override
public void createPlotSettings(final int id, final Plot plot) {
2015-02-20 07:34:19 +01:00
TaskManager.runTaskAsync(new Runnable() {
2014-11-05 04:42:08 +01:00
@Override
public void run() {
PreparedStatement stmt = null;
try {
2014-12-16 06:03:20 +01:00
stmt = SQLManager.this.connection.prepareStatement("INSERT INTO `" + SQLManager.this.prefix + "plot_settings`(`plot_plot_id`) VALUES(" + "?)");
2014-11-05 04:42:08 +01:00
stmt.setInt(1, id);
stmt.executeUpdate();
stmt.close();
2014-12-18 03:15:11 +01:00
} catch (final SQLException e) {
2014-11-05 04:42:08 +01:00
e.printStackTrace();
}
}
});
}
2015-02-23 02:32:27 +01:00
2014-11-05 04:42:08 +01:00
@Override
public int getId(final String world, final PlotId id2) {
PreparedStatement stmt = null;
try {
2014-12-16 06:03:20 +01:00
stmt = this.connection.prepareStatement("SELECT `id` FROM `" + this.prefix + "plot` WHERE `plot_id_x` = ? AND `plot_id_z` = ? AND world = ? ORDER BY `timestamp` ASC");
2014-11-05 04:42:08 +01:00
stmt.setInt(1, id2.x);
stmt.setInt(2, id2.y);
stmt.setString(3, world);
final ResultSet r = stmt.executeQuery();
int id = Integer.MAX_VALUE;
while (r.next()) {
id = r.getInt("id");
}
2015-02-19 04:24:05 +01:00
r.close();
2014-11-05 04:42:08 +01:00
stmt.close();
return id;
2014-12-18 03:15:11 +01:00
} catch (final SQLException e) {
2014-11-05 04:42:08 +01:00
e.printStackTrace();
}
return Integer.MAX_VALUE;
}
2015-02-23 02:32:27 +01:00
2014-11-05 04:42:08 +01:00
/**
* Load all plots, helpers, denied, trusted, and every setting from DB into a hashmap
2014-11-05 04:42:08 +01:00
*/
@Override
public LinkedHashMap<String, HashMap<PlotId, Plot>> getPlots() {
2014-11-21 23:45:46 +01:00
final LinkedHashMap<String, HashMap<PlotId, Plot>> newplots = new LinkedHashMap<>();
2014-11-05 04:42:08 +01:00
try {
2014-12-16 06:03:20 +01:00
final DatabaseMetaData data = this.connection.getMetaData();
ResultSet rs = data.getColumns(null, null, this.prefix + "plot", "plot_id");
2014-11-05 04:42:08 +01:00
final boolean execute = rs.next();
if (execute) {
2014-12-16 06:03:20 +01:00
final Statement statement = this.connection.createStatement();
statement.addBatch("ALTER IGNORE TABLE `" + this.prefix + "plot` ADD `plot_id_x` int(11) DEFAULT 0");
statement.addBatch("ALTER IGNORE TABLE `" + this.prefix + "plot` ADD `plot_id_z` int(11) DEFAULT 0");
statement.addBatch("UPDATE `" + this.prefix + "plot` SET\n" + " `plot_id_x` = IF(" + " LOCATE(';', `plot_id`) > 0," + " SUBSTRING(`plot_id`, 1, LOCATE(';', `plot_id`) - 1)," + " `plot_id`" + " )," + " `plot_id_z` = IF(" + " LOCATE(';', `plot_id`) > 0," + " SUBSTRING(`plot_id`, LOCATE(';', `plot_id`) + 1)," + " NULL" + " )");
statement.addBatch("ALTER TABLE `" + this.prefix + "plot` DROP `plot_id`");
statement.addBatch("ALTER IGNORE TABLE `" + this.prefix + "plot_settings` ADD `flags` VARCHAR(512) DEFAULT NULL");
2014-11-05 04:42:08 +01:00
statement.executeBatch();
statement.close();
}
2014-12-16 06:03:20 +01:00
rs = data.getColumns(null, null, this.prefix + "plot_settings", "merged");
2014-11-05 04:42:08 +01:00
if (!rs.next()) {
2014-12-16 06:03:20 +01:00
final Statement statement = this.connection.createStatement();
statement.addBatch("ALTER TABLE `" + this.prefix + "plot_settings` ADD `merged` int(11) DEFAULT NULL");
2014-11-05 04:42:08 +01:00
statement.executeBatch();
2015-02-19 04:24:05 +01:00
rs.close();
2014-11-05 04:42:08 +01:00
statement.close();
}
2014-12-18 03:15:11 +01:00
} catch (final Exception e) {
2014-11-05 04:42:08 +01:00
e.printStackTrace();
}
2014-11-21 23:45:46 +01:00
final HashMap<Integer, Plot> plots = new HashMap<>();
2014-11-05 04:42:08 +01:00
Statement stmt = null;
try {
2014-11-21 23:45:46 +01:00
Set<String> worlds = new HashSet<>();
2015-02-19 09:51:10 +01:00
if (PlotSquared.config.contains("worlds")) {
worlds = PlotSquared.config.getConfigurationSection("worlds").getKeys(false);
2014-11-05 04:42:08 +01:00
}
final HashMap<String, UUID> uuids = new HashMap<String, UUID>();
final HashMap<String, Integer> noExist = new HashMap<String, Integer>();
/*
* Getting plots
*/
2014-12-16 06:03:20 +01:00
stmt = this.connection.createStatement();
ResultSet r = stmt.executeQuery("SELECT `id`, `plot_id_x`, `plot_id_z`, `owner`, `world` FROM `" + this.prefix + "plot`");
2014-11-05 04:42:08 +01:00
PlotId plot_id;
int id;
Plot p;
String o;
UUID user;
while (r.next()) {
plot_id = new PlotId(r.getInt("plot_id_x"), r.getInt("plot_id_z"));
id = r.getInt("id");
final String worldname = r.getString("world");
if (!worlds.contains(worldname)) {
if (noExist.containsKey(worldname)) {
noExist.put(worldname, noExist.get(worldname) + 1);
2014-12-18 03:15:11 +01:00
} else {
2014-11-05 04:42:08 +01:00
noExist.put(worldname, 1);
}
}
o = r.getString("owner");
user = uuids.get(o);
if (user == null) {
user = UUID.fromString(o);
uuids.put(o, user);
}
2015-02-20 07:34:19 +01:00
p = new Plot(plot_id, user, new ArrayList<UUID>(), new ArrayList<UUID>(), new ArrayList<UUID>(), "", null, null, worldname, new boolean[] { false, false, false, false });
2014-11-05 04:42:08 +01:00
plots.put(id, p);
}
/*
* Getting helpers
*/
2014-12-16 06:03:20 +01:00
r = stmt.executeQuery("SELECT `user_uuid`, `plot_plot_id` FROM `" + this.prefix + "plot_helpers`");
while (r.next()) {
id = r.getInt("plot_plot_id");
o = r.getString("user_uuid");
user = uuids.get(o);
2014-11-05 04:42:08 +01:00
if (user == null) {
user = UUID.fromString(o);
uuids.put(o, user);
}
2014-11-05 04:42:08 +01:00
final Plot plot = plots.get(id);
if (plot != null) {
plot.addHelper(user);
2014-12-18 03:15:11 +01:00
} else {
2015-02-19 11:23:36 +01:00
PlotSquared.log("&cPLOT " + id + " in plot_helpers does not exist. Please create the plot or remove this entry.");
}
}
/*
* Getting trusted
*/
2014-12-16 06:03:20 +01:00
r = stmt.executeQuery("SELECT `user_uuid`, `plot_plot_id` FROM `" + this.prefix + "plot_trusted`");
while (r.next()) {
id = r.getInt("plot_plot_id");
o = r.getString("user_uuid");
user = uuids.get(o);
2014-11-05 04:42:08 +01:00
if (user == null) {
user = UUID.fromString(o);
uuids.put(o, user);
}
2014-11-05 04:42:08 +01:00
final Plot plot = plots.get(id);
if (plot != null) {
plot.addTrusted(user);
2014-12-18 03:15:11 +01:00
} else {
2015-02-19 11:23:36 +01:00
PlotSquared.log("&cPLOT " + id + " in plot_trusted does not exist. Please create the plot or remove this entry.");
}
}
/*
* Getting denied
*/
2014-12-16 06:03:20 +01:00
r = stmt.executeQuery("SELECT `user_uuid`, `plot_plot_id` FROM `" + this.prefix + "plot_denied`");
while (r.next()) {
id = r.getInt("plot_plot_id");
o = r.getString("user_uuid");
user = uuids.get(o);
2014-11-05 04:42:08 +01:00
if (user == null) {
user = UUID.fromString(o);
uuids.put(o, user);
}
2014-11-05 04:42:08 +01:00
final Plot plot = plots.get(id);
if (plot != null) {
plot.addDenied(user);
2014-12-18 03:15:11 +01:00
} else {
2015-02-19 11:23:36 +01:00
PlotSquared.log("&cPLOT " + id + " in plot_denied does not exist. Please create the plot or remove this entry.");
}
}
2014-12-16 06:03:20 +01:00
r = stmt.executeQuery("SELECT * FROM `" + this.prefix + "plot_settings`");
while (r.next()) {
id = r.getInt("plot_plot_id");
2014-11-05 04:42:08 +01:00
final Plot plot = plots.get(id);
if (plot != null) {
final String b = r.getString("biome");
if (b != null) {
for (final Biome mybiome : Biome.values()) {
if (mybiome.toString().equalsIgnoreCase(b)) {
break;
}
}
}
2014-11-05 04:42:08 +01:00
final String alias = r.getString("alias");
if (alias != null) {
plot.settings.setAlias(alias);
}
2014-11-05 04:42:08 +01:00
final String pos = r.getString("position");
switch (pos.toLowerCase()) {
case "":
case "default":
case "0,0,0":
case "center":
break;
default:
try {
2015-02-20 07:34:19 +01:00
final String[] split = pos.split(",");
final BlockLoc loc = new BlockLoc(Integer.parseInt(split[0]), Integer.parseInt(split[1]), Integer.parseInt(split[2]));
plot.settings.setPosition(loc);
2015-02-20 07:34:19 +01:00
} catch (final Exception e) {
}
}
2014-11-05 04:42:08 +01:00
final Integer m = r.getInt("merged");
if (m != null) {
final boolean[] merged = new boolean[4];
for (int i = 0; i < 4; i++) {
2014-11-05 04:42:08 +01:00
merged[3 - i] = ((m) & (1 << i)) != 0;
}
plot.settings.setMerged(merged);
2014-12-18 03:15:11 +01:00
} else {
2015-02-20 07:34:19 +01:00
plot.settings.setMerged(new boolean[] { false, false, false, false });
}
String[] flags_string;
2014-11-05 04:42:08 +01:00
final String myflags = r.getString("flags");
if (myflags == null) {
2015-02-20 07:34:19 +01:00
flags_string = new String[] {};
2014-12-18 03:15:11 +01:00
} else {
2015-01-09 15:05:10 +01:00
if (myflags.length() > 0) {
flags_string = myflags.split(",");
2015-02-20 07:34:19 +01:00
} else {
flags_string = new String[] {};
2015-01-09 15:05:10 +01:00
}
}
2015-01-06 17:08:29 +01:00
final Set<Flag> flags = new HashSet<Flag>();
boolean exception = false;
2014-11-05 04:42:08 +01:00
for (final String element : flags_string) {
if (element.contains(":")) {
final String[] split = element.split(":");
try {
2015-02-20 07:34:19 +01:00
final String flag_str = split[1].replaceAll("\u00AF", ":").replaceAll("\u00B4", ",");
final Flag flag = new Flag(FlagManager.getFlag(split[0], true), flag_str);
flags.add(flag);
2014-12-18 03:15:11 +01:00
} catch (final Exception e) {
2015-01-09 15:05:10 +01:00
e.printStackTrace();
exception = true;
}
2014-12-18 03:15:11 +01:00
} else {
2014-11-05 04:42:08 +01:00
flags.add(new Flag(FlagManager.getFlag(element, true), ""));
}
}
if (exception) {
2015-02-19 11:23:36 +01:00
PlotSquared.log("&cPlot " + id + " had an invalid flag. A fix has been attempted.");
setFlags(id, flags.toArray(new Flag[0]));
}
2015-01-09 15:05:10 +01:00
plot.settings.flags = flags;
2014-12-18 03:15:11 +01:00
} else {
2015-02-19 11:23:36 +01:00
PlotSquared.log("&cPLOT " + id + " in plot_settings does not exist. Please create the plot or remove this entry.");
}
}
stmt.close();
2015-02-19 04:24:05 +01:00
r.close();
2014-11-05 04:42:08 +01:00
for (final Plot plot : plots.values()) {
final String world = plot.world;
if (!newplots.containsKey(world)) {
newplots.put(world, new HashMap<PlotId, Plot>());
}
newplots.get(world).put(plot.id, plot);
}
2014-11-06 08:23:21 +01:00
boolean invalidPlot = false;
2014-11-05 04:42:08 +01:00
for (final String worldname : noExist.keySet()) {
2014-11-06 08:23:21 +01:00
invalidPlot = true;
2015-02-19 11:23:36 +01:00
PlotSquared.log("&c[WARNING] Found " + noExist.get(worldname) + " plots in DB for non existant world; '" + worldname + "'.");
2014-11-06 08:23:21 +01:00
}
if (invalidPlot) {
2015-02-19 11:23:36 +01:00
PlotSquared.log("&c[WARNING] - Please create the world/s or remove the plots using the purge command");
2014-11-05 04:42:08 +01:00
}
2014-12-18 03:15:11 +01:00
} catch (final SQLException e) {
2015-02-20 07:34:19 +01:00
PlotSquared.log("&7[WARN] " + "Failed to load plots.");
2014-11-05 04:42:08 +01:00
e.printStackTrace();
}
return newplots;
}
2015-02-23 02:32:27 +01:00
2014-11-05 04:42:08 +01:00
@Override
public void setMerged(final String world, final Plot plot, final boolean[] merged) {
plot.settings.setMerged(merged);
2015-02-20 07:34:19 +01:00
TaskManager.runTaskAsync(new Runnable() {
2014-11-05 04:42:08 +01:00
@Override
public void run() {
try {
int n = 0;
for (int i = 0; i < 4; ++i) {
n = (n << 1) + (merged[i] ? 1 : 0);
}
2014-12-16 06:03:20 +01:00
final PreparedStatement stmt = SQLManager.this.connection.prepareStatement("UPDATE `" + SQLManager.this.prefix + "plot_settings` SET `merged` = ? WHERE `plot_plot_id` = ?");
2014-11-05 04:42:08 +01:00
stmt.setInt(1, n);
stmt.setInt(2, getId(world, plot.id));
stmt.execute();
stmt.close();
2014-12-18 03:15:11 +01:00
} catch (final SQLException e) {
2014-11-05 04:42:08 +01:00
e.printStackTrace();
2015-02-20 07:34:19 +01:00
PlotSquared.log("&7[WARN] " + "Could not set merged for plot " + plot.id);
2014-11-05 04:42:08 +01:00
}
}
});
}
2015-02-23 02:32:27 +01:00
@Override
public void swapPlots(final Plot p1, final Plot p2) {
2015-02-20 07:34:19 +01:00
TaskManager.runTaskAsync(new Runnable() {
@Override
public void run() {
/*
* We don't need to actually swap all the rows
* - Just switch the plot_id_x and plot_id_z
* - The other tables reference the `id` so it will cascade
*/
try {
final String world = p1.world;
final int id1 = getId(world, p1.id);
final int id2 = getId(world, p2.id);
final PlotId pos1 = p1.getId();
final PlotId pos2 = p2.getId();
PreparedStatement stmt = SQLManager.this.connection.prepareStatement("UPDATE `" + SQLManager.this.prefix + "plot` SET `plot_id_x` = ?, `plot_id_z` = ? WHERE `id` = ?");
stmt.setInt(1, pos2.x);
stmt.setInt(2, pos2.y);
stmt.setInt(3, id1);
stmt.executeUpdate();
stmt.close();
stmt = SQLManager.this.connection.prepareStatement("UPDATE `" + SQLManager.this.prefix + "plot` SET `plot_id_x` = ?, `plot_id_z` = ? WHERE `id` = ?");
stmt.setInt(1, pos1.x);
stmt.setInt(2, pos1.y);
stmt.setInt(3, id2);
stmt.executeUpdate();
stmt.close();
} catch (final Exception e) {
e.printStackTrace();
2015-02-15 08:40:55 +01:00
}
2015-02-20 07:34:19 +01:00
}
});
2015-02-15 08:40:55 +01:00
}
2015-02-23 02:32:27 +01:00
2015-02-15 08:40:55 +01:00
@Override
public void movePlot(final String world, final PlotId originalPlot, final PlotId newPlot) {
2015-02-20 07:34:19 +01:00
TaskManager.runTaskAsync(new Runnable() {
@Override
public void run() {
try {
final int id = getId(world, originalPlot);
final PreparedStatement stmt = SQLManager.this.connection.prepareStatement("UPDATE `" + SQLManager.this.prefix + "plot` SET `plot_id_x` = ?, `plot_id_z` = ? WHERE `id` = ?");
stmt.setInt(1, newPlot.x);
stmt.setInt(2, newPlot.y);
stmt.setInt(3, id);
stmt.executeUpdate();
stmt.close();
} catch (final Exception e) {
e.printStackTrace();
}
2015-02-20 07:34:19 +01:00
}
});
}
2015-02-23 02:32:27 +01:00
2014-11-05 04:42:08 +01:00
@Override
2015-01-06 17:08:29 +01:00
public void setFlags(final String world, final Plot plot, final Set<Flag> flags) {
2014-11-05 04:42:08 +01:00
final StringBuilder flag_string = new StringBuilder();
int i = 0;
for (final Flag flag : flags) {
if (i != 0) {
flag_string.append(",");
}
flag_string.append(flag.getKey() + ":" + flag.getValueString().replaceAll(":", "\u00AF").replaceAll(",", "\u00B4"));
2014-11-05 04:42:08 +01:00
i++;
}
2015-02-20 07:34:19 +01:00
TaskManager.runTaskAsync(new Runnable() {
2014-11-05 04:42:08 +01:00
@Override
public void run() {
try {
2014-12-16 06:03:20 +01:00
final PreparedStatement stmt = SQLManager.this.connection.prepareStatement("UPDATE `" + SQLManager.this.prefix + "plot_settings` SET `flags` = ? WHERE `plot_plot_id` = ?");
2014-11-05 04:42:08 +01:00
stmt.setString(1, flag_string.toString());
stmt.setInt(2, getId(world, plot.id));
stmt.execute();
stmt.close();
2014-12-18 03:15:11 +01:00
} catch (final SQLException e) {
2014-11-05 04:42:08 +01:00
e.printStackTrace();
2015-02-20 07:34:19 +01:00
PlotSquared.log("&7[WARN] " + "Could not set flag for plot " + plot.id);
2014-11-05 04:42:08 +01:00
}
}
});
}
2015-02-23 02:32:27 +01:00
public void setFlags(final int id, final Flag[] flags) {
2014-11-05 04:42:08 +01:00
final ArrayList<Flag> newflags = new ArrayList<Flag>();
for (final Flag flag : flags) {
if ((flag != null) && (flag.getKey() != null) && !flag.getKey().equals("")) {
2014-10-25 02:16:15 +02:00
newflags.add(flag);
}
}
2014-11-05 04:42:08 +01:00
final String flag_string = StringUtils.join(newflags, ",");
2015-02-20 07:34:19 +01:00
TaskManager.runTaskAsync(new Runnable() {
2014-10-25 02:16:15 +02:00
@Override
public void run() {
try {
2014-12-16 06:03:20 +01:00
final PreparedStatement stmt = SQLManager.this.connection.prepareStatement("UPDATE `" + SQLManager.this.prefix + "plot_settings` SET `flags` = ? WHERE `plot_plot_id` = ?");
2014-10-25 02:16:15 +02:00
stmt.setString(1, flag_string);
stmt.setInt(2, id);
stmt.execute();
stmt.close();
2014-12-18 03:15:11 +01:00
} catch (final SQLException e) {
2014-10-25 02:16:15 +02:00
e.printStackTrace();
2015-02-20 07:34:19 +01:00
PlotSquared.log("&7[WARN] " + "Could not set flag for plot " + id);
2014-10-25 02:16:15 +02:00
}
}
});
}
2015-02-23 02:32:27 +01:00
2014-11-05 04:42:08 +01:00
/**
* @param plot
* @param alias
*/
@Override
public void setAlias(final String world, final Plot plot, final String alias) {
plot.settings.setAlias(alias);
2015-02-20 07:34:19 +01:00
TaskManager.runTaskAsync(new Runnable() {
2014-11-05 04:42:08 +01:00
@Override
public void run() {
PreparedStatement stmt = null;
try {
2014-12-16 06:03:20 +01:00
stmt = SQLManager.this.connection.prepareStatement("UPDATE `" + SQLManager.this.prefix + "plot_settings` SET `alias` = ? WHERE `plot_plot_id` = ?");
2014-11-05 04:42:08 +01:00
stmt.setString(1, alias);
stmt.setInt(2, getId(world, plot.id));
stmt.executeUpdate();
stmt.close();
2014-12-18 03:15:11 +01:00
} catch (final SQLException e) {
2015-02-20 07:34:19 +01:00
PlotSquared.log("&7[WARN] " + "Failed to set alias for plot " + plot.id);
2014-11-05 04:42:08 +01:00
e.printStackTrace();
}
}
});
}
2015-02-23 02:32:27 +01:00
2014-11-05 04:42:08 +01:00
/**
2015-01-16 08:04:55 +01:00
* Purge all plots with the following database IDs
2014-11-05 04:42:08 +01:00
*/
2015-02-20 07:34:19 +01:00
@Override
2015-01-07 07:44:03 +01:00
public void purgeIds(final String world, final Set<Integer> uniqueIds) {
if (uniqueIds.size() > 0) {
try {
2015-01-16 08:04:55 +01:00
String stmt_prefix = "";
2015-01-07 07:44:03 +01:00
final StringBuilder idstr = new StringBuilder("");
for (final Integer id : uniqueIds) {
2015-01-16 08:04:55 +01:00
idstr.append(stmt_prefix + id);
stmt_prefix = " OR `plot_plot_id` = ";
}
2015-01-16 08:04:55 +01:00
PreparedStatement stmt = SQLManager.this.connection.prepareStatement("DELETE FROM `" + this.prefix + "plot_helpers` WHERE `plot_plot_id` = " + idstr + "");
2015-01-07 07:44:03 +01:00
stmt.executeUpdate();
stmt.close();
2015-01-16 08:04:55 +01:00
stmt = SQLManager.this.connection.prepareStatement("DELETE FROM `" + this.prefix + "plot_denied` WHERE `plot_plot_id` = " + idstr + "");
2015-01-07 07:44:03 +01:00
stmt.executeUpdate();
stmt.close();
2015-01-16 08:04:55 +01:00
stmt = SQLManager.this.connection.prepareStatement("DELETE FROM `" + this.prefix + "plot_settings` WHERE `plot_plot_id` = " + idstr + "");
2015-01-07 07:44:03 +01:00
stmt.executeUpdate();
stmt.close();
2015-01-16 08:04:55 +01:00
stmt = SQLManager.this.connection.prepareStatement("DELETE FROM `" + this.prefix + "plot_trusted` WHERE `plot_plot_id` = " + idstr + "");
2015-01-07 07:44:03 +01:00
stmt.executeUpdate();
stmt.close();
2015-01-16 08:04:55 +01:00
stmt = SQLManager.this.connection.prepareStatement("DELETE FROM `" + this.prefix + "plot` WHERE `world` = ?");
2015-01-07 07:44:03 +01:00
stmt.setString(1, world);
stmt.executeUpdate();
stmt.close();
} catch (final SQLException e) {
e.printStackTrace();
2015-02-20 07:34:19 +01:00
PlotSquared.log("&c[ERROR] " + "FAILED TO PURGE WORLD '" + world + "'!");
2015-01-07 07:44:03 +01:00
return;
}
}
2015-02-20 07:34:19 +01:00
PlotSquared.log("&6[INFO] " + "SUCCESSFULLY PURGED WORLD '" + world + "'!");
2015-01-07 07:44:03 +01:00
}
2015-02-23 02:32:27 +01:00
2015-01-07 07:44:03 +01:00
@Override
2015-02-20 07:34:19 +01:00
public void purge(final String world, final Set<PlotId> plots) {
for (final PlotId id : plots) {
2015-03-02 12:55:31 +01:00
PlotSquared.removePlot(world, new PlotId(id.x, id.y), true);
2015-02-20 07:34:19 +01:00
}
2015-01-07 07:44:03 +01:00
PreparedStatement stmt;
try {
stmt = SQLManager.this.connection.prepareStatement("SELECT `id`, `plot_id_x`, `plot_id_z` FROM `" + this.prefix + "plot` WHERE `world` = ?");
stmt.setString(1, world);
2015-02-20 07:34:19 +01:00
final ResultSet r = stmt.executeQuery();
2015-01-07 07:44:03 +01:00
PlotId plot_id;
2015-02-20 07:34:19 +01:00
final Set<Integer> ids = new HashSet<>();
2015-01-07 07:44:03 +01:00
while (r.next()) {
plot_id = new PlotId(r.getInt("plot_id_x"), r.getInt("plot_id_z"));
if (plots.contains(plot_id)) {
ids.add(r.getInt("id"));
2014-11-05 04:42:08 +01:00
}
}
2015-01-07 07:44:03 +01:00
purgeIds(world, ids);
2015-02-19 04:24:05 +01:00
stmt.close();
r.close();
2015-02-20 07:34:19 +01:00
} catch (final SQLException e) {
2015-01-07 07:44:03 +01:00
e.printStackTrace();
2015-02-20 07:34:19 +01:00
PlotSquared.log("&c[ERROR] " + "FAILED TO PURGE WORLD '" + world + "'!");
2015-01-07 07:44:03 +01:00
}
2014-11-05 04:42:08 +01:00
}
2015-02-23 02:32:27 +01:00
2014-11-05 04:42:08 +01:00
/**
* @param plot
* @param position
*/
@Override
public void setPosition(final String world, final Plot plot, final String position) {
2015-02-20 07:34:19 +01:00
TaskManager.runTaskAsync(new Runnable() {
2014-11-05 04:42:08 +01:00
@Override
public void run() {
PreparedStatement stmt = null;
try {
2014-12-16 06:03:20 +01:00
stmt = SQLManager.this.connection.prepareStatement("UPDATE `" + SQLManager.this.prefix + "plot_settings` SET `position` = ? WHERE `plot_plot_id` = ?");
2014-11-05 04:42:08 +01:00
stmt.setString(1, position);
stmt.setInt(2, getId(world, plot.id));
stmt.executeUpdate();
stmt.close();
2014-12-18 03:15:11 +01:00
} catch (final SQLException e) {
2015-02-20 07:34:19 +01:00
PlotSquared.log("&7[WARN] " + "Failed to set position for plot " + plot.id);
2014-11-05 04:42:08 +01:00
e.printStackTrace();
}
}
});
}
2015-02-23 02:32:27 +01:00
2014-11-05 04:42:08 +01:00
/**
* @param id
2014-12-18 03:15:11 +01:00
*
2014-11-05 04:42:08 +01:00
* @return
*/
@Override
public HashMap<String, Object> getSettings(final int id) {
final HashMap<String, Object> h = new HashMap<String, Object>();
PreparedStatement stmt = null;
try {
2014-12-16 06:03:20 +01:00
stmt = this.connection.prepareStatement("SELECT * FROM `" + this.prefix + "plot_settings` WHERE `plot_plot_id` = ?");
2014-11-05 04:42:08 +01:00
stmt.setInt(1, id);
final ResultSet r = stmt.executeQuery();
String var;
Object val;
while (r.next()) {
var = "biome";
val = r.getObject(var);
h.put(var, val);
var = "rain";
val = r.getObject(var);
h.put(var, val);
var = "custom_time";
val = r.getObject(var);
h.put(var, val);
var = "time";
val = r.getObject(var);
h.put(var, val);
var = "deny_entry";
val = r.getObject(var);
h.put(var, (short) 0);
var = "alias";
val = r.getObject(var);
h.put(var, val);
var = "position";
val = r.getObject(var);
h.put(var, val);
var = "flags";
val = r.getObject(var);
h.put(var, val);
var = "merged";
val = r.getObject(var);
h.put(var, val);
}
stmt.close();
2015-02-19 04:24:05 +01:00
r.close();
2014-12-18 03:15:11 +01:00
} catch (final SQLException e) {
2015-02-20 07:34:19 +01:00
PlotSquared.log("&7[WARN] " + "Failed to load settings for plot: " + id);
2014-11-05 04:42:08 +01:00
e.printStackTrace();
}
return h;
}
2015-02-23 02:32:27 +01:00
2014-11-05 04:42:08 +01:00
@Override
2014-11-02 04:45:52 +01:00
public void removeComment(final String world, final Plot plot, final PlotComment comment) {
2015-02-20 07:34:19 +01:00
TaskManager.runTaskAsync(new Runnable() {
2014-11-02 04:45:52 +01:00
@Override
public void run() {
try {
2015-02-20 07:34:19 +01:00
PreparedStatement statement;
if (plot != null) {
statement = SQLManager.this.connection.prepareStatement("DELETE FROM `" + SQLManager.this.prefix + "plot_comments` WHERE `plot_plot_id` = ? AND `comment` = ? AND `tier` = ? AND `sender` = ?");
statement.setInt(1, getId(world, plot.id));
statement.setString(2, comment.comment);
statement.setInt(3, comment.tier);
statement.setString(4, comment.senderName);
} else {
statement = SQLManager.this.connection.prepareStatement("DELETE FROM `" + SQLManager.this.prefix + "plot_comments` WHERE `comment` = ? AND `tier` = ? AND `sender` = ?");
statement.setString(1, comment.comment);
statement.setInt(2, comment.tier);
statement.setString(3, comment.senderName);
}
2014-11-02 04:45:52 +01:00
statement.executeUpdate();
statement.close();
2014-12-18 03:15:11 +01:00
} catch (final SQLException e) {
2014-11-02 04:45:52 +01:00
e.printStackTrace();
2015-02-20 07:34:19 +01:00
PlotSquared.log("&7[WARN] " + "Failed to remove helper for plot " + plot.id);
2014-11-02 04:45:52 +01:00
}
}
});
}
2015-02-23 02:32:27 +01:00
2014-11-02 04:45:52 +01:00
@Override
2015-02-20 07:34:19 +01:00
public ArrayList<PlotComment> getComments(final String world, final Plot plot, final int tier, final boolean below) {
2014-11-05 04:42:08 +01:00
final ArrayList<PlotComment> comments = new ArrayList<PlotComment>();
2014-11-02 04:45:52 +01:00
try {
2015-01-14 15:22:45 +01:00
final PreparedStatement statement;
2015-02-20 07:34:19 +01:00
final String comparison = below ? ">=" : "=";
2015-01-14 15:22:45 +01:00
if (plot != null) {
2015-02-20 07:34:19 +01:00
statement = this.connection.prepareStatement("SELECT * FROM `" + this.prefix + "plot_comments` WHERE `plot_plot_id` = ? AND `tier` " + comparison + " ?");
statement.setInt(1, getId(plot.world, plot.id));
2015-01-14 15:22:45 +01:00
statement.setInt(2, tier);
2015-02-20 07:34:19 +01:00
} else {
statement = this.connection.prepareStatement("SELECT * FROM `" + this.prefix + "plot_comments` WHERE `tier` " + comparison + " ?");
2015-01-14 15:22:45 +01:00
statement.setInt(1, tier);
}
2014-11-05 04:42:08 +01:00
final ResultSet set = statement.executeQuery();
2014-11-02 04:45:52 +01:00
PlotComment comment;
while (set.next()) {
2014-11-05 04:42:08 +01:00
final String sender = set.getString("sender");
final String msg = set.getString("comment");
2014-11-02 04:45:52 +01:00
comment = new PlotComment(msg, sender, tier);
comments.add(comment);
}
statement.close();
2015-02-19 04:24:05 +01:00
set.close();
2014-12-18 03:15:11 +01:00
} catch (final SQLException e) {
2015-02-20 07:34:19 +01:00
PlotSquared.log("&7[WARN] " + "Failed to fetch comment");
2014-11-02 04:45:52 +01:00
e.printStackTrace();
}
return comments;
}
2015-02-23 02:32:27 +01:00
2014-11-02 04:45:52 +01:00
@Override
public void setComment(final String world, final Plot plot, final PlotComment comment) {
2015-02-20 07:34:19 +01:00
TaskManager.runTaskAsync(new Runnable() {
2014-11-02 04:45:52 +01:00
@Override
public void run() {
try {
2014-12-16 06:03:20 +01:00
final PreparedStatement statement = SQLManager.this.connection.prepareStatement("INSERT INTO `" + SQLManager.this.prefix + "plot_comments` (`plot_plot_id`, `comment`, `tier`, `sender`) VALUES(?,?,?,?)");
2014-11-02 04:45:52 +01:00
statement.setInt(1, getId(world, plot.id));
statement.setString(2, comment.comment);
statement.setInt(3, comment.tier);
statement.setString(4, comment.senderName);
statement.executeUpdate();
statement.close();
2014-12-18 03:15:11 +01:00
} catch (final SQLException e) {
2014-11-05 04:42:08 +01:00
e.printStackTrace();
2015-02-20 07:34:19 +01:00
PlotSquared.log("&7[WARN] " + "Failed to set comment for plot " + plot.id);
2014-11-05 04:42:08 +01:00
}
}
});
}
2015-02-23 02:32:27 +01:00
2014-11-05 04:42:08 +01:00
/**
* @param plot
* @param player
*/
@Override
2015-01-18 21:30:32 +01:00
public void removeHelper(final String world, final Plot plot, final UUID uuid) {
2015-02-20 07:34:19 +01:00
TaskManager.runTaskAsync(new Runnable() {
2014-11-05 04:42:08 +01:00
@Override
public void run() {
try {
2014-12-16 06:03:20 +01:00
final PreparedStatement statement = SQLManager.this.connection.prepareStatement("DELETE FROM `" + SQLManager.this.prefix + "plot_helpers` WHERE `plot_plot_id` = ? AND `user_uuid` = ?");
2014-11-05 04:42:08 +01:00
statement.setInt(1, getId(world, plot.id));
2015-01-18 21:30:32 +01:00
statement.setString(2, uuid.toString());
2014-11-05 04:42:08 +01:00
statement.executeUpdate();
statement.close();
2014-12-18 03:15:11 +01:00
} catch (final SQLException e) {
2014-11-02 04:45:52 +01:00
e.printStackTrace();
2015-02-20 07:34:19 +01:00
PlotSquared.log("&7[WARN] " + "Failed to remove helper for plot " + plot.id);
2014-11-02 04:45:52 +01:00
}
}
});
}
2015-02-23 02:32:27 +01:00
2014-11-05 04:42:08 +01:00
/**
* @param plot
* @param player
*/
@Override
2015-01-18 21:30:32 +01:00
public void removeTrusted(final String world, final Plot plot, final UUID uuid) {
2015-02-20 07:34:19 +01:00
TaskManager.runTaskAsync(new Runnable() {
2014-11-05 04:42:08 +01:00
@Override
public void run() {
try {
2014-12-16 06:03:20 +01:00
final PreparedStatement statement = SQLManager.this.connection.prepareStatement("DELETE FROM `" + SQLManager.this.prefix + "plot_trusted` WHERE `plot_plot_id` = ? AND `user_uuid` = ?");
2014-11-05 04:42:08 +01:00
statement.setInt(1, getId(world, plot.id));
2015-01-18 21:30:32 +01:00
statement.setString(2, uuid.toString());
2014-11-05 04:42:08 +01:00
statement.executeUpdate();
statement.close();
2014-12-18 03:15:11 +01:00
} catch (final SQLException e) {
2014-11-05 04:42:08 +01:00
e.printStackTrace();
2015-02-20 07:34:19 +01:00
PlotSquared.log("&7[WARN] " + "Failed to remove trusted user for plot " + plot.id);
2014-11-05 04:42:08 +01:00
}
}
});
}
2015-02-23 02:32:27 +01:00
2014-11-05 04:42:08 +01:00
/**
* @param plot
* @param player
*/
@Override
2015-01-18 21:30:32 +01:00
public void setHelper(final String world, final Plot plot, final UUID uuid) {
2015-02-20 07:34:19 +01:00
TaskManager.runTaskAsync(new Runnable() {
2014-11-05 04:42:08 +01:00
@Override
public void run() {
try {
2014-12-16 06:03:20 +01:00
final PreparedStatement statement = SQLManager.this.connection.prepareStatement("INSERT INTO `" + SQLManager.this.prefix + "plot_helpers` (`plot_plot_id`, `user_uuid`) VALUES(?,?)");
2014-11-05 04:42:08 +01:00
statement.setInt(1, getId(world, plot.id));
2015-01-18 21:30:32 +01:00
statement.setString(2, uuid.toString());
2014-11-05 04:42:08 +01:00
statement.executeUpdate();
statement.close();
2014-12-18 03:15:11 +01:00
} catch (final SQLException e) {
2015-02-20 07:34:19 +01:00
PlotSquared.log("&7[WARN] " + "Failed to set helper for plot " + plot.id);
2014-11-05 04:42:08 +01:00
e.printStackTrace();
}
}
});
}
2015-02-23 02:32:27 +01:00
2014-12-21 05:03:59 +01:00
public void setHelper(final int id, final UUID uuid) {
2015-02-20 07:34:19 +01:00
TaskManager.runTaskAsync(new Runnable() {
2014-12-21 05:03:59 +01:00
@Override
public void run() {
try {
final PreparedStatement statement = SQLManager.this.connection.prepareStatement("INSERT INTO `" + SQLManager.this.prefix + "plot_helpers` (`plot_plot_id`, `user_uuid`) VALUES(?,?)");
statement.setInt(1, id);
statement.setString(2, uuid.toString());
statement.executeUpdate();
statement.close();
} catch (final SQLException e) {
2015-02-20 07:34:19 +01:00
PlotSquared.log("&7[WARN] " + "Failed to set helper for id " + id);
2014-12-21 05:03:59 +01:00
e.printStackTrace();
}
}
});
}
2015-02-23 02:32:27 +01:00
2014-11-05 04:42:08 +01:00
/**
* @param plot
* @param player
*/
@Override
2015-01-18 21:30:32 +01:00
public void setTrusted(final String world, final Plot plot, final UUID uuid) {
2015-02-20 07:34:19 +01:00
TaskManager.runTaskAsync(new Runnable() {
2014-11-05 04:42:08 +01:00
@Override
public void run() {
try {
2014-12-16 06:03:20 +01:00
final PreparedStatement statement = SQLManager.this.connection.prepareStatement("INSERT INTO `" + SQLManager.this.prefix + "plot_trusted` (`plot_plot_id`, `user_uuid`) VALUES(?,?)");
2014-11-05 04:42:08 +01:00
statement.setInt(1, getId(world, plot.id));
2015-01-18 21:30:32 +01:00
statement.setString(2, uuid.toString());
2014-11-05 04:42:08 +01:00
statement.executeUpdate();
statement.close();
2014-12-18 03:15:11 +01:00
} catch (final SQLException e) {
2015-02-20 07:34:19 +01:00
PlotSquared.log("&7[WARN] " + "Failed to set plot trusted for plot " + plot.id);
2014-11-05 04:42:08 +01:00
e.printStackTrace();
}
}
});
}
2015-02-23 02:32:27 +01:00
2014-11-05 04:42:08 +01:00
/**
* @param plot
* @param player
*/
@Override
2015-01-18 21:30:32 +01:00
public void removeDenied(final String world, final Plot plot, final UUID uuid) {
2015-02-20 07:34:19 +01:00
TaskManager.runTaskAsync(new Runnable() {
2014-11-05 04:42:08 +01:00
@Override
public void run() {
try {
2014-12-16 06:03:20 +01:00
final PreparedStatement statement = SQLManager.this.connection.prepareStatement("DELETE FROM `" + SQLManager.this.prefix + "plot_denied` WHERE `plot_plot_id` = ? AND `user_uuid` = ?");
2014-11-05 04:42:08 +01:00
statement.setInt(1, getId(world, plot.id));
2015-01-18 21:30:32 +01:00
statement.setString(2, uuid.toString());
2014-11-05 04:42:08 +01:00
statement.executeUpdate();
statement.close();
2014-12-18 03:15:11 +01:00
} catch (final SQLException e) {
2014-11-05 04:42:08 +01:00
e.printStackTrace();
2015-02-20 07:34:19 +01:00
PlotSquared.log("&7[WARN] " + "Failed to remove denied for plot " + plot.id);
2014-11-05 04:42:08 +01:00
}
}
});
}
2015-02-23 02:32:27 +01:00
2014-11-05 04:42:08 +01:00
/**
* @param plot
* @param player
*/
@Override
2015-01-18 21:30:32 +01:00
public void setDenied(final String world, final Plot plot, final UUID uuid) {
2015-02-20 07:34:19 +01:00
TaskManager.runTaskAsync(new Runnable() {
2014-11-05 04:42:08 +01:00
@Override
public void run() {
try {
2014-12-16 06:03:20 +01:00
final PreparedStatement statement = SQLManager.this.connection.prepareStatement("INSERT INTO `" + SQLManager.this.prefix + "plot_denied` (`plot_plot_id`, `user_uuid`) VALUES(?,?)");
2014-11-05 04:42:08 +01:00
statement.setInt(1, getId(world, plot.id));
2015-01-18 21:30:32 +01:00
statement.setString(2, uuid.toString());
2014-11-05 04:42:08 +01:00
statement.executeUpdate();
statement.close();
2014-12-18 03:15:11 +01:00
} catch (final SQLException e) {
2015-02-20 07:34:19 +01:00
PlotSquared.log("&7[WARN] " + "Failed to set denied for plot " + plot.id);
2014-11-05 04:42:08 +01:00
e.printStackTrace();
}
}
});
}
2015-02-23 02:32:27 +01:00
2014-11-05 04:42:08 +01:00
@Override
public double getRatings(final Plot plot) {
try {
2014-12-16 06:03:20 +01:00
final PreparedStatement statement = this.connection.prepareStatement("SELECT AVG(`rating`) AS `rating` FROM `" + this.prefix + "plot_ratings` WHERE `plot_plot_id` = ? ");
2015-02-20 05:32:40 +01:00
statement.setInt(1, getId(plot.world, plot.id));
2014-11-05 04:42:08 +01:00
final ResultSet set = statement.executeQuery();
double rating = 0;
while (set.next()) {
rating = set.getDouble("rating");
}
statement.close();
2015-02-19 04:24:05 +01:00
set.close();
2014-11-05 04:42:08 +01:00
return rating;
2014-12-18 03:15:11 +01:00
} catch (final SQLException e) {
2015-02-20 07:34:19 +01:00
PlotSquared.log("&7[WARN] " + "Failed to fetch rating for plot " + plot.getId().toString());
2014-11-05 04:42:08 +01:00
e.printStackTrace();
}
return 0.0d;
}
2015-02-23 02:32:27 +01:00
2015-02-20 07:34:19 +01:00
@Override
public void delete(final PlotCluster cluster) {
ClusterManager.removeCluster(cluster);
TaskManager.runTaskAsync(new Runnable() {
2015-01-26 05:16:10 +01:00
@Override
public void run() {
PreparedStatement stmt = null;
final int id = getClusterId(cluster.world, ClusterManager.getClusterId(cluster));
try {
stmt = SQLManager.this.connection.prepareStatement("DELETE FROM `" + SQLManager.this.prefix + "cluster_settings` WHERE `cluster_id` = ?");
stmt.setInt(1, id);
stmt.executeUpdate();
stmt.close();
stmt = SQLManager.this.connection.prepareStatement("DELETE FROM `" + SQLManager.this.prefix + "cluster_helpers` WHERE `cluster_id` = ?");
stmt.setInt(1, id);
stmt.executeUpdate();
2015-01-29 04:20:29 +01:00
stmt = SQLManager.this.connection.prepareStatement("DELETE FROM `" + SQLManager.this.prefix + "cluster_invited` WHERE `cluster_id` = ?");
stmt.setInt(1, id);
stmt.executeUpdate();
2015-01-26 05:16:10 +01:00
stmt = SQLManager.this.connection.prepareStatement("DELETE FROM `" + SQLManager.this.prefix + "cluster` WHERE `id` = ?");
stmt.setInt(1, id);
stmt.executeUpdate();
stmt.close();
} catch (final SQLException e) {
e.printStackTrace();
2015-02-20 07:34:19 +01:00
PlotSquared.log("&c[ERROR] " + "Failed to delete plot cluster: " + cluster.getP1() + ":" + cluster.getP2());
2015-01-26 05:16:10 +01:00
}
}
});
2015-02-20 07:34:19 +01:00
}
2015-02-23 02:32:27 +01:00
2015-02-20 07:34:19 +01:00
@Override
public int getClusterId(final String world, final PlotClusterId id) {
PreparedStatement stmt = null;
2015-01-26 05:16:10 +01:00
try {
2015-01-29 08:45:14 +01:00
stmt = this.connection.prepareStatement("SELECT `id` FROM `" + this.prefix + "cluster` WHERE `pos1_x` = ? AND `pos1_z` = ? AND `pos2_x` = ? AND `pos2_z` = ? AND `world` = ? ORDER BY `timestamp` ASC");
2015-01-26 05:16:10 +01:00
stmt.setInt(1, id.pos1.x);
stmt.setInt(2, id.pos1.y);
2015-01-29 08:45:14 +01:00
stmt.setInt(3, id.pos2.x);
stmt.setInt(4, id.pos2.y);
2015-01-26 05:16:10 +01:00
stmt.setString(5, world);
final ResultSet r = stmt.executeQuery();
int c_id = Integer.MAX_VALUE;
while (r.next()) {
2015-02-20 07:34:19 +01:00
c_id = r.getInt("id");
2015-01-26 05:16:10 +01:00
}
stmt.close();
2015-02-19 04:24:05 +01:00
r.close();
2015-01-26 05:16:10 +01:00
return c_id;
} catch (final SQLException e) {
e.printStackTrace();
}
return Integer.MAX_VALUE;
2015-02-20 07:34:19 +01:00
}
2015-02-23 02:32:27 +01:00
2015-02-20 07:34:19 +01:00
@Override
public HashMap<String, HashSet<PlotCluster>> getClusters() {
final LinkedHashMap<String, HashSet<PlotCluster>> newClusters = new LinkedHashMap<>();
2015-01-26 06:05:56 +01:00
final HashMap<Integer, PlotCluster> clusters = new HashMap<>();
Statement stmt = null;
try {
Set<String> worlds = new HashSet<>();
2015-02-19 09:51:10 +01:00
if (PlotSquared.config.contains("worlds")) {
worlds = PlotSquared.config.getConfigurationSection("worlds").getKeys(false);
2015-01-26 06:05:56 +01:00
}
final HashMap<String, UUID> uuids = new HashMap<String, UUID>();
final HashMap<String, Integer> noExist = new HashMap<String, Integer>();
/*
* Getting clusters
*/
stmt = this.connection.createStatement();
ResultSet r = stmt.executeQuery("SELECT * FROM `" + this.prefix + "cluster`");
PlotId pos1;
PlotId pos2;
2015-02-20 07:34:19 +01:00
PlotCluster cluster;
2015-01-26 06:05:56 +01:00
String owner;
String worldname;
UUID user;
int id;
while (r.next()) {
2015-02-20 07:34:19 +01:00
pos1 = new PlotId(r.getInt("pos1_x"), r.getInt("pos1_z"));
pos2 = new PlotId(r.getInt("pos2_x"), r.getInt("pos2_z"));
2015-01-26 06:05:56 +01:00
id = r.getInt("id");
worldname = r.getString("world");
if (!worlds.contains(worldname)) {
if (noExist.containsKey(worldname)) {
noExist.put(worldname, noExist.get(worldname) + 1);
} else {
noExist.put(worldname, 1);
}
}
owner = r.getString("owner");
user = uuids.get(owner);
if (user == null) {
user = UUID.fromString(owner);
uuids.put(owner, user);
}
cluster = new PlotCluster(worldname, pos1, pos2, user);
clusters.put(id, cluster);
}
/*
* Getting helpers
*/
r = stmt.executeQuery("SELECT `user_uuid`, `cluster_id` FROM `" + this.prefix + "cluster_helpers`");
while (r.next()) {
2015-01-29 08:45:14 +01:00
id = r.getInt("cluster_id");
2015-01-26 06:05:56 +01:00
owner = r.getString("user_uuid");
user = uuids.get(owner);
if (user == null) {
user = UUID.fromString(owner);
uuids.put(owner, user);
}
cluster = clusters.get(id);
if (cluster != null) {
cluster.helpers.add(user);
} else {
2015-02-19 11:23:36 +01:00
PlotSquared.log("&cCluster " + id + " in cluster_helpers does not exist. Please create the cluster or remove this entry.");
2015-01-26 06:05:56 +01:00
}
}
2015-01-29 04:20:29 +01:00
/*
* Getting invited
*/
r = stmt.executeQuery("SELECT `user_uuid`, `cluster_id` FROM `" + this.prefix + "cluster_invited`");
while (r.next()) {
2015-01-29 08:45:14 +01:00
id = r.getInt("cluster_id");
2015-01-29 04:20:29 +01:00
owner = r.getString("user_uuid");
user = uuids.get(owner);
if (user == null) {
user = UUID.fromString(owner);
uuids.put(owner, user);
}
cluster = clusters.get(id);
if (cluster != null) {
cluster.invited.add(user);
} else {
2015-02-19 11:23:36 +01:00
PlotSquared.log("&cCluster " + id + " in cluster_invited does not exist. Please create the cluster or remove this entry.");
2015-01-29 04:20:29 +01:00
}
}
2015-01-26 06:05:56 +01:00
r = stmt.executeQuery("SELECT * FROM `" + this.prefix + "cluster_settings`");
while (r.next()) {
2015-01-29 08:45:14 +01:00
id = r.getInt("cluster_id");
2015-01-26 06:05:56 +01:00
cluster = clusters.get(id);
if (cluster != null) {
final String b = r.getString("biome");
if (b != null) {
for (final Biome mybiome : Biome.values()) {
if (mybiome.toString().equalsIgnoreCase(b)) {
break;
}
}
}
final String alias = r.getString("alias");
if (alias != null) {
cluster.settings.setAlias(alias);
}
final String pos = r.getString("position");
switch (pos.toLowerCase()) {
case "":
case "default":
case "0,0,0":
case "center":
break;
default:
try {
2015-02-20 07:34:19 +01:00
final String[] split = pos.split(",");
final BlockLoc loc = new BlockLoc(Integer.parseInt(split[0]), Integer.parseInt(split[1]), Integer.parseInt(split[2]));
2015-01-26 06:05:56 +01:00
cluster.settings.setPosition(loc);
2015-02-20 07:34:19 +01:00
} catch (final Exception e) {
2015-01-26 06:05:56 +01:00
}
}
final Integer m = r.getInt("merged");
if (m != null) {
final boolean[] merged = new boolean[4];
for (int i = 0; i < 4; i++) {
merged[3 - i] = ((m) & (1 << i)) != 0;
}
cluster.settings.setMerged(merged);
} else {
2015-02-20 07:34:19 +01:00
cluster.settings.setMerged(new boolean[] { false, false, false, false });
2015-01-26 06:05:56 +01:00
}
String[] flags_string;
final String myflags = r.getString("flags");
if (myflags == null) {
2015-02-20 07:34:19 +01:00
flags_string = new String[] {};
2015-01-26 06:05:56 +01:00
} else {
if (myflags.length() > 0) {
flags_string = myflags.split(",");
2015-02-20 07:34:19 +01:00
} else {
flags_string = new String[] {};
2015-01-26 06:05:56 +01:00
}
}
final Set<Flag> flags = new HashSet<Flag>();
boolean exception = false;
for (final String element : flags_string) {
if (element.contains(":")) {
final String[] split = element.split(":");
try {
2015-02-20 07:34:19 +01:00
final String flag_str = split[1].replaceAll("\u00AF", ":").replaceAll("<EFBFBD>", ",");
final Flag flag = new Flag(FlagManager.getFlag(split[0], true), flag_str);
2015-01-26 06:05:56 +01:00
flags.add(flag);
} catch (final Exception e) {
e.printStackTrace();
exception = true;
}
} else {
flags.add(new Flag(FlagManager.getFlag(element, true), ""));
}
}
if (exception) {
2015-02-19 11:23:36 +01:00
PlotSquared.log("&cPlot " + id + " had an invalid flag. A fix has been attempted.");
2015-01-26 06:05:56 +01:00
setFlags(id, flags.toArray(new Flag[0]));
}
cluster.settings.flags = flags;
} else {
2015-02-19 11:23:36 +01:00
PlotSquared.log("&cCluster " + id + " in cluster_settings does not exist. Please create the cluster or remove this entry.");
2015-01-26 06:05:56 +01:00
}
}
stmt.close();
2015-02-19 04:24:05 +01:00
r.close();
2015-01-26 06:05:56 +01:00
for (final PlotCluster c : clusters.values()) {
final String world = c.world;
if (!newClusters.containsKey(world)) {
2015-02-20 07:34:19 +01:00
newClusters.put(world, new HashSet<PlotCluster>());
2015-01-26 06:05:56 +01:00
}
newClusters.get(world).add(c);
}
boolean invalidPlot = false;
for (final String w : noExist.keySet()) {
invalidPlot = true;
2015-02-19 11:23:36 +01:00
PlotSquared.log("&c[WARNING] Found " + noExist.get(w) + " clusters in DB for non existant world; '" + w + "'.");
2015-01-26 06:05:56 +01:00
}
if (invalidPlot) {
2015-02-19 11:23:36 +01:00
PlotSquared.log("&c[WARNING] - Please create the world/s or remove the clusters using the purge command");
2015-01-26 06:05:56 +01:00
}
} catch (final SQLException e) {
2015-02-20 07:34:19 +01:00
PlotSquared.log("&7[WARN] " + "Failed to load clusters.");
2015-01-26 06:05:56 +01:00
e.printStackTrace();
}
return newClusters;
2015-02-20 07:34:19 +01:00
}
2015-02-23 02:32:27 +01:00
2015-02-20 07:34:19 +01:00
@Override
public void setFlags(final PlotCluster cluster, final Set<Flag> flags) {
final StringBuilder flag_string = new StringBuilder();
2015-01-26 05:16:10 +01:00
int i = 0;
for (final Flag flag : flags) {
if (i != 0) {
flag_string.append(",");
}
flag_string.append(flag.getKey() + ":" + flag.getValueString().replaceAll(":", "\u00AF").replaceAll(",", "\u00B4"));
i++;
}
2015-02-20 07:34:19 +01:00
TaskManager.runTaskAsync(new Runnable() {
2015-01-26 05:16:10 +01:00
@Override
public void run() {
try {
final PreparedStatement stmt = SQLManager.this.connection.prepareStatement("UPDATE `" + SQLManager.this.prefix + "cluster_settings` SET `flags` = ? WHERE `cluster_id` = ?");
stmt.setString(1, flag_string.toString());
stmt.setInt(2, getClusterId(cluster.world, ClusterManager.getClusterId(cluster)));
stmt.execute();
stmt.close();
} catch (final SQLException e) {
e.printStackTrace();
2015-02-20 07:34:19 +01:00
PlotSquared.log("&7[WARN] " + "Could not set flag for plot " + cluster);
2015-01-26 05:16:10 +01:00
}
}
});
2015-02-20 07:34:19 +01:00
}
2015-02-23 02:32:27 +01:00
2015-02-20 07:34:19 +01:00
@Override
public void setClusterName(final PlotCluster cluster, final String name) {
cluster.settings.setAlias(name);
TaskManager.runTaskAsync(new Runnable() {
2015-01-26 05:16:10 +01:00
@Override
public void run() {
PreparedStatement stmt = null;
try {
stmt = SQLManager.this.connection.prepareStatement("UPDATE `" + SQLManager.this.prefix + "cluster_settings` SET `alias` = ? WHERE `cluster_id` = ?");
stmt.setString(1, name);
stmt.setInt(2, getClusterId(cluster.world, ClusterManager.getClusterId(cluster)));
stmt.executeUpdate();
stmt.close();
} catch (final SQLException e) {
2015-02-20 07:34:19 +01:00
PlotSquared.log("&7[WARN] " + "Failed to set alias for cluster " + cluster);
2015-01-26 05:16:10 +01:00
e.printStackTrace();
}
}
});
2015-02-20 07:34:19 +01:00
}
2015-02-23 02:32:27 +01:00
2015-02-20 07:34:19 +01:00
@Override
public void removeHelper(final PlotCluster cluster, final UUID uuid) {
TaskManager.runTaskAsync(new Runnable() {
2015-01-26 05:16:10 +01:00
@Override
public void run() {
try {
final PreparedStatement statement = SQLManager.this.connection.prepareStatement("DELETE FROM `" + SQLManager.this.prefix + "cluster_helpers` WHERE `cluster_id` = ? AND `user_uuid` = ?");
statement.setInt(1, getClusterId(cluster.world, ClusterManager.getClusterId(cluster)));
statement.setString(2, uuid.toString());
statement.executeUpdate();
statement.close();
} catch (final SQLException e) {
e.printStackTrace();
2015-02-20 07:34:19 +01:00
PlotSquared.log("&7[WARN] " + "Failed to remove helper for cluster " + cluster);
2015-01-26 05:16:10 +01:00
}
}
});
2015-02-20 07:34:19 +01:00
}
2015-02-23 02:32:27 +01:00
2015-02-20 07:34:19 +01:00
@Override
public void setHelper(final PlotCluster cluster, final UUID uuid) {
TaskManager.runTaskAsync(new Runnable() {
2015-01-26 05:16:10 +01:00
@Override
public void run() {
try {
final PreparedStatement statement = SQLManager.this.connection.prepareStatement("INSERT INTO `" + SQLManager.this.prefix + "cluster_helpers` (`cluster_id`, `user_uuid`) VALUES(?,?)");
statement.setInt(1, getClusterId(cluster.world, ClusterManager.getClusterId(cluster)));
statement.setString(2, uuid.toString());
statement.executeUpdate();
statement.close();
} catch (final SQLException e) {
2015-02-20 07:34:19 +01:00
PlotSquared.log("&7[WARN] " + "Failed to set helper for cluster " + cluster);
2015-01-26 05:16:10 +01:00
e.printStackTrace();
}
}
});
2015-02-20 07:34:19 +01:00
}
2015-02-23 02:32:27 +01:00
2015-02-20 07:34:19 +01:00
@Override
public void createCluster(final PlotCluster cluster) {
TaskManager.runTaskAsync(new Runnable() {
2015-01-26 05:16:10 +01:00
@Override
public void run() {
PreparedStatement stmt = null;
try {
stmt = SQLManager.this.connection.prepareStatement(SQLManager.this.CREATE_CLUSTER);
2015-01-26 06:05:56 +01:00
stmt.setInt(1, cluster.getP1().x);
stmt.setInt(2, cluster.getP1().y);
stmt.setInt(3, cluster.getP2().x);
stmt.setInt(4, cluster.getP2().y);
2015-01-26 05:16:10 +01:00
stmt.setString(5, cluster.owner.toString());
stmt.setString(6, cluster.world);
stmt.executeUpdate();
stmt.close();
2015-02-20 07:34:19 +01:00
final int id = getClusterId(cluster.world, ClusterManager.getClusterId(cluster));
2015-01-29 04:20:29 +01:00
stmt = SQLManager.this.connection.prepareStatement("INSERT INTO `" + SQLManager.this.prefix + "cluster_settings`(`cluster_id`, `alias`) VALUES(?, ?" + ")");
2015-01-26 05:16:10 +01:00
stmt.setInt(1, id);
2015-01-29 04:20:29 +01:00
stmt.setString(2, cluster.settings.getAlias());
2015-01-26 05:16:10 +01:00
stmt.executeUpdate();
stmt.close();
} catch (final Exception e) {
e.printStackTrace();
2015-02-20 07:34:19 +01:00
PlotSquared.log("&c[ERROR] " + "Failed to save cluster " + cluster);
2015-01-26 05:16:10 +01:00
}
}
});
2015-02-20 07:34:19 +01:00
}
2015-02-23 02:32:27 +01:00
2015-02-20 07:34:19 +01:00
@Override
public void resizeCluster(final PlotCluster current, final PlotClusterId resize) {
final PlotId pos1 = new PlotId(current.getP1().x, current.getP1().y);
final PlotId pos2 = new PlotId(current.getP2().x, current.getP2().y);
current.setP1(resize.pos1);
current.setP2(resize.pos2);
TaskManager.runTaskAsync(new Runnable() {
2015-01-26 06:05:56 +01:00
@Override
public void run() {
PreparedStatement stmt = null;
try {
2015-01-31 08:09:48 +01:00
stmt = SQLManager.this.connection.prepareStatement("UPDATE `" + SQLManager.this.prefix + "cluster` SET `pos1_x` = ?, `pos1_z` = ?, `pos2_x` = ?, `pos2_z` = ? WHERE `id` = ?");
2015-01-26 06:05:56 +01:00
stmt.setInt(1, pos1.x);
stmt.setInt(2, pos1.y);
stmt.setInt(3, pos2.x);
stmt.setInt(4, pos2.y);
stmt.setInt(5, getClusterId(current.world, ClusterManager.getClusterId(current)));
stmt.executeUpdate();
stmt.close();
} catch (final SQLException e) {
2015-02-20 07:34:19 +01:00
PlotSquared.log("&7[WARN] " + "Failed to rezize cluster " + current);
2015-01-26 06:05:56 +01:00
e.printStackTrace();
}
}
2015-02-20 07:34:19 +01:00
});
}
2015-02-23 02:32:27 +01:00
2015-02-20 07:34:19 +01:00
@Override
public void setPosition(final PlotCluster cluster, final String position) {
TaskManager.runTaskAsync(new Runnable() {
2015-01-26 05:16:10 +01:00
@Override
public void run() {
PreparedStatement stmt = null;
try {
stmt = SQLManager.this.connection.prepareStatement("UPDATE `" + SQLManager.this.prefix + "cluster_settings` SET `position` = ? WHERE `cluster_id` = ?");
stmt.setString(1, position);
stmt.setInt(2, getClusterId(cluster.world, ClusterManager.getClusterId(cluster)));
stmt.executeUpdate();
stmt.close();
} catch (final SQLException e) {
2015-02-20 07:34:19 +01:00
PlotSquared.log("&7[WARN] " + "Failed to set position for cluster " + cluster);
2015-01-26 05:16:10 +01:00
e.printStackTrace();
}
}
});
2015-02-20 07:34:19 +01:00
}
2015-02-23 02:32:27 +01:00
2015-02-20 07:34:19 +01:00
@Override
public HashMap<String, Object> getClusterSettings(final int id) {
final HashMap<String, Object> h = new HashMap<String, Object>();
2015-01-26 05:16:10 +01:00
PreparedStatement stmt = null;
try {
stmt = this.connection.prepareStatement("SELECT * FROM `" + this.prefix + "cluster_settings` WHERE `cluster_id` = ?");
stmt.setInt(1, id);
final ResultSet r = stmt.executeQuery();
String var;
Object val;
while (r.next()) {
var = "biome";
val = r.getObject(var);
h.put(var, val);
var = "rain";
val = r.getObject(var);
h.put(var, val);
var = "custom_time";
val = r.getObject(var);
h.put(var, val);
var = "time";
val = r.getObject(var);
h.put(var, val);
var = "deny_entry";
val = r.getObject(var);
h.put(var, (short) 0);
var = "alias";
val = r.getObject(var);
h.put(var, val);
var = "position";
val = r.getObject(var);
h.put(var, val);
var = "flags";
val = r.getObject(var);
h.put(var, val);
var = "merged";
val = r.getObject(var);
h.put(var, val);
}
stmt.close();
2015-02-19 04:24:05 +01:00
r.close();
2015-01-26 05:16:10 +01:00
} catch (final SQLException e) {
2015-02-20 07:34:19 +01:00
PlotSquared.log("&7[WARN] " + "Failed to load settings for cluster: " + id);
2015-01-26 05:16:10 +01:00
e.printStackTrace();
}
return h;
2015-02-20 07:34:19 +01:00
}
2015-02-23 02:32:27 +01:00
2015-01-29 04:20:29 +01:00
@Override
public void removeInvited(final PlotCluster cluster, final UUID uuid) {
2015-02-20 07:34:19 +01:00
TaskManager.runTaskAsync(new Runnable() {
2015-01-29 04:20:29 +01:00
@Override
public void run() {
try {
final PreparedStatement statement = SQLManager.this.connection.prepareStatement("DELETE FROM `" + SQLManager.this.prefix + "cluster_invited` WHERE `cluster_id` = ? AND `user_uuid` = ?");
statement.setInt(1, getClusterId(cluster.world, ClusterManager.getClusterId(cluster)));
statement.setString(2, uuid.toString());
statement.executeUpdate();
statement.close();
} catch (final SQLException e) {
e.printStackTrace();
2015-02-20 07:34:19 +01:00
PlotSquared.log("&7[WARN] " + "Failed to remove invited for cluster " + cluster);
2015-01-29 04:20:29 +01:00
}
}
});
}
2015-02-23 02:32:27 +01:00
2015-01-29 04:20:29 +01:00
@Override
2015-02-20 07:34:19 +01:00
public void setInvited(final String world, final PlotCluster cluster, final UUID uuid) {
TaskManager.runTaskAsync(new Runnable() {
2015-01-29 04:20:29 +01:00
@Override
public void run() {
try {
final PreparedStatement statement = SQLManager.this.connection.prepareStatement("INSERT INTO `" + SQLManager.this.prefix + "cluster_invited` (`cluster_id`, `user_uuid`) VALUES(?,?)");
statement.setInt(1, getClusterId(cluster.world, ClusterManager.getClusterId(cluster)));
statement.setString(2, uuid.toString());
statement.executeUpdate();
statement.close();
} catch (final SQLException e) {
2015-02-20 07:34:19 +01:00
PlotSquared.log("&7[WARN] " + "Failed to set helper for cluster " + cluster);
2015-01-29 04:20:29 +01:00
e.printStackTrace();
}
}
});
}
}