Skip to content

Commit

Permalink
Fixed MySQL bugs
Browse files Browse the repository at this point in the history
  • Loading branch information
Despical committed Aug 16, 2023
1 parent 6038cca commit bce3bc7
Show file tree
Hide file tree
Showing 4 changed files with 34 additions and 44 deletions.
17 changes: 9 additions & 8 deletions src/main/java/me/despical/kotl/Main.java
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,8 @@ public void onDisable() {
private void initializeClasses() {
this.setupConfigurationFiles();

configPreferences = new ConfigPreferences(this);
if ((configPreferences = new ConfigPreferences(this)).getOption(ConfigPreferences.Option.DATABASE_ENABLED)) database = new MysqlDatabase(this, "mysql");

chatManager = new ChatManager(this);
languageManager = new LanguageManager(this);
userManager = new UserManager(this);
Expand All @@ -113,14 +114,13 @@ private void initializeClasses() {
rewardsFactory = new RewardsFactory(this);
arenaRegistry = new ArenaRegistry(this);

if (configPreferences.getOption(ConfigPreferences.Option.DATABASE_ENABLED)) database = new MysqlDatabase(this, "mysql");
if (chatManager.isPapiEnabled()) new PlaceholderManager(this);

ListenerAdapter.registerEvents(this);
AbstractCommand.registerCommands(this);
ScoreboardLib.setPluginInstance(this);
User.cooldownHandlerTask();

if (chatManager.isPapiEnabled()) new PlaceholderManager(this);

final var metrics = new Metrics(this, 7938);
metrics.addCustomChart(new SimplePie("locale_used", () -> languageManager.getPluginLocale().prefix()));
metrics.addCustomChart(new SimplePie("database_enabled", () -> configPreferences.getOption(ConfigPreferences.Option.DATABASE_ENABLED) ? "Enabled" : "Disabled"));
Expand Down Expand Up @@ -188,7 +188,7 @@ private void saveAllUserStatistics() {
for (final var player : getServer().getOnlinePlayers()) {
final var user = userManager.getUser(player);

if (userManager.getDatabase() instanceof MysqlManager mysqlDatabase) {
if (userManager.getDatabase() instanceof MysqlManager mysqlManager) {
final var update = new StringBuilder(" SET ");

for (final var stat : StatsStorage.StatisticType.values()) {
Expand All @@ -198,14 +198,15 @@ private void saveAllUserStatistics() {
final var statName = stat.getName();

if (update.toString().equalsIgnoreCase(" SET ")) {
update.append(statName).append("'='").append(val);
update.append(statName).append("=").append(val);
}

update.append(", ").append(statName).append("'='").append(val);
update.append(", ").append(statName).append("=").append(val);
}

final var finalUpdate = update.toString();
mysqlDatabase.getDatabase().executeUpdate("UPDATE playerstats" + finalUpdate + " WHERE UUID='" + user.getUniqueId().toString() + "';");

mysqlManager.getDatabase().executeUpdate("UPDATE %s%s WHERE UUID='%s';".formatted(mysqlManager.getTable(), finalUpdate, user.getUniqueId().toString()));
continue;
}

Expand Down
5 changes: 3 additions & 2 deletions src/main/java/me/despical/kotl/api/StatsStorage.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import me.despical.commons.sorter.SortUtils;
import me.despical.kotl.ConfigPreferences;
import me.despical.kotl.Main;
import me.despical.kotl.user.data.MysqlManager;
import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin;
import org.jetbrains.annotations.NotNull;
Expand All @@ -46,10 +47,10 @@ public class StatsStorage {

@NotNull
public static Map<UUID, Integer> getStats(StatisticType stat) {
if (plugin.getConfigPreferences().getOption(ConfigPreferences.Option.DATABASE_ENABLED)) {
if (plugin.getUserManager().getDatabase() instanceof MysqlManager mysqlManager) {
try (Connection connection = plugin.getMysqlDatabase().getConnection()) {
final Statement statement = connection.createStatement();
final ResultSet set = statement.executeQuery("SELECT UUID, " + stat.name + " FROM playerstats ORDER BY " + stat.name);
final ResultSet set = statement.executeQuery("SELECT UUID, %s FROM %s ORDER BY %s".formatted(stat.name, mysqlManager.getTable(), stat.name));

final var column = new LinkedHashMap<UUID, Integer>();

Expand Down
51 changes: 18 additions & 33 deletions src/main/java/me/despical/kotl/user/data/MysqlManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@

package me.despical.kotl.user.data;

import me.despical.commons.configuration.ConfigUtils;
import me.despical.commons.database.MysqlDatabase;
import me.despical.kotl.Main;
import me.despical.kotl.api.StatsStorage;
Expand All @@ -33,40 +34,38 @@
*/
public non-sealed class MysqlManager extends IUserDatabase {

private final String table;

private MysqlDatabase database;

public MysqlManager(Main plugin) {
super(plugin);
this.table = ConfigUtils.getConfig(plugin, "mysql").getString("table", "kotl_stats");

plugin.getServer().getScheduler().runTaskAsynchronously(plugin, () -> {
this.database = plugin.getMysqlDatabase();

this.checkInitializedAndSleep();

try (final var connection = database.getConnection()) {
final var statement = connection.createStatement();

statement.executeUpdate("""
CREATE TABLE IF NOT EXISTS `playerstats` (
`UUID` char(36) NOT NULL PRIMARY KEY,
`name` varchar(32) NOT NULL,
`score` int(11) NOT NULL DEFAULT '0',
`toursplayed` int(11) NOT NULL DEFAULT '0'
);""");
CREATE TABLE IF NOT EXISTS `%s` (
`UUID` char(36) NOT NULL PRIMARY KEY,
`name` varchar(32) NOT NULL,
`toursplayed` int(11) NOT NULL DEFAULT '0',
`score` int(11) NOT NULL DEFAULT '0'
);""".formatted(table));
} catch (SQLException exception) {
exception.printStackTrace();

plugin.getLogger().severe("Cannot save contents to MySQL database!");
plugin.getLogger().severe("Couldn't create statistics table on MySQL database!");
}
});
}

@Override
public void saveStatistic(@NotNull User user, StatsStorage.StatisticType stat) {
plugin.getServer().getScheduler().runTaskAsynchronously(plugin, () -> {
this.checkInitializedAndSleep();

database.executeUpdate("UPDATE playerstats SET " + stat.getName() + "=" + user.getStat(stat)+ " WHERE UUID='" + user.getUniqueId().toString() + "';");
});
plugin.getServer().getScheduler().runTaskAsynchronously(plugin, () -> database.executeUpdate("UPDATE %s SET %s=%d WHERE UUID='%s';".formatted(table, stat.getName(), user.getStat(stat), user.getUniqueId().toString())));
}

@Override
Expand All @@ -88,23 +87,17 @@ public void saveStatistics(@NotNull User user) {

final var finalUpdate = update.toString();

plugin.getServer().getScheduler().runTaskAsynchronously(plugin, () -> {
this.checkInitializedAndSleep();

database.executeUpdate("UPDATE playerstats" + finalUpdate + " WHERE UUID='" + user.getUniqueId().toString() + "';");
});
plugin.getServer().getScheduler().runTaskAsynchronously(plugin, () -> database.executeUpdate("UPDATE %s%s WHERE UUID='%s';".formatted(table, finalUpdate, user.getUniqueId().toString())));
}

@Override
public void loadStatistics(@NotNull User user) {
final String uuid = user.getUniqueId().toString(), name = user.getPlayer().getName();

plugin.getServer().getScheduler().runTaskAsynchronously(plugin, () -> {
this.checkInitializedAndSleep();

try (final var connection = database.getConnection()) {
final var statement = connection.createStatement();
final var rs = statement.executeQuery("SELECT * from playerstats WHERE UUID='%s';".formatted(uuid));
final var rs = statement.executeQuery("SELECT * from %s WHERE UUID='%s';".formatted(table, uuid));

if (rs.next()) {
for (StatsStorage.StatisticType stat : StatsStorage.StatisticType.values()) {
Expand All @@ -113,7 +106,7 @@ public void loadStatistics(@NotNull User user) {
user.setStat(stat, rs.getInt(stat.getName()));
}
} else {
statement.executeUpdate("INSERT INTO playerstats (UUID,name) VALUES ('%s','%s');".formatted(uuid, name));
statement.executeUpdate("INSERT INTO %s (UUID,name) VALUES ('%s','%s');".formatted(table, uuid, name));

for (final var stat : StatsStorage.StatisticType.values()) {
if (!stat.isPersistent()) continue;
Expand All @@ -132,15 +125,7 @@ public MysqlDatabase getDatabase() {
return database;
}

private void checkInitializedAndSleep() {
try {
if (plugin.getMysqlDatabase() == null || this.database == null) {
Thread.sleep(5000L);

if (plugin.getMysqlDatabase() != null) this.database = plugin.getMysqlDatabase();
}
} catch (InterruptedException exception) {
throw new RuntimeException(exception);
}
public String getTable() {
return table;
}
}
5 changes: 4 additions & 1 deletion src/main/resources/mysql.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,7 @@ address: jdbc:mysql://localhost:3306/<databaseName>?useSSL=false&autoReConnect=t
user: <user>

# Replace <password> with your MySQL password.
password: <password>
password: <password>

# MySQL table name.
table: kotl_stats

0 comments on commit bce3bc7

Please sign in to comment.