mirror of
				https://github.com/IntellectualSites/PlotSquared.git
				synced 2025-11-02 18:33:42 +01:00 
			
		
		
		
	Compare commits
	
		
			1 Commits
		
	
	
		
			7.2.1
			...
			feature/co
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					a5c1f1a74b | 
@@ -89,6 +89,8 @@ tasks.named<ShadowJar>("shadowJar") {
 | 
			
		||||
    relocate("net.jcip", "com.plotsquared.core.annotations.jcip")
 | 
			
		||||
    relocate("edu.umd.cs.findbugs", "com.plotsquared.core.annotations.findbugs")
 | 
			
		||||
    relocate("com.intellectualsites.annotations", "com.plotsquared.core.annotations.informative")
 | 
			
		||||
    relocate("org.jdbi.v3", "com.plotsquared.core.jdbi")
 | 
			
		||||
    relocate("com.zaxxer.hikari", "com.plotsquared.core.hikari")
 | 
			
		||||
 | 
			
		||||
    // Get rid of all the libs which are 100% unused.
 | 
			
		||||
    minimize()
 | 
			
		||||
 
 | 
			
		||||
@@ -82,6 +82,8 @@ import com.plotsquared.core.inject.annotations.DefaultGenerator;
 | 
			
		||||
import com.plotsquared.core.inject.annotations.ImpromptuPipeline;
 | 
			
		||||
import com.plotsquared.core.inject.annotations.WorldConfig;
 | 
			
		||||
import com.plotsquared.core.inject.annotations.WorldFile;
 | 
			
		||||
import com.plotsquared.core.inject.modules.DatabaseModule;
 | 
			
		||||
import com.plotsquared.core.inject.modules.JdbiModule;
 | 
			
		||||
import com.plotsquared.core.inject.modules.PlotSquaredModule;
 | 
			
		||||
import com.plotsquared.core.listener.PlotListener;
 | 
			
		||||
import com.plotsquared.core.listener.WESubscriber;
 | 
			
		||||
@@ -140,6 +142,7 @@ import org.checkerframework.checker.nullness.qual.NonNull;
 | 
			
		||||
import org.checkerframework.checker.nullness.qual.Nullable;
 | 
			
		||||
import org.incendo.serverlib.ServerLib;
 | 
			
		||||
 | 
			
		||||
import javax.xml.crypto.Data;
 | 
			
		||||
import java.io.File;
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.lang.reflect.Method;
 | 
			
		||||
@@ -292,7 +295,9 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
 | 
			
		||||
                        new WorldManagerModule(),
 | 
			
		||||
                        new PlotSquaredModule(),
 | 
			
		||||
                        new BukkitModule(this),
 | 
			
		||||
                        new BackupModule()
 | 
			
		||||
                        new BackupModule(),
 | 
			
		||||
                        new JdbiModule(),
 | 
			
		||||
                        new DatabaseModule()
 | 
			
		||||
                );
 | 
			
		||||
        this.injector.injectMembers(this);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -37,6 +37,11 @@ dependencies {
 | 
			
		||||
    // Logging
 | 
			
		||||
    compileOnlyApi(libs.log4j)
 | 
			
		||||
 | 
			
		||||
    // Database
 | 
			
		||||
    api(libs.hikaricp)
 | 
			
		||||
    api(libs.jdbiCore)
 | 
			
		||||
    api(libs.jdbiGuice)
 | 
			
		||||
 | 
			
		||||
    // Other libraries
 | 
			
		||||
    api(libs.prtree)
 | 
			
		||||
    api(libs.aopalliance)
 | 
			
		||||
 
 | 
			
		||||
@@ -18,6 +18,7 @@
 | 
			
		||||
 */
 | 
			
		||||
package com.plotsquared.core;
 | 
			
		||||
 | 
			
		||||
import com.google.inject.Key;
 | 
			
		||||
import com.plotsquared.core.configuration.ConfigurationSection;
 | 
			
		||||
import com.plotsquared.core.configuration.ConfigurationUtil;
 | 
			
		||||
import com.plotsquared.core.configuration.MemorySection;
 | 
			
		||||
@@ -31,14 +32,12 @@ import com.plotsquared.core.configuration.caption.load.DefaultCaptionProvider;
 | 
			
		||||
import com.plotsquared.core.configuration.file.YamlConfiguration;
 | 
			
		||||
import com.plotsquared.core.configuration.serialization.ConfigurationSerialization;
 | 
			
		||||
import com.plotsquared.core.database.DBFunc;
 | 
			
		||||
import com.plotsquared.core.database.Database;
 | 
			
		||||
import com.plotsquared.core.database.MySQL;
 | 
			
		||||
import com.plotsquared.core.database.SQLManager;
 | 
			
		||||
import com.plotsquared.core.database.SQLite;
 | 
			
		||||
import com.plotsquared.core.generator.GeneratorWrapper;
 | 
			
		||||
import com.plotsquared.core.generator.HybridPlotWorld;
 | 
			
		||||
import com.plotsquared.core.generator.HybridUtils;
 | 
			
		||||
import com.plotsquared.core.generator.IndependentPlotGenerator;
 | 
			
		||||
import com.plotsquared.core.inject.annotations.PlotDatabase;
 | 
			
		||||
import com.plotsquared.core.inject.factory.HybridPlotWorldFactory;
 | 
			
		||||
import com.plotsquared.core.listener.PlotListener;
 | 
			
		||||
import com.plotsquared.core.location.Location;
 | 
			
		||||
@@ -75,7 +74,9 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
 | 
			
		||||
import org.checkerframework.checker.nullness.qual.NonNull;
 | 
			
		||||
import org.checkerframework.checker.nullness.qual.Nullable;
 | 
			
		||||
 | 
			
		||||
import javax.sql.DataSource;
 | 
			
		||||
import java.io.BufferedReader;
 | 
			
		||||
import java.io.Closeable;
 | 
			
		||||
import java.io.File;
 | 
			
		||||
import java.io.FileInputStream;
 | 
			
		||||
import java.io.FileOutputStream;
 | 
			
		||||
@@ -1236,8 +1237,11 @@ public class PlotSquared {
 | 
			
		||||
            DBFunc.validatePlots(plots);
 | 
			
		||||
 | 
			
		||||
            // Close the connection
 | 
			
		||||
            DBFunc.close();
 | 
			
		||||
        } catch (NullPointerException throwable) {
 | 
			
		||||
            final DataSource dataSource = platform().injector().getInstance(Key.get(DataSource.class, PlotDatabase.class));
 | 
			
		||||
            if (dataSource instanceof Closeable closeable) {
 | 
			
		||||
                closeable.close();
 | 
			
		||||
            }
 | 
			
		||||
        } catch (IOException | NullPointerException throwable) {
 | 
			
		||||
            LOGGER.error("Could not close database connection", throwable);
 | 
			
		||||
            throwable.printStackTrace();
 | 
			
		||||
        }
 | 
			
		||||
@@ -1289,26 +1293,7 @@ public class PlotSquared {
 | 
			
		||||
            if (DBFunc.dbManager != null) {
 | 
			
		||||
                DBFunc.dbManager.close();
 | 
			
		||||
            }
 | 
			
		||||
            Database database;
 | 
			
		||||
            if (Storage.MySQL.USE) {
 | 
			
		||||
                database = new MySQL(Storage.MySQL.HOST, Storage.MySQL.PORT, Storage.MySQL.DATABASE,
 | 
			
		||||
                        Storage.MySQL.USER, Storage.MySQL.PASSWORD
 | 
			
		||||
                );
 | 
			
		||||
            } else if (Storage.SQLite.USE) {
 | 
			
		||||
                File file = FileUtils.getFile(platform.getDirectory(), Storage.SQLite.DB + ".db");
 | 
			
		||||
                database = new SQLite(file);
 | 
			
		||||
            } else {
 | 
			
		||||
                LOGGER.error("No storage type is set. Disabling PlotSquared");
 | 
			
		||||
                this.platform.shutdown(); //shutdown used instead of disable because no database is set
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
            DBFunc.dbManager = new SQLManager(
 | 
			
		||||
                    database,
 | 
			
		||||
                    Storage.PREFIX,
 | 
			
		||||
                    this.eventDispatcher,
 | 
			
		||||
                    this.plotListener,
 | 
			
		||||
                    this.worldConfiguration
 | 
			
		||||
            );
 | 
			
		||||
            DBFunc.dbManager = platform().injector().getInstance(SQLManager.class);
 | 
			
		||||
            this.plots_tmp = DBFunc.getPlots();
 | 
			
		||||
            if (getPlotAreaManager() instanceof SinglePlotAreaManager) {
 | 
			
		||||
                SinglePlotArea area = ((SinglePlotAreaManager) getPlotAreaManager()).getArea();
 | 
			
		||||
@@ -1322,13 +1307,13 @@ public class PlotSquared {
 | 
			
		||||
            }
 | 
			
		||||
            this.clustersTmp = DBFunc.getClusters();
 | 
			
		||||
            LOGGER.info("Connection to database established. Type: {}", Storage.MySQL.USE ? "MySQL" : "SQLite");
 | 
			
		||||
        } catch (ClassNotFoundException | SQLException e) {
 | 
			
		||||
        } catch (Exception e) {
 | 
			
		||||
            LOGGER.error(
 | 
			
		||||
                    "Failed to open database connection ({}). Disabling PlotSquared",
 | 
			
		||||
                    Storage.MySQL.USE ? "MySQL" : "SQLite"
 | 
			
		||||
            );
 | 
			
		||||
            LOGGER.error("==== Here is an ugly stacktrace, if you are interested in those things ===");
 | 
			
		||||
            e.printStackTrace();
 | 
			
		||||
            LOGGER.error("", e);
 | 
			
		||||
            LOGGER.error("==== End of stacktrace ====");
 | 
			
		||||
            LOGGER.error(
 | 
			
		||||
                    "Please go to the {} 'storage.yml' and configure the database correctly",
 | 
			
		||||
 
 | 
			
		||||
@@ -29,6 +29,7 @@ import java.sql.Statement;
 | 
			
		||||
 * @author -_Husky_-
 | 
			
		||||
 * @author tips48
 | 
			
		||||
 */
 | 
			
		||||
@Deprecated(forRemoval = true)
 | 
			
		||||
public abstract class Database {
 | 
			
		||||
 | 
			
		||||
    public abstract Connection forceConnection() throws SQLException, ClassNotFoundException;
 | 
			
		||||
 
 | 
			
		||||
@@ -33,6 +33,7 @@ import java.sql.Statement;
 | 
			
		||||
 * @author -_Husky_-
 | 
			
		||||
 * @author tips48
 | 
			
		||||
 */
 | 
			
		||||
@Deprecated(forRemoval = true)
 | 
			
		||||
public class MySQL extends Database {
 | 
			
		||||
 | 
			
		||||
    private final String user;
 | 
			
		||||
 
 | 
			
		||||
@@ -25,6 +25,7 @@ import com.plotsquared.core.configuration.Settings;
 | 
			
		||||
import com.plotsquared.core.configuration.Storage;
 | 
			
		||||
import com.plotsquared.core.configuration.caption.CaptionUtility;
 | 
			
		||||
import com.plotsquared.core.configuration.file.YamlConfiguration;
 | 
			
		||||
import com.plotsquared.core.inject.annotations.PlotDatabase;
 | 
			
		||||
import com.plotsquared.core.inject.annotations.WorldConfig;
 | 
			
		||||
import com.plotsquared.core.listener.PlotListener;
 | 
			
		||||
import com.plotsquared.core.location.BlockLoc;
 | 
			
		||||
@@ -44,10 +45,14 @@ import com.plotsquared.core.util.HashUtil;
 | 
			
		||||
import com.plotsquared.core.util.StringMan;
 | 
			
		||||
import com.plotsquared.core.util.task.RunnableVal;
 | 
			
		||||
import com.plotsquared.core.util.task.TaskManager;
 | 
			
		||||
import jakarta.inject.Inject;
 | 
			
		||||
import org.apache.logging.log4j.LogManager;
 | 
			
		||||
import org.apache.logging.log4j.Logger;
 | 
			
		||||
import org.checkerframework.checker.nullness.qual.NonNull;
 | 
			
		||||
import org.checkerframework.checker.nullness.qual.Nullable;
 | 
			
		||||
 | 
			
		||||
import javax.sql.DataSource;
 | 
			
		||||
import java.io.Closeable;
 | 
			
		||||
import java.sql.Connection;
 | 
			
		||||
import java.sql.DatabaseMetaData;
 | 
			
		||||
import java.sql.PreparedStatement;
 | 
			
		||||
@@ -92,12 +97,12 @@ public class SQLManager implements AbstractDB {
 | 
			
		||||
 | 
			
		||||
    // Private Final
 | 
			
		||||
    private final String prefix;
 | 
			
		||||
    private final Database database;
 | 
			
		||||
    private final boolean mySQL;
 | 
			
		||||
    @SuppressWarnings({"unused", "FieldCanBeLocal"})
 | 
			
		||||
    private final EventDispatcher eventDispatcher;
 | 
			
		||||
    @SuppressWarnings({"unused", "FieldCanBeLocal"})
 | 
			
		||||
    private final PlotListener plotListener;
 | 
			
		||||
    private final DataSource dataSource;
 | 
			
		||||
    private final YamlConfiguration worldConfiguration;
 | 
			
		||||
    /**
 | 
			
		||||
     * important tasks
 | 
			
		||||
@@ -129,21 +134,12 @@ public class SQLManager implements AbstractDB {
 | 
			
		||||
     */
 | 
			
		||||
    public volatile ConcurrentHashMap<PlotCluster, Queue<UniqueStatement>> clusterTasks;
 | 
			
		||||
    // Private
 | 
			
		||||
    private Connection connection;
 | 
			
		||||
    private boolean supportsGetGeneratedKeys;
 | 
			
		||||
    private boolean closed = false;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Constructor
 | 
			
		||||
     *
 | 
			
		||||
     * @param database
 | 
			
		||||
     * @param prefix   prefix
 | 
			
		||||
     * @throws SQLException
 | 
			
		||||
     * @throws ClassNotFoundException
 | 
			
		||||
     */
 | 
			
		||||
    @Inject
 | 
			
		||||
    public SQLManager(
 | 
			
		||||
            final @NonNull Database database,
 | 
			
		||||
            final @NonNull String prefix,
 | 
			
		||||
            final @NonNull @PlotDatabase DataSource dataSource,
 | 
			
		||||
            final @NonNull EventDispatcher eventDispatcher,
 | 
			
		||||
            final @NonNull PlotListener plotListener,
 | 
			
		||||
            @WorldConfig final @NonNull YamlConfiguration worldConfiguration
 | 
			
		||||
@@ -153,24 +149,26 @@ public class SQLManager implements AbstractDB {
 | 
			
		||||
        this.eventDispatcher = eventDispatcher;
 | 
			
		||||
        this.plotListener = plotListener;
 | 
			
		||||
        this.worldConfiguration = worldConfiguration;
 | 
			
		||||
        this.database = database;
 | 
			
		||||
        this.connection = database.openConnection();
 | 
			
		||||
        final DatabaseMetaData databaseMetaData = this.connection.getMetaData();
 | 
			
		||||
        this.supportsGetGeneratedKeys = databaseMetaData.supportsGetGeneratedKeys();
 | 
			
		||||
        this.mySQL = database instanceof MySQL;
 | 
			
		||||
        this.dataSource = dataSource;
 | 
			
		||||
        this.mySQL = Storage.MySQL.USE;
 | 
			
		||||
        this.globalTasks = new ConcurrentLinkedQueue<>();
 | 
			
		||||
        this.notifyTasks = new ConcurrentLinkedQueue<>();
 | 
			
		||||
        this.plotTasks = new ConcurrentHashMap<>();
 | 
			
		||||
        this.playerTasks = new ConcurrentHashMap<>();
 | 
			
		||||
        this.clusterTasks = new ConcurrentHashMap<>();
 | 
			
		||||
        this.prefix = prefix;
 | 
			
		||||
        this.prefix = Storage.PREFIX;
 | 
			
		||||
 | 
			
		||||
        if (mySQL && !supportsGetGeneratedKeys) {
 | 
			
		||||
            String driver = databaseMetaData.getDriverName();
 | 
			
		||||
            String driverVersion = databaseMetaData.getDriverVersion();
 | 
			
		||||
        try (final Connection connection = dataSource.getConnection()) {
 | 
			
		||||
            final DatabaseMetaData metaData = connection.getMetaData();
 | 
			
		||||
            this.supportsGetGeneratedKeys = metaData.supportsGetGeneratedKeys();
 | 
			
		||||
 | 
			
		||||
            if (this.mySQL && !this.supportsGetGeneratedKeys) {
 | 
			
		||||
                final String driver = metaData.getDriverName();
 | 
			
		||||
                final String driverVersion = metaData.getDriverVersion();
 | 
			
		||||
                throw new SQLException("Database Driver for MySQL does not support Statement#getGeneratedKeys - which breaks " +
 | 
			
		||||
                        "PlotSquared functionality (Using " + driver + ":" + driverVersion + ")");
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this.SET_OWNER = "UPDATE `" + this.prefix
 | 
			
		||||
                + "plot` SET `owner` = ? WHERE `plot_id_x` = ? AND `plot_id_z` = ? AND `world` = ?";
 | 
			
		||||
@@ -220,11 +218,6 @@ public class SQLManager implements AbstractDB {
 | 
			
		||||
                        !globalTasks.isEmpty() || !playerTasks.isEmpty() || !plotTasks.isEmpty()
 | 
			
		||||
                                || !clusterTasks.isEmpty();
 | 
			
		||||
                if (hasTask) {
 | 
			
		||||
                    if (SQLManager.this.mySQL && System.currentTimeMillis() - last > 550000
 | 
			
		||||
                            || !isValid()) {
 | 
			
		||||
                        last = System.currentTimeMillis();
 | 
			
		||||
                        reconnect();
 | 
			
		||||
                    }
 | 
			
		||||
                    if (!sendBatch()) {
 | 
			
		||||
                        try {
 | 
			
		||||
                            if (!getNotifyTasks().isEmpty()) {
 | 
			
		||||
@@ -249,32 +242,6 @@ public class SQLManager implements AbstractDB {
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public boolean isValid() {
 | 
			
		||||
        try {
 | 
			
		||||
            if (connection.isClosed()) {
 | 
			
		||||
                return false;
 | 
			
		||||
            }
 | 
			
		||||
        } catch (SQLException e) {
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
        try (PreparedStatement stmt = this.connection.prepareStatement("SELECT 1")) {
 | 
			
		||||
            stmt.execute();
 | 
			
		||||
            return true;
 | 
			
		||||
        } catch (Throwable e) {
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void reconnect() {
 | 
			
		||||
        try {
 | 
			
		||||
            close();
 | 
			
		||||
            SQLManager.this.closed = false;
 | 
			
		||||
            SQLManager.this.connection = database.forceConnection();
 | 
			
		||||
        } catch (SQLException | ClassNotFoundException e) {
 | 
			
		||||
            e.printStackTrace();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public synchronized Queue<Runnable> getGlobalTasks() {
 | 
			
		||||
        return this.globalTasks;
 | 
			
		||||
    }
 | 
			
		||||
@@ -293,7 +260,7 @@ public class SQLManager implements AbstractDB {
 | 
			
		||||
            task = new UniqueStatement(String.valueOf(plot.hashCode())) {
 | 
			
		||||
 | 
			
		||||
                @Override
 | 
			
		||||
                public PreparedStatement get() {
 | 
			
		||||
                public @Nullable PreparedStatement get(final @NonNull Connection connection) {
 | 
			
		||||
                    return null;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
@@ -327,7 +294,7 @@ public class SQLManager implements AbstractDB {
 | 
			
		||||
            task = new UniqueStatement(String.valueOf(uuid.hashCode())) {
 | 
			
		||||
 | 
			
		||||
                @Override
 | 
			
		||||
                public PreparedStatement get() {
 | 
			
		||||
                public PreparedStatement get(final @NonNull Connection connection) {
 | 
			
		||||
                    return null;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
@@ -358,7 +325,7 @@ public class SQLManager implements AbstractDB {
 | 
			
		||||
            task = new UniqueStatement(String.valueOf(cluster.hashCode())) {
 | 
			
		||||
 | 
			
		||||
                @Override
 | 
			
		||||
                public PreparedStatement get() {
 | 
			
		||||
                public @Nullable PreparedStatement get(final @NonNull Connection connection) {
 | 
			
		||||
                    return null;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
@@ -390,10 +357,10 @@ public class SQLManager implements AbstractDB {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public boolean sendBatch() {
 | 
			
		||||
        try {
 | 
			
		||||
        try (Connection connection = this.dataSource().getConnection()) {
 | 
			
		||||
            if (!getGlobalTasks().isEmpty()) {
 | 
			
		||||
                if (this.connection.getAutoCommit()) {
 | 
			
		||||
                    this.connection.setAutoCommit(false);
 | 
			
		||||
                if (connection.getAutoCommit()) {
 | 
			
		||||
                    connection.setAutoCommit(false);
 | 
			
		||||
                }
 | 
			
		||||
                Runnable task = getGlobalTasks().remove();
 | 
			
		||||
                if (task != null) {
 | 
			
		||||
@@ -404,18 +371,19 @@ public class SQLManager implements AbstractDB {
 | 
			
		||||
                        LOGGER.error("============ DATABASE ERROR ============");
 | 
			
		||||
                        LOGGER.error("There was an error updating the database.");
 | 
			
		||||
                        LOGGER.error(" - It will be corrected on shutdown");
 | 
			
		||||
                        e.printStackTrace();
 | 
			
		||||
                        LOGGER.error("", e);
 | 
			
		||||
                        LOGGER.error("========================================");
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                commit();
 | 
			
		||||
                commit(connection);
 | 
			
		||||
                return true;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            int count = -1;
 | 
			
		||||
            if (!this.plotTasks.isEmpty()) {
 | 
			
		||||
                count = Math.max(count, 0);
 | 
			
		||||
                if (this.connection.getAutoCommit()) {
 | 
			
		||||
                    this.connection.setAutoCommit(false);
 | 
			
		||||
                if (connection.getAutoCommit()) {
 | 
			
		||||
                    connection.setAutoCommit(false);
 | 
			
		||||
                }
 | 
			
		||||
                String method = null;
 | 
			
		||||
                PreparedStatement statement = null;
 | 
			
		||||
@@ -469,8 +437,8 @@ public class SQLManager implements AbstractDB {
 | 
			
		||||
            }
 | 
			
		||||
            if (!this.playerTasks.isEmpty()) {
 | 
			
		||||
                count = Math.max(count, 0);
 | 
			
		||||
                if (this.connection.getAutoCommit()) {
 | 
			
		||||
                    this.connection.setAutoCommit(false);
 | 
			
		||||
                if (connection.getAutoCommit()) {
 | 
			
		||||
                    connection.setAutoCommit(false);
 | 
			
		||||
                }
 | 
			
		||||
                String method = null;
 | 
			
		||||
                PreparedStatement statement = null;
 | 
			
		||||
@@ -514,8 +482,8 @@ public class SQLManager implements AbstractDB {
 | 
			
		||||
            }
 | 
			
		||||
            if (!this.clusterTasks.isEmpty()) {
 | 
			
		||||
                count = Math.max(count, 0);
 | 
			
		||||
                if (this.connection.getAutoCommit()) {
 | 
			
		||||
                    this.connection.setAutoCommit(false);
 | 
			
		||||
                if (connection.getAutoCommit()) {
 | 
			
		||||
                    connection.setAutoCommit(false);
 | 
			
		||||
                }
 | 
			
		||||
                String method = null;
 | 
			
		||||
                PreparedStatement statement = null;
 | 
			
		||||
@@ -559,12 +527,12 @@ public class SQLManager implements AbstractDB {
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            if (count > 0) {
 | 
			
		||||
                commit();
 | 
			
		||||
                commit(connection);
 | 
			
		||||
                return true;
 | 
			
		||||
            }
 | 
			
		||||
            if (count != -1) {
 | 
			
		||||
                if (!this.connection.getAutoCommit()) {
 | 
			
		||||
                    this.connection.setAutoCommit(true);
 | 
			
		||||
                if (!connection.getAutoCommit()) {
 | 
			
		||||
                    connection.setAutoCommit(true);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            if (!this.clusterTasks.isEmpty()) {
 | 
			
		||||
@@ -584,10 +552,6 @@ public class SQLManager implements AbstractDB {
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public Connection getConnection() {
 | 
			
		||||
        return this.connection;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Set Plot owner
 | 
			
		||||
     *
 | 
			
		||||
@@ -606,8 +570,8 @@ public class SQLManager implements AbstractDB {
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            @Override
 | 
			
		||||
            public PreparedStatement get() throws SQLException {
 | 
			
		||||
                return SQLManager.this.connection.prepareStatement(SQLManager.this.SET_OWNER);
 | 
			
		||||
            public @Nullable PreparedStatement get(final @NonNull Connection connection) throws SQLException {
 | 
			
		||||
                return connection.prepareStatement(SQLManager.this.SET_OWNER);
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
@@ -615,7 +579,7 @@ public class SQLManager implements AbstractDB {
 | 
			
		||||
    @Override
 | 
			
		||||
    public void createPlotsAndData(final List<Plot> myList, final Runnable whenDone) {
 | 
			
		||||
        addGlobalTask(() -> {
 | 
			
		||||
            try {
 | 
			
		||||
            try (Connection connection = this.dataSource().getConnection()) {
 | 
			
		||||
                // Create the plots
 | 
			
		||||
                createPlots(myList, () -> {
 | 
			
		||||
                    final Map<PlotId, Integer> idMap = new HashMap<>();
 | 
			
		||||
@@ -632,7 +596,7 @@ public class SQLManager implements AbstractDB {
 | 
			
		||||
                        final ArrayList<UUIDPair> denied = new ArrayList<>();
 | 
			
		||||
 | 
			
		||||
                        // Populating structures
 | 
			
		||||
                        try (PreparedStatement stmt = SQLManager.this.connection
 | 
			
		||||
                        try (PreparedStatement stmt = connection
 | 
			
		||||
                                .prepareStatement(SQLManager.this.GET_ALL_PLOTS);
 | 
			
		||||
                             ResultSet result = stmt.executeQuery()) {
 | 
			
		||||
                            while (result.next()) {
 | 
			
		||||
@@ -657,13 +621,14 @@ public class SQLManager implements AbstractDB {
 | 
			
		||||
                            }
 | 
			
		||||
                        }
 | 
			
		||||
 | 
			
		||||
                        createFlags(idMap, myList, () -> createSettings(
 | 
			
		||||
                        createFlags(connection, idMap, myList, () -> createSettings(
 | 
			
		||||
                                connection,
 | 
			
		||||
                                settings,
 | 
			
		||||
                                () -> createTiers(helpers, "helpers",
 | 
			
		||||
                                        () -> createTiers(trusted, "trusted",
 | 
			
		||||
                                                () -> createTiers(denied, "denied", () -> {
 | 
			
		||||
                                                    try {
 | 
			
		||||
                                                        SQLManager.this.connection.commit();
 | 
			
		||||
                                                        connection.commit();
 | 
			
		||||
                                                    } catch (SQLException e) {
 | 
			
		||||
                                                        e.printStackTrace();
 | 
			
		||||
                                                    }
 | 
			
		||||
@@ -677,7 +642,7 @@ public class SQLManager implements AbstractDB {
 | 
			
		||||
                    } catch (SQLException e) {
 | 
			
		||||
                        LOGGER.warn("Failed to set all flags and member tiers for plots", e);
 | 
			
		||||
                        try {
 | 
			
		||||
                            SQLManager.this.connection.commit();
 | 
			
		||||
                            connection.commit();
 | 
			
		||||
                        } catch (SQLException e1) {
 | 
			
		||||
                            e1.printStackTrace();
 | 
			
		||||
                        }
 | 
			
		||||
@@ -685,11 +650,6 @@ public class SQLManager implements AbstractDB {
 | 
			
		||||
                });
 | 
			
		||||
            } catch (Exception e) {
 | 
			
		||||
                LOGGER.warn("Warning! Failed to set all helper for plots", e);
 | 
			
		||||
                try {
 | 
			
		||||
                    SQLManager.this.connection.commit();
 | 
			
		||||
                } catch (SQLException e1) {
 | 
			
		||||
                    e1.printStackTrace();
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
@@ -746,8 +706,13 @@ public class SQLManager implements AbstractDB {
 | 
			
		||||
        setBulk(myList, mod, whenDone);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void createFlags(Map<PlotId, Integer> ids, List<Plot> plots, Runnable whenDone) {
 | 
			
		||||
        try (final PreparedStatement preparedStatement = this.connection.prepareStatement(
 | 
			
		||||
    private void createFlags(
 | 
			
		||||
            final @NonNull Connection connection,
 | 
			
		||||
            final @NonNull Map<@NonNull PlotId, @NonNull Integer> ids,
 | 
			
		||||
            final @NonNull List<@NonNull Plot> plots,
 | 
			
		||||
            final @NonNull Runnable whenDone
 | 
			
		||||
    ) {
 | 
			
		||||
        try (final PreparedStatement preparedStatement = connection.prepareStatement(
 | 
			
		||||
                "INSERT INTO `" + SQLManager.this.prefix
 | 
			
		||||
                        + "plot_flags`(`plot_id`, `flag`, `value`) VALUES(?, ?, ?)")) {
 | 
			
		||||
            for (final Plot plot : plots) {
 | 
			
		||||
@@ -845,6 +810,7 @@ public class SQLManager implements AbstractDB {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public <T> void setBulk(List<T> objList, StmtMod<T> mod, Runnable whenDone) {
 | 
			
		||||
        try (Connection connection = this.dataSource().getConnection()) {
 | 
			
		||||
            int size = objList.size();
 | 
			
		||||
            if (size == 0) {
 | 
			
		||||
                if (whenDone != null) {
 | 
			
		||||
@@ -872,13 +838,13 @@ public class SQLManager implements AbstractDB {
 | 
			
		||||
                    if (last == -1) {
 | 
			
		||||
                        last = subList.size();
 | 
			
		||||
                        statement = mod.getCreateMySQL(subList.size());
 | 
			
		||||
                    preparedStmt = this.connection.prepareStatement(statement);
 | 
			
		||||
                        preparedStmt = connection.prepareStatement(statement);
 | 
			
		||||
                    }
 | 
			
		||||
                    if (subList.size() != last || count % 5000 == 0 && count > 0) {
 | 
			
		||||
                        preparedStmt.executeBatch();
 | 
			
		||||
                        preparedStmt.close();
 | 
			
		||||
                        statement = mod.getCreateMySQL(subList.size());
 | 
			
		||||
                    preparedStmt = this.connection.prepareStatement(statement);
 | 
			
		||||
                        preparedStmt = connection.prepareStatement(statement);
 | 
			
		||||
                    }
 | 
			
		||||
                    for (int i = 0; i < subList.size(); i++) {
 | 
			
		||||
                        count++;
 | 
			
		||||
@@ -914,13 +880,13 @@ public class SQLManager implements AbstractDB {
 | 
			
		||||
                    if (last == -1) {
 | 
			
		||||
                        last = subList.size();
 | 
			
		||||
                        statement = mod.getCreateSQLite(subList.size());
 | 
			
		||||
                    preparedStmt = this.connection.prepareStatement(statement);
 | 
			
		||||
                        preparedStmt = connection.prepareStatement(statement);
 | 
			
		||||
                    }
 | 
			
		||||
                    if (subList.size() != last || count % 5000 == 0 && count > 0) {
 | 
			
		||||
                        preparedStmt.executeBatch();
 | 
			
		||||
                        preparedStmt.clearParameters();
 | 
			
		||||
                        statement = mod.getCreateSQLite(subList.size());
 | 
			
		||||
                    preparedStmt = this.connection.prepareStatement(statement);
 | 
			
		||||
                        preparedStmt = connection.prepareStatement(statement);
 | 
			
		||||
                    }
 | 
			
		||||
                    for (int i = 0; i < subList.size(); i++) {
 | 
			
		||||
                        count++;
 | 
			
		||||
@@ -937,7 +903,7 @@ public class SQLManager implements AbstractDB {
 | 
			
		||||
                e.printStackTrace();
 | 
			
		||||
                LOGGER.error("2: | {}", objList.get(0).getClass().getCanonicalName());
 | 
			
		||||
                LOGGER.error("Could not bulk save!");
 | 
			
		||||
            try (PreparedStatement preparedStmt = this.connection
 | 
			
		||||
                try (PreparedStatement preparedStmt = connection
 | 
			
		||||
                        .prepareStatement(mod.getCreateSQL())) {
 | 
			
		||||
                    for (T obj : objList) {
 | 
			
		||||
                        mod.setSQL(preparedStmt, obj);
 | 
			
		||||
@@ -952,10 +918,16 @@ public class SQLManager implements AbstractDB {
 | 
			
		||||
            if (whenDone != null) {
 | 
			
		||||
                whenDone.run();
 | 
			
		||||
            }
 | 
			
		||||
        } catch (Exception e) {
 | 
			
		||||
            LOGGER.error("Failed to create SQL connection", e);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void createSettings(final ArrayList<LegacySettings> myList, final Runnable whenDone) {
 | 
			
		||||
        try (final PreparedStatement preparedStatement = this.connection.prepareStatement(
 | 
			
		||||
    private void createSettings(
 | 
			
		||||
            final @NonNull Connection connection,
 | 
			
		||||
            final @NonNull List<@NonNull LegacySettings> myList,
 | 
			
		||||
            final @NonNull Runnable whenDone) {
 | 
			
		||||
        try (PreparedStatement preparedStatement = connection.prepareStatement(
 | 
			
		||||
                "INSERT INTO `" + SQLManager.this.prefix + "plot_settings`"
 | 
			
		||||
                        + "(`plot_plot_id`,`biome`,`rain`,`custom_time`,`time`,`deny_entry`,`alias`,`merged`,`position`) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?)")) {
 | 
			
		||||
 | 
			
		||||
@@ -1082,8 +1054,8 @@ public class SQLManager implements AbstractDB {
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            @Override
 | 
			
		||||
            public PreparedStatement get() throws SQLException {
 | 
			
		||||
                return SQLManager.this.connection.prepareStatement(
 | 
			
		||||
            public @Nullable PreparedStatement get(final @NonNull Connection connection) throws SQLException {
 | 
			
		||||
                return connection.prepareStatement(
 | 
			
		||||
                        SQLManager.this.CREATE_PLOT_SAFE,
 | 
			
		||||
                        Statement.RETURN_GENERATED_KEYS
 | 
			
		||||
                );
 | 
			
		||||
@@ -1109,8 +1081,8 @@ public class SQLManager implements AbstractDB {
 | 
			
		||||
                                }
 | 
			
		||||
 | 
			
		||||
                                @Override
 | 
			
		||||
                                public PreparedStatement get() throws SQLException {
 | 
			
		||||
                                    return SQLManager.this.connection.prepareStatement(
 | 
			
		||||
                                public @Nullable PreparedStatement get(final @NonNull Connection connection) throws SQLException {
 | 
			
		||||
                                    return connection.prepareStatement(
 | 
			
		||||
                                            "INSERT INTO `" + SQLManager.this.prefix
 | 
			
		||||
                                                    + "plot_settings`(`plot_plot_id`) VALUES(?)");
 | 
			
		||||
                                }
 | 
			
		||||
@@ -1129,17 +1101,14 @@ public class SQLManager implements AbstractDB {
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void commit() {
 | 
			
		||||
        if (this.closed) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
    private void commit(final @NonNull Connection connection) {
 | 
			
		||||
        try {
 | 
			
		||||
            if (!this.connection.getAutoCommit()) {
 | 
			
		||||
                this.connection.commit();
 | 
			
		||||
                this.connection.setAutoCommit(true);
 | 
			
		||||
            if (!connection.getAutoCommit()) {
 | 
			
		||||
                connection.commit();
 | 
			
		||||
                connection.setAutoCommit(true);
 | 
			
		||||
            }
 | 
			
		||||
        } catch (SQLException e) {
 | 
			
		||||
            e.printStackTrace();
 | 
			
		||||
            LOGGER.error("Failed to commit database transaction", e);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -1156,8 +1125,8 @@ public class SQLManager implements AbstractDB {
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            @Override
 | 
			
		||||
            public PreparedStatement get() throws SQLException {
 | 
			
		||||
                return SQLManager.this.connection
 | 
			
		||||
            public @Nullable PreparedStatement get(final @NonNull Connection connection) throws SQLException {
 | 
			
		||||
                return connection
 | 
			
		||||
                        .prepareStatement(SQLManager.this.CREATE_PLOT, Statement.RETURN_GENERATED_KEYS);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
@@ -1182,8 +1151,8 @@ public class SQLManager implements AbstractDB {
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            @Override
 | 
			
		||||
            public PreparedStatement get() throws SQLException {
 | 
			
		||||
                return SQLManager.this.connection.prepareStatement(
 | 
			
		||||
            public @Nullable PreparedStatement get(final @NonNull Connection connection) throws SQLException {
 | 
			
		||||
                return connection.prepareStatement(
 | 
			
		||||
                        "INSERT INTO `" + SQLManager.this.prefix
 | 
			
		||||
                                + "plot_settings`(`plot_plot_id`) VALUES(?)");
 | 
			
		||||
            }
 | 
			
		||||
@@ -1198,6 +1167,7 @@ public class SQLManager implements AbstractDB {
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void createTables() throws SQLException {
 | 
			
		||||
        try (Connection connection = this.dataSource().getConnection()) {
 | 
			
		||||
            String[] tables =
 | 
			
		||||
                    new String[]{"plot", "plot_denied", "plot_helpers", "plot_comments", "plot_trusted",
 | 
			
		||||
                            "plot_rating", "plot_settings", "cluster", "player_meta", "plot_flags"};
 | 
			
		||||
@@ -1215,7 +1185,7 @@ public class SQLManager implements AbstractDB {
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
            boolean addConstraint = create == tables.length;
 | 
			
		||||
        try (Statement stmt = this.connection.createStatement()) {
 | 
			
		||||
            try (Statement stmt = connection.createStatement()) {
 | 
			
		||||
                if (this.mySQL) {
 | 
			
		||||
                    stmt.addBatch("CREATE TABLE IF NOT EXISTS `" + this.prefix + "plot` ("
 | 
			
		||||
                            + "`id` INT(11) NOT NULL AUTO_INCREMENT," + "`plot_id_x` INT(11) NOT NULL,"
 | 
			
		||||
@@ -1350,6 +1320,7 @@ public class SQLManager implements AbstractDB {
 | 
			
		||||
                stmt.clearBatch();
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void deleteSettings(final Plot plot) {
 | 
			
		||||
@@ -1360,8 +1331,8 @@ public class SQLManager implements AbstractDB {
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            @Override
 | 
			
		||||
            public PreparedStatement get() throws SQLException {
 | 
			
		||||
                return SQLManager.this.connection.prepareStatement(
 | 
			
		||||
            public @Nullable PreparedStatement get(final @NonNull Connection connection) throws SQLException {
 | 
			
		||||
                return connection.prepareStatement(
 | 
			
		||||
                        "DELETE FROM `" + SQLManager.this.prefix
 | 
			
		||||
                                + "plot_settings` WHERE `plot_plot_id` = ?");
 | 
			
		||||
            }
 | 
			
		||||
@@ -1380,8 +1351,8 @@ public class SQLManager implements AbstractDB {
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            @Override
 | 
			
		||||
            public PreparedStatement get() throws SQLException {
 | 
			
		||||
                return SQLManager.this.connection.prepareStatement(
 | 
			
		||||
            public @Nullable PreparedStatement get(final @NonNull Connection connection) throws SQLException {
 | 
			
		||||
                return connection.prepareStatement(
 | 
			
		||||
                        "DELETE FROM `" + SQLManager.this.prefix
 | 
			
		||||
                                + "plot_helpers` WHERE `plot_plot_id` = ?");
 | 
			
		||||
            }
 | 
			
		||||
@@ -1400,8 +1371,8 @@ public class SQLManager implements AbstractDB {
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            @Override
 | 
			
		||||
            public PreparedStatement get() throws SQLException {
 | 
			
		||||
                return SQLManager.this.connection.prepareStatement(
 | 
			
		||||
            public @Nullable PreparedStatement get(final @NonNull Connection connection) throws SQLException {
 | 
			
		||||
                return connection.prepareStatement(
 | 
			
		||||
                        "DELETE FROM `" + SQLManager.this.prefix
 | 
			
		||||
                                + "plot_trusted` WHERE `plot_plot_id` = ?");
 | 
			
		||||
            }
 | 
			
		||||
@@ -1420,8 +1391,8 @@ public class SQLManager implements AbstractDB {
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            @Override
 | 
			
		||||
            public PreparedStatement get() throws SQLException {
 | 
			
		||||
                return SQLManager.this.connection.prepareStatement(
 | 
			
		||||
            public @Nullable PreparedStatement get(final @NonNull Connection connection) throws SQLException {
 | 
			
		||||
                return connection.prepareStatement(
 | 
			
		||||
                        "DELETE FROM `" + SQLManager.this.prefix
 | 
			
		||||
                                + "plot_denied` WHERE `plot_plot_id` = ?");
 | 
			
		||||
            }
 | 
			
		||||
@@ -1438,8 +1409,8 @@ public class SQLManager implements AbstractDB {
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            @Override
 | 
			
		||||
            public PreparedStatement get() throws SQLException {
 | 
			
		||||
                return SQLManager.this.connection.prepareStatement(
 | 
			
		||||
            public @Nullable PreparedStatement get(final @NonNull Connection connection) throws SQLException {
 | 
			
		||||
                return connection.prepareStatement(
 | 
			
		||||
                        "DELETE FROM `" + SQLManager.this.prefix
 | 
			
		||||
                                + "plot_comments` WHERE `world` = ? AND `hashcode` = ?");
 | 
			
		||||
            }
 | 
			
		||||
@@ -1458,8 +1429,8 @@ public class SQLManager implements AbstractDB {
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            @Override
 | 
			
		||||
            public PreparedStatement get() throws SQLException {
 | 
			
		||||
                return SQLManager.this.connection.prepareStatement(
 | 
			
		||||
            public @Nullable PreparedStatement get(final @NonNull Connection connection) throws SQLException {
 | 
			
		||||
                return connection.prepareStatement(
 | 
			
		||||
                        "DELETE FROM `" + SQLManager.this.prefix
 | 
			
		||||
                                + "plot_rating` WHERE `plot_plot_id` = ?");
 | 
			
		||||
            }
 | 
			
		||||
@@ -1486,8 +1457,8 @@ public class SQLManager implements AbstractDB {
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            @Override
 | 
			
		||||
            public PreparedStatement get() throws SQLException {
 | 
			
		||||
                return SQLManager.this.connection.prepareStatement(
 | 
			
		||||
            public @Nullable PreparedStatement get(final @NonNull Connection connection) throws SQLException {
 | 
			
		||||
                return connection.prepareStatement(
 | 
			
		||||
                        "DELETE FROM `" + SQLManager.this.prefix + "plot` WHERE `id` = ?");
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
@@ -1508,8 +1479,8 @@ public class SQLManager implements AbstractDB {
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            @Override
 | 
			
		||||
            public PreparedStatement get() throws SQLException {
 | 
			
		||||
                return SQLManager.this.connection.prepareStatement(
 | 
			
		||||
            public @Nullable PreparedStatement get(final @NonNull Connection connection) throws SQLException {
 | 
			
		||||
                return connection.prepareStatement(
 | 
			
		||||
                        "INSERT INTO `" + SQLManager.this.prefix
 | 
			
		||||
                                + "plot_settings`(`plot_plot_id`) VALUES(?)");
 | 
			
		||||
            }
 | 
			
		||||
@@ -1518,16 +1489,12 @@ public class SQLManager implements AbstractDB {
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public int getClusterId(PlotCluster cluster) {
 | 
			
		||||
        if (cluster.temp > 0) {
 | 
			
		||||
            return cluster.temp;
 | 
			
		||||
        }
 | 
			
		||||
        try {
 | 
			
		||||
            commit();
 | 
			
		||||
        try (Connection connection = this.dataSource.getConnection()) {
 | 
			
		||||
            if (cluster.temp > 0) {
 | 
			
		||||
                return cluster.temp;
 | 
			
		||||
            }
 | 
			
		||||
            int c_id;
 | 
			
		||||
            try (PreparedStatement stmt = this.connection.prepareStatement(
 | 
			
		||||
            try (PreparedStatement stmt = 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")) {
 | 
			
		||||
                stmt.setInt(1, cluster.getP1().getX());
 | 
			
		||||
@@ -1561,13 +1528,12 @@ public class SQLManager implements AbstractDB {
 | 
			
		||||
        if (plot.temp > 0) {
 | 
			
		||||
            return plot.temp;
 | 
			
		||||
        }
 | 
			
		||||
        try {
 | 
			
		||||
            commit();
 | 
			
		||||
        try (Connection connection = this.dataSource().getConnection()) {
 | 
			
		||||
            if (plot.temp > 0) {
 | 
			
		||||
                return plot.temp;
 | 
			
		||||
            }
 | 
			
		||||
            int id;
 | 
			
		||||
            try (PreparedStatement statement = this.connection.prepareStatement(
 | 
			
		||||
            try (PreparedStatement statement = connection.prepareStatement(
 | 
			
		||||
                    "SELECT `id` FROM `" + this.prefix
 | 
			
		||||
                            + "plot` WHERE `plot_id_x` = ? AND `plot_id_z` = ? AND world = ? ORDER BY `timestamp` ASC")) {
 | 
			
		||||
                statement.setInt(1, plot.getId().getX());
 | 
			
		||||
@@ -1596,15 +1562,15 @@ public class SQLManager implements AbstractDB {
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void updateTables(int[] oldVersion) {
 | 
			
		||||
        try {
 | 
			
		||||
        try (Connection connection = this.dataSource().getConnection()) {
 | 
			
		||||
            if (this.mySQL && !PlotSquared.get().checkVersion(oldVersion, 3, 3, 2)) {
 | 
			
		||||
                try (Statement stmt = this.connection.createStatement()) {
 | 
			
		||||
                try (Statement stmt = connection.createStatement()) {
 | 
			
		||||
                    stmt.executeUpdate(
 | 
			
		||||
                            "ALTER TABLE `" + this.prefix + "plots` DROP INDEX `unique_alias`");
 | 
			
		||||
                } catch (SQLException ignored) {
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            DatabaseMetaData data = this.connection.getMetaData();
 | 
			
		||||
            DatabaseMetaData data = connection.getMetaData();
 | 
			
		||||
            ResultSet rs =
 | 
			
		||||
                    data.getColumns(null, null, this.prefix + "plot_comments", "plot_plot_id");
 | 
			
		||||
            if (rs.next()) {
 | 
			
		||||
@@ -1612,7 +1578,7 @@ public class SQLManager implements AbstractDB {
 | 
			
		||||
                rs = data.getColumns(null, null, this.prefix + "plot_comments", "hashcode");
 | 
			
		||||
                if (!rs.next()) {
 | 
			
		||||
                    rs.close();
 | 
			
		||||
                    try (Statement statement = this.connection.createStatement()) {
 | 
			
		||||
                    try (Statement statement = connection.createStatement()) {
 | 
			
		||||
                        statement.addBatch("DROP TABLE `" + this.prefix + "plot_comments`");
 | 
			
		||||
                        if (Storage.MySQL.USE) {
 | 
			
		||||
                            statement.addBatch(
 | 
			
		||||
@@ -1647,7 +1613,7 @@ public class SQLManager implements AbstractDB {
 | 
			
		||||
            rs.close();
 | 
			
		||||
            rs = data.getColumns(null, null, this.prefix + "plot_denied", "plot_plot_id");
 | 
			
		||||
            if (rs.next()) {
 | 
			
		||||
                try (Statement statement = this.connection.createStatement()) {
 | 
			
		||||
                try (Statement statement = connection.createStatement()) {
 | 
			
		||||
                    statement.executeUpdate("DELETE FROM `" + this.prefix
 | 
			
		||||
                            + "plot_denied` WHERE `plot_plot_id` NOT IN (SELECT `id` FROM `"
 | 
			
		||||
                            + this.prefix + "plot`)");
 | 
			
		||||
@@ -1656,7 +1622,7 @@ public class SQLManager implements AbstractDB {
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                rs.close();
 | 
			
		||||
                try (Statement statement = this.connection.createStatement()) {
 | 
			
		||||
                try (Statement statement = connection.createStatement()) {
 | 
			
		||||
                    for (String table : new String[]{"plot_denied", "plot_helpers",
 | 
			
		||||
                            "plot_trusted"}) {
 | 
			
		||||
                        ResultSet result = statement.executeQuery(
 | 
			
		||||
@@ -1728,9 +1694,12 @@ public class SQLManager implements AbstractDB {
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean convertFlags() {
 | 
			
		||||
        final Map<Integer, Map<String, String>> flagMap = new HashMap<>();
 | 
			
		||||
        try (Statement statement = this.connection.createStatement()) {
 | 
			
		||||
            try (ResultSet resultSet = statement
 | 
			
		||||
                    .executeQuery("SELECT * FROM `" + this.prefix + "plot_settings`")) {
 | 
			
		||||
        try (
 | 
			
		||||
                Connection connection = this.dataSource().getConnection();
 | 
			
		||||
                Statement statement = connection.createStatement();
 | 
			
		||||
                ResultSet resultSet = statement
 | 
			
		||||
                        .executeQuery("SELECT * FROM `" + this.prefix + "plot_settings`")
 | 
			
		||||
        ) {
 | 
			
		||||
            while (resultSet.next()) {
 | 
			
		||||
                final int id = resultSet.getInt("plot_plot_id");
 | 
			
		||||
                final String plotFlags = resultSet.getString("flags");
 | 
			
		||||
@@ -1751,14 +1720,14 @@ public class SQLManager implements AbstractDB {
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            }
 | 
			
		||||
        } catch (final Exception e) {
 | 
			
		||||
            LOGGER.error("Failed to load old flag values", e);
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
        LOGGER.info("Loaded {} plot flag collections...", flagMap.size());
 | 
			
		||||
        LOGGER.info("Attempting to store these flags in the new table...");
 | 
			
		||||
        try (final PreparedStatement preparedStatement = this.connection.prepareStatement(
 | 
			
		||||
        try (Connection connection = this.dataSource().getConnection(); PreparedStatement preparedStatement =
 | 
			
		||||
                connection.prepareStatement(
 | 
			
		||||
                "INSERT INTO `" + SQLManager.this.prefix
 | 
			
		||||
                        + "plot_flags`(`plot_id`, `flag`, `value`) VALUES(?, ?, ?)")) {
 | 
			
		||||
 | 
			
		||||
@@ -1843,7 +1812,7 @@ public class SQLManager implements AbstractDB {
 | 
			
		||||
            /*
 | 
			
		||||
             * Getting plots
 | 
			
		||||
             */
 | 
			
		||||
            try (Statement statement = this.connection.createStatement()) {
 | 
			
		||||
            try (Connection connection = this.dataSource().getConnection(); Statement statement = connection.createStatement()) {
 | 
			
		||||
                int id;
 | 
			
		||||
                String o;
 | 
			
		||||
                UUID user;
 | 
			
		||||
@@ -2176,8 +2145,8 @@ public class SQLManager implements AbstractDB {
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            @Override
 | 
			
		||||
            public PreparedStatement get() throws SQLException {
 | 
			
		||||
                return SQLManager.this.connection.prepareStatement(
 | 
			
		||||
            public @Nullable PreparedStatement get(final @NonNull Connection connection) throws SQLException {
 | 
			
		||||
                return connection.prepareStatement(
 | 
			
		||||
                        "UPDATE `" + SQLManager.this.prefix
 | 
			
		||||
                                + "plot_settings` SET `merged` = ? WHERE `plot_plot_id` = ?");
 | 
			
		||||
            }
 | 
			
		||||
@@ -3162,6 +3131,8 @@ public class SQLManager implements AbstractDB {
 | 
			
		||||
 | 
			
		||||
            @Override
 | 
			
		||||
            public PreparedStatement get() throws SQLException {
 | 
			
		||||
                try (final Connection connection = )
 | 
			
		||||
 | 
			
		||||
                return SQLManager.this.connection.prepareStatement(
 | 
			
		||||
                        "DELETE FROM `" + SQLManager.this.prefix
 | 
			
		||||
                                + "cluster_invited` WHERE `cluster_id` = ? AND `user_uuid` = ?");
 | 
			
		||||
@@ -3429,13 +3400,16 @@ public class SQLManager implements AbstractDB {
 | 
			
		||||
    @Override
 | 
			
		||||
    public void close() {
 | 
			
		||||
        try {
 | 
			
		||||
            this.closed = true;
 | 
			
		||||
            this.connection.close();
 | 
			
		||||
        } catch (SQLException e) {
 | 
			
		||||
            e.printStackTrace();
 | 
			
		||||
            ((Closeable) this.dataSource()).close();
 | 
			
		||||
        } catch (Exception e) {
 | 
			
		||||
            LOGGER.error("Failed to close data source", e);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private @NonNull DataSource dataSource() {
 | 
			
		||||
        return this.dataSource;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private record LegacySettings(
 | 
			
		||||
            int id,
 | 
			
		||||
            PlotSettings settings
 | 
			
		||||
@@ -3459,7 +3433,7 @@ public class SQLManager implements AbstractDB {
 | 
			
		||||
            statement.executeBatch();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public abstract PreparedStatement get() throws SQLException;
 | 
			
		||||
        public abstract @Nullable PreparedStatement get(final @NonNull Connection connection) throws SQLException;
 | 
			
		||||
 | 
			
		||||
        public abstract void set(PreparedStatement statement) throws SQLException;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -33,6 +33,7 @@ import java.sql.Statement;
 | 
			
		||||
/**
 | 
			
		||||
 * Connects to and uses a SQLite database.
 | 
			
		||||
 */
 | 
			
		||||
@Deprecated(forRemoval = true)
 | 
			
		||||
public class SQLite extends Database {
 | 
			
		||||
 | 
			
		||||
    private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + SQLite.class.getSimpleName());
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,12 @@
 | 
			
		||||
package com.plotsquared.core.inject.annotations;
 | 
			
		||||
 | 
			
		||||
import java.lang.annotation.ElementType;
 | 
			
		||||
import java.lang.annotation.Retention;
 | 
			
		||||
import java.lang.annotation.RetentionPolicy;
 | 
			
		||||
import java.lang.annotation.Target;
 | 
			
		||||
 | 
			
		||||
@Target({ElementType.FIELD, ElementType.TYPE, ElementType.PARAMETER})
 | 
			
		||||
@Retention(RetentionPolicy.RUNTIME)
 | 
			
		||||
public @interface PlotDatabase {
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,72 @@
 | 
			
		||||
package com.plotsquared.core.inject.modules;
 | 
			
		||||
 | 
			
		||||
import com.google.inject.AbstractModule;
 | 
			
		||||
import com.plotsquared.core.PlotSquared;
 | 
			
		||||
import com.plotsquared.core.configuration.Storage;
 | 
			
		||||
import com.plotsquared.core.inject.annotations.PlotDatabase;
 | 
			
		||||
import com.plotsquared.core.util.FileUtils;
 | 
			
		||||
import com.plotsquared.core.util.StringMan;
 | 
			
		||||
import com.zaxxer.hikari.HikariConfig;
 | 
			
		||||
import com.zaxxer.hikari.HikariDataSource;
 | 
			
		||||
import org.apache.logging.log4j.LogManager;
 | 
			
		||||
import org.apache.logging.log4j.Logger;
 | 
			
		||||
 | 
			
		||||
import javax.sql.DataSource;
 | 
			
		||||
import java.io.File;
 | 
			
		||||
 | 
			
		||||
public class DatabaseModule extends AbstractModule {
 | 
			
		||||
 | 
			
		||||
    private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + PlotSquared.class.getSimpleName());
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected void configure() {
 | 
			
		||||
        try {
 | 
			
		||||
            if (Storage.MySQL.USE) {
 | 
			
		||||
                this.configureMySQL();
 | 
			
		||||
            } else if (Storage.SQLite.USE) {
 | 
			
		||||
                this.configureSQLite();
 | 
			
		||||
            } else {
 | 
			
		||||
                LOGGER.error("No storage type is set. Disabling PlotSquared");
 | 
			
		||||
                PlotSquared.platform().shutdown();
 | 
			
		||||
            }
 | 
			
		||||
        } catch (final Exception e) {
 | 
			
		||||
            LOGGER.error("Unable to initialize database", e);
 | 
			
		||||
            PlotSquared.platform().shutdown();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void configureSQLite() throws Exception {
 | 
			
		||||
        final File file = FileUtils.getFile(PlotSquared.platform().getDirectory(), Storage.SQLite.DB + ".db");
 | 
			
		||||
        if (!file.exists()) {
 | 
			
		||||
            file.createNewFile();
 | 
			
		||||
        }
 | 
			
		||||
        Class.forName("org.sqlite.JDBC");
 | 
			
		||||
 | 
			
		||||
        final HikariConfig config = new HikariConfig();
 | 
			
		||||
        config.setJdbcUrl("jdbc:sqlite:" + file);
 | 
			
		||||
        config.setDriverClassName("org.sqlite.JDBC");
 | 
			
		||||
        final DataSource dataSource = new HikariDataSource();
 | 
			
		||||
 | 
			
		||||
        binder().bind(DataSource.class).annotatedWith(PlotDatabase.class).toInstance(dataSource);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void configureMySQL() {
 | 
			
		||||
        final HikariConfig hikariConfig = new HikariConfig();
 | 
			
		||||
        hikariConfig.setJdbcUrl(
 | 
			
		||||
                String.format(
 | 
			
		||||
                        "jdbc:mysql://%s:%s/%s?%s",
 | 
			
		||||
                        Storage.MySQL.HOST,
 | 
			
		||||
                        Storage.MySQL.PORT,
 | 
			
		||||
                        Storage.MySQL.DATABASE,
 | 
			
		||||
                        StringMan.join(Storage.MySQL.PROPERTIES, "&")
 | 
			
		||||
                ));
 | 
			
		||||
        hikariConfig.setUsername(Storage.MySQL.USER);
 | 
			
		||||
        hikariConfig.setPassword(Storage.MySQL.PASSWORD);
 | 
			
		||||
        hikariConfig.addDataSourceProperty("cachePrepStmts", "true");
 | 
			
		||||
        hikariConfig.addDataSourceProperty("prepStmtCacheSize", "512");
 | 
			
		||||
        hikariConfig.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");
 | 
			
		||||
        final DataSource dataSource = new HikariDataSource(hikariConfig);
 | 
			
		||||
 | 
			
		||||
        binder().bind(DataSource.class).annotatedWith(PlotDatabase.class).toInstance(dataSource);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,15 @@
 | 
			
		||||
package com.plotsquared.core.inject.modules;
 | 
			
		||||
 | 
			
		||||
import com.plotsquared.core.inject.annotations.PlotDatabase;
 | 
			
		||||
import org.jdbi.v3.guice.AbstractJdbiDefinitionModule;
 | 
			
		||||
 | 
			
		||||
public class JdbiModule extends AbstractJdbiDefinitionModule {
 | 
			
		||||
 | 
			
		||||
    public JdbiModule() {
 | 
			
		||||
        super(PlotDatabase.class);
 | 
			
		||||
    }
 | 
			
		||||
    @Override
 | 
			
		||||
    public void configureJdbi() {
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -19,6 +19,10 @@ luckperms = "5.4"
 | 
			
		||||
essentialsx = "2.20.1"
 | 
			
		||||
mvdwapi = "3.1.1"
 | 
			
		||||
 | 
			
		||||
# Datebase
 | 
			
		||||
hikaricp = "5.0.1"
 | 
			
		||||
jdbi = "3.41.3"
 | 
			
		||||
 | 
			
		||||
# Third party
 | 
			
		||||
prtree = "2.0.1"
 | 
			
		||||
aopalliance = "1.0"
 | 
			
		||||
@@ -63,6 +67,11 @@ essentialsx = { group = "net.essentialsx", name = "EssentialsX", version.ref = "
 | 
			
		||||
faweCore = { group = "com.fastasyncworldedit", name = "FastAsyncWorldEdit-Core", version.ref = "fawe" }
 | 
			
		||||
faweBukkit = { group = "com.fastasyncworldedit", name = "FastAsyncWorldEdit-Bukkit", version.ref = "fawe" }
 | 
			
		||||
 | 
			
		||||
# Database
 | 
			
		||||
hikaricp = { group = "com.zaxxer", name = "HikariCP", version.ref = "hikaricp" }
 | 
			
		||||
jdbiCore = { group = "org.jdbi", name = "jdbi3-core", version.ref = "jdbi" }
 | 
			
		||||
jdbiGuice = { group = "org.jdbi", name = "jdbi3-guice", version.ref = "jdbi" }
 | 
			
		||||
 | 
			
		||||
# Third party
 | 
			
		||||
prtree = { group = "com.intellectualsites.prtree", name = "PRTree", version.ref = "prtree" }
 | 
			
		||||
aopalliance = { group = "aopalliance", name = "aopalliance", version.ref = "aopalliance" }
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user