diff --git a/src/main/java/ru/simsonic/rscPermissions/Backends/BackendDatabase.java b/src/main/java/ru/simsonic/rscPermissions/Backends/BackendDatabase.java index b75b105..a096457 100644 --- a/src/main/java/ru/simsonic/rscPermissions/Backends/BackendDatabase.java +++ b/src/main/java/ru/simsonic/rscPermissions/Backends/BackendDatabase.java @@ -12,18 +12,14 @@ import ru.simsonic.rscUtilityLibrary.ConnectionMySQL; public class BackendDatabase extends ConnectionMySQL { - protected final String serverId; - public BackendDatabase(Logger logger, String serverId) + public BackendDatabase(Logger logger) { super(logger); - this.serverId = serverId; } @Override public synchronized boolean connect() { - return super.connect() - && executeUpdateT("Initialize_main_v1") - && executeUpdateT("Cleanup_tables"); + return super.connect() && executeUpdateT("Initialize_main_v1"); } public synchronized DatabaseContents retrieveContents() { @@ -42,7 +38,7 @@ public class BackendDatabase extends ConnectionMySQL }); return contents; } - public synchronized RowEntity[] fetchEntities() + private RowEntity[] fetchEntities() { final ArrayList result = new ArrayList<>(); final ResultSet rs = executeQuery("SELECT * FROM `{DATABASE}`.`{PREFIX}entities`;"); @@ -65,7 +61,7 @@ public class BackendDatabase extends ConnectionMySQL } return result.toArray(new RowEntity[result.size()]); } - public synchronized RowPermission[] fetchPermissions() + private RowPermission[] fetchPermissions() { final ArrayList result = new ArrayList<>(); final ResultSet rs = executeQuery("SELECT * FROM `{DATABASE}`.`{PREFIX}permissions`;"); @@ -90,7 +86,7 @@ public class BackendDatabase extends ConnectionMySQL } return result.toArray(new RowPermission[result.size()]); } - public synchronized RowInheritance[] fetchInheritance() + private RowInheritance[] fetchInheritance() { final ArrayList result = new ArrayList<>(); final ResultSet rs = executeQuery("SELECT * FROM `{DATABASE}`.`{PREFIX}inheritance`;"); diff --git a/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitCommands.java b/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitCommands.java index 223b812..47784cd 100644 --- a/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitCommands.java +++ b/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitCommands.java @@ -20,14 +20,27 @@ public class BukkitCommands { this.rscp = rscp; } - public final RestartableThread threadFetchTablesData = new RestartableThread() + public final RestartableThread threadFetchDatabaseContents = new RestartableThread() { @Override public void run() { + if(rscp.connection.isConnected() == false) + if(rscp.connection.connect() == false) + { + BukkitPluginMain.consoleLog.warning("[rscp] Cannot connect to database! Using local cache."); + return; + } final DatabaseContents contents = rscp.connection.retrieveContents(); - rscp.internalCache.fill(contents); - rscp.permissionManager.recalculateOnlinePlayersSync(); + if(contents != null) + { + contents.normalize(); + rscp.fileCache.cleanup(); + rscp.fileCache.saveContents(contents); + rscp.internalCache.fill(contents); + rscp.permissionManager.recalculateOnlinePlayersSync(); + } else + BukkitPluginMain.consoleLog.warning("[rscp] Cannot load data from database."); } }; public Thread threadMigrateFromPExSQL(final CommandSender sender) @@ -41,7 +54,7 @@ public class BukkitCommands { setName("rscp:MigrateFromPExSQL"); rscp.connection.executeUpdateT("Migrate_from_PermissionsEx"); - threadFetchTablesData.join(); + threadFetchDatabaseContents.join(); rscp.getServer().getScheduler().runTask(rscp, new Runnable() { @Override @@ -51,8 +64,7 @@ public class BukkitCommands rscp.formattedMessage(sender, "Check the latest database row for new data."); } }); - } catch(InterruptedException ex) - { + } catch(InterruptedException ex) { BukkitPluginMain.consoleLog.log(Level.SEVERE, "[rscp] Exception in MigrateFromPExSQL(): {0}", ex); } } @@ -82,11 +94,6 @@ public class BukkitCommands threadInsertExampleRows.start(); return threadInsertExampleRows; } - public RestartableThread threadFetchTablesData() - { - threadFetchTablesData.start(); - return threadFetchTablesData; - } public void onCommand(CommandSender sender, Command cmd, String label, String[] args) throws CommandAnswerException { switch(cmd.getName().toLowerCase()) @@ -169,7 +176,7 @@ public class BukkitCommands // TO DO HERE PermissionsEx_YAML importer_pex = new PermissionsEx_YAML( new File(rscp.getDataFolder(), args[2])); - threadFetchTablesData(); + threadFetchDatabaseContents.start(); throw new CommandAnswerException(new String[] { "Data has been imported successfully!", @@ -197,7 +204,7 @@ public class BukkitCommands /* rscp fetch */ if(sender.hasPermission("rscp.admin.reload")) { - threadFetchTablesData(); + threadFetchDatabaseContents.start(); throw new CommandAnswerException("Tables have been fetched."); } return; diff --git a/src/main/java/ru/simsonic/rscPermissions/BukkitPluginMain.java b/src/main/java/ru/simsonic/rscPermissions/BukkitPluginMain.java index a773093..24dda86 100644 --- a/src/main/java/ru/simsonic/rscPermissions/BukkitPluginMain.java +++ b/src/main/java/ru/simsonic/rscPermissions/BukkitPluginMain.java @@ -16,6 +16,7 @@ import org.bukkit.scheduler.BukkitScheduler; import org.mcstats.MetricsLite; import ru.simsonic.rscPermissions.Backends.BackendDatabase; import ru.simsonic.rscPermissions.Backends.BackendJson; +import ru.simsonic.rscPermissions.Backends.DatabaseContents; import ru.simsonic.rscPermissions.Bukkit.BukkitPermissionManager; import ru.simsonic.rscPermissions.Bukkit.BukkitPluginConfiguration; import ru.simsonic.rscPermissions.Bukkit.PlayerEventsListener; @@ -31,7 +32,7 @@ public final class BukkitPluginMain extends JavaPlugin public final BridgeForBukkitAPI bridgeForBukkit = new BridgeForBukkitAPI(this); public final PlayerEventsListener bukkitListener = new PlayerEventsListener(this); public final BackendJson fileCache = new BackendJson(getDataFolder()); - public final BackendDatabase connection = new BackendDatabase(consoleLog, getServer().getServerId()); + public final BackendDatabase connection = new BackendDatabase(consoleLog); public final InternalCache internalCache = new InternalCache(); public final BukkitPermissionManager permissionManager = new BukkitPermissionManager(this); public final BukkitRegionProviders regionListProvider = new BukkitRegionProviders(this); @@ -50,17 +51,28 @@ public final class BukkitPluginMain extends JavaPlugin public void onEnable() { settings.readSettings(); - connection.initialize(settings.getConnectionParams()); // Register event's dispatcher getServer().getPluginManager().registerEvents(maintenance, this); regionUpdateObserver.registerListeners(); // WorldGuard, Residence and other possible region list providers regionListProvider.integrate(); - // Start all needed threads + // Restore temporary cached data from json files internalCache.setDefaultGroup(settings.getDefaultGroup()); + final DatabaseContents contents = fileCache.retrieveContents(); + internalCache.fill(contents); + consoleLog.log(Level.INFO, + "[rscp] Loaded {0} entity, {1} permission and {2} inheritance rows from local cache.", new Integer[] + { + contents.entities.length, + contents.permissions.length, + contents.inheritance.length, + }); + // Start all needed threads permissionManager.start(); regionUpdateObserver.start(); - commandHelper.threadFetchTablesData(); + // Connect to database and fetch data + connection.initialize(settings.getConnectionParams()); + commandHelper.threadFetchDatabaseContents.start(); // Metrics if(settings.isUseMetrics()) { @@ -99,7 +111,7 @@ public final class BukkitPluginMain extends JavaPlugin @Override public void run() { - commandHelper.threadFetchTablesData.start(); + commandHelper.threadFetchDatabaseContents.start(); } }, delay); } diff --git a/src/main/java/ru/simsonic/rscPermissions/IndependentMain.java b/src/main/java/ru/simsonic/rscPermissions/IndependentMain.java index 36eb6f5..5197556 100644 --- a/src/main/java/ru/simsonic/rscPermissions/IndependentMain.java +++ b/src/main/java/ru/simsonic/rscPermissions/IndependentMain.java @@ -9,23 +9,26 @@ import ru.simsonic.rscPermissions.InternalCache.InternalCache; public class IndependentMain { private static final BackendJson localJsn = new BackendJson(new File("../")); - private static final BackendDatabase remoteDb = new BackendDatabase(Logger.getGlobal(), "test"); + private static final BackendDatabase remoteDb = new BackendDatabase(Logger.getGlobal()); private static final InternalCache intCache = new InternalCache(); @SuppressWarnings({"DeadBranch", "UnusedAssignment"}) public static void main(String args[]) { - String[] qqq = "".split("x+"); System.out.println("rscPermissions - Bukkit superperms plugin © SimSonic"); System.out.println("https://github.com/SimSonic/rscPermissions/"); // TESTING HERE - remoteDb.initialize(null, "voxile.ru:3306/servers-shared", "", "", "rscp_"); + remoteDb.initialize(null, + "", // DATABASE + "", // USERNAME + "", // PASSWORD + "rscp_"); if(remoteDb.connect()) { final DatabaseContents contents = remoteDb.retrieveContents(); contents.normalize(); localJsn.cleanup(); localJsn.saveContents(contents); - intCache.fill(contents); } + intCache.fill(localJsn.retrieveContents()); } }