Skip to content

Commit

Permalink
Changed the way loading of data is handled
Browse files Browse the repository at this point in the history
  • Loading branch information
OmerBenGera committed Sep 23, 2022
1 parent 843922a commit 1cb1a25
Show file tree
Hide file tree
Showing 6 changed files with 152 additions and 60 deletions.
Expand Up @@ -11,18 +11,17 @@
import com.bgsoftware.superiorskyblock.core.database.cache.CachedPlayerInfo;
import com.bgsoftware.superiorskyblock.core.database.cache.DatabaseCache;
import com.bgsoftware.superiorskyblock.core.database.loader.DatabaseLoader;
import com.bgsoftware.superiorskyblock.core.database.loader.sql.SQLDatabaseLoader;
import com.bgsoftware.superiorskyblock.core.database.loader.v1.DatabaseLoader_V1;
import com.bgsoftware.superiorskyblock.core.database.serialization.IslandsDeserializer;
import com.bgsoftware.superiorskyblock.core.database.serialization.PlayersDeserializer;
import com.bgsoftware.superiorskyblock.core.database.sql.SQLDatabaseInitializer;
import com.bgsoftware.superiorskyblock.core.database.sql.SQLHelper;
import com.bgsoftware.superiorskyblock.core.database.sql.session.QueryResult;
import com.bgsoftware.superiorskyblock.core.debug.PluginDebugger;
import com.bgsoftware.superiorskyblock.core.errors.ManagerLoadException;
import com.bgsoftware.superiorskyblock.core.threads.BukkitExecutor;
import com.bgsoftware.superiorskyblock.island.role.SPlayerRole;
import org.bukkit.Bukkit;

import java.io.File;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
Expand All @@ -40,38 +39,17 @@ public DataManager(SuperiorSkyblockPlugin plugin) {
public void loadData() throws ManagerLoadException {
loadDatabaseLoaders();

for (DatabaseLoader databaseLoader : databaseLoaders) {
try {
databaseLoader.loadData();
} catch (Exception error) {
throw new ManagerLoadException(error, "&cUnexpected error occurred while converting data:", ManagerLoadException.ErrorLevel.SERVER_SHUTDOWN);
}
}

if (!plugin.getFactory().hasCustomDatabaseBridge()) {
SQLDatabaseInitializer.getInstance().init(plugin);
}
runState(DatabaseLoader.State.INITIALIZE);

for (DatabaseLoader databaseLoader : databaseLoaders) {
try {
databaseLoader.saveData();
} catch (Exception error) {
throw new ManagerLoadException(error, "&cUnexpected error occurred while saving data:", ManagerLoadException.ErrorLevel.SERVER_SHUTDOWN);
}
}
runState(DatabaseLoader.State.POST_INITIALIZE);

if (!plugin.getFactory().hasCustomDatabaseBridge()) {
SQLDatabaseInitializer.getInstance().createIndexes();
SQLHelper.setJournalMode("MEMORY", QueryResult.EMPTY_QUERY_RESULT);
}
runState(DatabaseLoader.State.PRE_LOAD_DATA);

loadPlayers();
loadIslands();
loadGrid();

if (!plugin.getFactory().hasCustomDatabaseBridge()) {
SQLHelper.setJournalMode("DELETE", QueryResult.EMPTY_QUERY_RESULT);
}
runState(DatabaseLoader.State.POST_LOAD_DATA);

/*
* Because of a bug caused leaders to be guests, I am looping through all the players and trying to fix it here.
Expand Down Expand Up @@ -106,13 +84,18 @@ public void saveDatabase(boolean async) {
}

public void closeConnection() {
if (!plugin.getFactory().hasCustomDatabaseBridge()) {
SQLDatabaseInitializer.getInstance().close();
for (DatabaseLoader databaseLoader : databaseLoaders) {
try {
databaseLoader.setState(DatabaseLoader.State.SHUTDOWN);
} catch (Throwable ignored) {
}
}
}

private void loadDatabaseLoaders() {
DatabaseLoader_V1.register(this);
addDatabaseLoader(new CopyOldDatabase());
addDatabaseLoader(new DatabaseLoader_V1());
addDatabaseLoader(new SQLDatabaseLoader());
}

private void loadPlayers() {
Expand Down Expand Up @@ -193,4 +176,27 @@ private void loadGrid() {
SuperiorSkyblockPlugin.log("Finished grid!");
}

private void runState(DatabaseLoader.State state) throws ManagerLoadException {
for (DatabaseLoader databaseLoader : databaseLoaders) {
databaseLoader.setState(state);
}
}

private class CopyOldDatabase implements DatabaseLoader {

@Override
public void setState(State state) throws ManagerLoadException {
if (state == State.INITIALIZE) {
File oldDataFile = new File(plugin.getDataFolder(), "database.db");
if (oldDataFile.exists()) {
File newDataFile = new File(plugin.getDataFolder(), "datastore/database.db");
newDataFile.getParentFile().mkdirs();
if (!oldDataFile.renameTo(newDataFile))
throw new ManagerLoadException("Failed to move old database file", ManagerLoadException.ErrorLevel.SERVER_SHUTDOWN);
}
}

}
}

}
@@ -1,9 +1,19 @@
package com.bgsoftware.superiorskyblock.core.database.loader;

import com.bgsoftware.superiorskyblock.core.errors.ManagerLoadException;

public interface DatabaseLoader {

void loadData();
void setState(State state) throws ManagerLoadException;

enum State {

INITIALIZE,
POST_INITIALIZE,
PRE_LOAD_DATA,
POST_LOAD_DATA,
SHUTDOWN

void saveData();
}

}
@@ -0,0 +1,50 @@
package com.bgsoftware.superiorskyblock.core.database.loader;

import com.bgsoftware.superiorskyblock.core.errors.ManagerLoadException;

import java.util.Collections;
import java.util.EnumMap;
import java.util.Map;

public abstract class MachineStateDatabaseLoader implements DatabaseLoader {

private final Map<State, StateAction> STATE_MACHINE_HANDLES = Collections.unmodifiableMap(new EnumMap<State, StateAction>(State.class) {{
put(State.INITIALIZE, MachineStateDatabaseLoader.this::handleInitialize);
put(State.POST_INITIALIZE, MachineStateDatabaseLoader.this::handlePostInitialize);
put(State.PRE_LOAD_DATA, MachineStateDatabaseLoader.this::handlePreLoadData);
put(State.POST_LOAD_DATA, MachineStateDatabaseLoader.this::handlePostLoadData);
put(State.SHUTDOWN, MachineStateDatabaseLoader.this::handleShutdown);
}});

@Override
public void setState(State state) throws ManagerLoadException {
StateAction action = STATE_MACHINE_HANDLES.get(state);
if (action != null) {
try {
action.run();
} catch (Throwable error) {
if (error instanceof ManagerLoadException)
throw error;

throw new ManagerLoadException(error, ManagerLoadException.ErrorLevel.SERVER_SHUTDOWN);
}
}
}

protected abstract void handleInitialize() throws ManagerLoadException;

protected abstract void handlePostInitialize() throws ManagerLoadException;

protected abstract void handlePreLoadData() throws ManagerLoadException;

protected abstract void handlePostLoadData() throws ManagerLoadException;

protected abstract void handleShutdown() throws ManagerLoadException;

private interface StateAction {

void run() throws ManagerLoadException;

}

}
@@ -1,26 +1,26 @@
package com.bgsoftware.superiorskyblock.core.database.sql;
package com.bgsoftware.superiorskyblock.core.database.loader.sql;

import com.bgsoftware.superiorskyblock.SuperiorSkyblockPlugin;
import com.bgsoftware.superiorskyblock.api.objects.Pair;
import com.bgsoftware.superiorskyblock.core.database.bridge.GridDatabaseBridge;
import com.bgsoftware.superiorskyblock.core.database.loader.MachineStateDatabaseLoader;
import com.bgsoftware.superiorskyblock.core.database.sql.SQLHelper;
import com.bgsoftware.superiorskyblock.core.database.sql.session.QueryResult;
import com.bgsoftware.superiorskyblock.core.errors.ManagerLoadException;

import java.sql.ResultSet;

public class SQLDatabaseInitializer {
public class SQLDatabaseLoader extends MachineStateDatabaseLoader {

private static final SQLDatabaseInitializer instance = new SQLDatabaseInitializer();
private static final SuperiorSkyblockPlugin plugin = SuperiorSkyblockPlugin.getPlugin();

private SQLDatabaseInitializer() {

}

public static SQLDatabaseInitializer getInstance() {
return instance;
@Override
public void setState(State state) throws ManagerLoadException {
if (!plugin.getFactory().hasCustomDatabaseBridge())
super.setState(state);
}

public void init(SuperiorSkyblockPlugin plugin) throws ManagerLoadException {
protected void handleInitialize() throws ManagerLoadException {
if (!SQLHelper.createConnection(plugin)) {
throw new ManagerLoadException("Couldn't connect to the database.\nMake sure all information is correct.",
ManagerLoadException.ErrorLevel.SERVER_SHUTDOWN);
Expand All @@ -36,7 +36,8 @@ public void init(SuperiorSkyblockPlugin plugin) throws ManagerLoadException {
.onFail(error -> GridDatabaseBridge.insertGrid(plugin.getGrid())));
}

public void createIndexes() {
@Override
protected void handlePostInitialize() {
SQLHelper.createIndex("islands_bans_index", "islands_bans",
"island", "player");

Expand Down Expand Up @@ -98,7 +99,18 @@ public void createIndexes() {
"player", "name");
}

public void close() {
@Override
protected void handlePreLoadData() {
SQLHelper.setJournalMode("MEMORY", QueryResult.EMPTY_QUERY_RESULT);
}

@Override
protected void handlePostLoadData() {
SQLHelper.setJournalMode("DELETE", QueryResult.EMPTY_QUERY_RESULT);
}

@Override
protected void handleShutdown() {
SQLHelper.close();
}

Expand Down
Expand Up @@ -9,8 +9,7 @@
import com.bgsoftware.superiorskyblock.api.key.KeyMap;
import com.bgsoftware.superiorskyblock.api.objects.Pair;
import com.bgsoftware.superiorskyblock.core.Text;
import com.bgsoftware.superiorskyblock.core.database.DataManager;
import com.bgsoftware.superiorskyblock.core.database.loader.DatabaseLoader;
import com.bgsoftware.superiorskyblock.core.database.loader.MachineStateDatabaseLoader;
import com.bgsoftware.superiorskyblock.core.database.loader.v1.attributes.BankTransactionsAttributes;
import com.bgsoftware.superiorskyblock.core.database.loader.v1.attributes.GridAttributes;
import com.bgsoftware.superiorskyblock.core.database.loader.v1.attributes.IslandAttributes;
Expand All @@ -30,6 +29,7 @@
import com.bgsoftware.superiorskyblock.core.database.sql.session.QueryResult;
import com.bgsoftware.superiorskyblock.core.database.sql.session.SQLSession;
import com.bgsoftware.superiorskyblock.core.database.sql.session.impl.SQLiteSession;
import com.bgsoftware.superiorskyblock.core.errors.ManagerLoadException;
import com.bgsoftware.superiorskyblock.island.privilege.PlayerPrivilegeNode;
import com.bgsoftware.superiorskyblock.island.role.SPlayerRole;
import org.bukkit.World;
Expand All @@ -45,7 +45,7 @@
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.BiConsumer;

public class DatabaseLoader_V1 implements DatabaseLoader {
public class DatabaseLoader_V1 extends MachineStateDatabaseLoader {

private static final SuperiorSkyblockPlugin plugin = SuperiorSkyblockPlugin.getPlugin();
private static final UUID CONSOLE_UUID = new UUID(0, 0);
Expand All @@ -65,13 +65,19 @@ public class DatabaseLoader_V1 implements DatabaseLoader {
);
private GridAttributes gridAttributes;

public static void register(DataManager dataHandler) {
if (isDatabaseOldFormat())
dataHandler.addDatabaseLoader(new DatabaseLoader_V1());
private boolean isOldDatabaseFormat;

@Override
public void setState(State state) throws ManagerLoadException {
if (state == State.INITIALIZE)
isOldDatabaseFormat = isDatabaseOldFormat();

if (isOldDatabaseFormat)
super.setState(state);
}

@Override
public void loadData() {
protected void handleInitialize() {
SuperiorSkyblockPlugin.log("&a[Database-Converter] Detected old database - starting to convert data...");

session.select("players", "", new QueryResult<ResultSet>().onSuccess(resultSet -> {
Expand Down Expand Up @@ -174,14 +180,29 @@ public void loadData() {
}

@Override
public void saveData() {
protected void handlePostInitialize() {
savePlayers();
saveIslands();
saveStackedBlocks();
saveBankTransactions();
saveGrid();
}

@Override
protected void handlePreLoadData() {
// Do nothing.
}

@Override
protected void handlePostLoadData() {
// Do nothing.
}

@Override
protected void handleShutdown() {
// Do nothing.
}

private static boolean isDatabaseOldFormat() {
isRemoteDatabase = isRemoteDatabase();

Expand Down
Expand Up @@ -37,12 +37,6 @@ public void setLogging(boolean logging) {
this.logging = logging;
}

private void moveOldDatabaseFile(File newDataFile) {
File oldDataFile = new File(plugin.getDataFolder(), "database.db");
if (oldDataFile.exists())
oldDataFile.renameTo(newDataFile);
}

@Override
public boolean createConnection() {
log("Trying to connect to local database (SQLite)...");
Expand All @@ -51,7 +45,6 @@ public boolean createConnection() {

if (!file.exists()) {
file.getParentFile().mkdirs();
moveOldDatabaseFile(file);
try {
if (!file.createNewFile()) {
log("&cFailed to create database file.");
Expand Down

0 comments on commit 1cb1a25

Please sign in to comment.