Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
169 changes: 69 additions & 100 deletions src/main/java/com/github/elic0de/thejpspit/database/MySqlDatabase.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,19 +7,15 @@
import com.github.elic0de.thejpspit.player.PitPlayer;
import com.github.elic0de.thejpspit.player.Preferences;
import com.zaxxer.hikari.HikariDataSource;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;

import java.nio.charset.StandardCharsets;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.*;
import java.util.Optional;
import java.util.Properties;
import java.util.UUID;
import java.util.concurrent.CompletableFuture;
import java.util.logging.Level;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;

public class MySqlDatabase extends Database {

Expand All @@ -41,8 +37,7 @@ private void setConnection() {
final Settings settings = plugin.getSettings();

// Create jdbc driver connection url
final String jdbcUrl = "jdbc:mysql://" + settings.getMySqlHost() + ":" + settings.getMySqlPort() + "/"
+ settings.getMySqlDatabase() + settings.getMySqlConnectionParameters();
final String jdbcUrl = "jdbc:mysql://" + settings.getMySqlHost() + ":" + settings.getMySqlPort() + "/" + settings.getMySqlDatabase() + settings.getMySqlConnectionParameters();
dataSource = new HikariDataSource();
dataSource.setJdbcUrl(jdbcUrl);

Expand Down Expand Up @@ -104,45 +99,38 @@ public Optional<PitPlayer> getPitPlayer(Player player) {

@Override
public Optional<PitPlayer> getPitPlayer(UUID uuid) {
try (PreparedStatement statement = getConnection().prepareStatement(
format("""
try (Connection connection = getConnection()) {
try (PreparedStatement statement = connection.prepareStatement(format("""
SELECT `kills`, `streaks`, `bestStreaks`, `deaths`, `rating`, `bestRating`, `xp`, `preferences`
FROM `%user_data%`
WHERE `uuid`=?"""))) {

statement.setString(1, uuid.toString());

final ResultSet resultSet = statement.executeQuery();
if (resultSet.next()) {
final String preferences = new String(resultSet.getBytes("preferences"), StandardCharsets.UTF_8);
return Optional.of(new PitPlayer(Bukkit.getPlayer(uuid),
resultSet.getLong("kills"),
resultSet.getLong("streaks"),
resultSet.getLong("bestStreaks"),
resultSet.getLong("deaths"),
resultSet.getDouble("rating"),
resultSet.getDouble("bestRating"),
resultSet.getDouble("xp"),
Optional.of(plugin.getGson().fromJson(preferences, Preferences.class))
));
statement.setString(1, uuid.toString());

final ResultSet resultSet = statement.executeQuery();
if (resultSet.next()) {
final String preferences = new String(resultSet.getBytes("preferences"), StandardCharsets.UTF_8);
return Optional.of(new PitPlayer(Bukkit.getPlayer(uuid), resultSet.getLong("kills"), resultSet.getLong("streaks"), resultSet.getLong("bestStreaks"), resultSet.getLong("deaths"), resultSet.getDouble("rating"), resultSet.getDouble("bestRating"), resultSet.getDouble("xp"), Optional.of(plugin.getGson().fromJson(preferences, Preferences.class))));
}
}
} catch (SQLException e) {
Bukkit.getLogger().log(Level.SEVERE,
"Failed to fetch a player from uuid from the database", e);
Bukkit.getLogger().log(Level.SEVERE, "Failed to fetch a player from uuid from the database", e);
}
return Optional.empty();
}

@Override
public Optional<PitPreferences> getPitPreferences() {
try (PreparedStatement statement = getConnection().prepareStatement(format("""
SELECT `preferences`
FROM `%pit_data%`
"""))) {
final ResultSet resultSet = statement.executeQuery();
if (resultSet.next()) {
final String preferences = new String(resultSet.getBytes("preferences"), StandardCharsets.UTF_8);
return Optional.of(plugin.getGson().fromJson(preferences, PitPreferences.class));
try (Connection connection = getConnection()) {
try (PreparedStatement statement = connection.prepareStatement(format("""
SELECT `preferences`
FROM `%pit_data%`
"""))) {
final ResultSet resultSet = statement.executeQuery();
if (resultSet.next()) {
final String preferences = new String(resultSet.getBytes("preferences"), StandardCharsets.UTF_8);
return Optional.of(plugin.getGson().fromJson(preferences, PitPreferences.class));
}
}
} catch (SQLException e) {
Bukkit.getLogger().log(Level.SEVERE, "Failed to fetch user data from table by UUID", e);
Expand All @@ -152,46 +140,37 @@ public Optional<PitPreferences> getPitPreferences() {

@Override
public Optional<OfflinePitPlayer> getOfflinePitPlayer(UUID uuid) {
try (PreparedStatement statement = getConnection().prepareStatement(
format("""
try (Connection connection = getConnection()) {
try (PreparedStatement statement = connection.prepareStatement(format("""
SELECT `kills`, `streaks`, `bestStreaks`, `deaths`, `rating`, `bestRating`, `xp`
FROM `%user_data%`
WHERE `uuid`=?"""))) {

statement.setString(1, uuid.toString());

final ResultSet resultSet = statement.executeQuery();
if (resultSet.next()) {
return Optional.of(new OfflinePitPlayer(uuid,
resultSet.getLong("kills"),
resultSet.getLong("streaks"),
resultSet.getLong("bestStreaks"),
resultSet.getLong("deaths"),
resultSet.getDouble("rating"),
resultSet.getDouble("bestRating"),
resultSet.getDouble("xp")
));
statement.setString(1, uuid.toString());

final ResultSet resultSet = statement.executeQuery();
if (resultSet.next()) {
return Optional.of(new OfflinePitPlayer(uuid, resultSet.getLong("kills"), resultSet.getLong("streaks"), resultSet.getLong("bestStreaks"), resultSet.getLong("deaths"), resultSet.getDouble("rating"), resultSet.getDouble("bestRating"), resultSet.getDouble("xp")));
}
}
} catch (SQLException e) {
Bukkit.getLogger().log(Level.SEVERE,
"Failed to fetch a player from uuid from the database", e);
Bukkit.getLogger().log(Level.SEVERE, "Failed to fetch a player from uuid from the database", e);
}
return Optional.empty();
}

@Override
public Optional<Integer> getPlayerRanking(PitPlayer player, RankType type) {
try {
try (Connection connection = getConnection()) {
String test = """
SELECT uuid, rank
FROM(SELECT `uuid`,
RANK()
OVER(ORDER BY %type% DESC)
AS rank FROM `%user_data%`)
WHERE `uuid`=?;
""";
try (PreparedStatement statement = getConnection().prepareStatement(
format(test.replaceAll("%type%", type.name().toLowerCase())))) {
SELECT uuid, rank
FROM(SELECT `uuid`,
RANK()
OVER(ORDER BY %type% DESC)
AS rank FROM `%user_data%`)
WHERE `uuid`=?;
""";
try (PreparedStatement statement = connection.prepareStatement(format(test.replaceAll("%type%", type.name().toLowerCase())))) {
statement.setString(1, player.getUniqueId().toString());

final ResultSet resultSet = statement.executeQuery();
Expand All @@ -200,54 +179,47 @@ public Optional<Integer> getPlayerRanking(PitPlayer player, RankType type) {
}
}
} catch (SQLException e) {
Bukkit.getLogger().log(Level.SEVERE,
"Failed to fetch a player from uuid from the database", e);
}
return Optional.empty();
Bukkit.getLogger().log(Level.SEVERE, "Failed to fetch a player from uuid from the database", e);
} return Optional.empty();
}

@Override
public void createPitPlayer(Player player) {
// Insert new player data into the database
try {
try (PreparedStatement statement = getConnection().prepareStatement(
format("""
INSERT INTO `%user_data%` (`uuid`,`username`,`preferences`)
VALUES (?,?,?);"""))) {
try (Connection connection = getConnection()) {
try (PreparedStatement statement = connection.prepareStatement(format("""
INSERT INTO `%user_data%` (`uuid`,`username`,`preferences`)
VALUES (?,?,?);"""))) {

statement.setString(1, player.getUniqueId().toString());
statement.setString(2, player.getName());
statement.setBytes(3, plugin.getGson().toJson(Preferences.getDefaults()).getBytes(StandardCharsets.UTF_8));
statement.executeUpdate();
}
} catch (SQLException e) {
Bukkit.getLogger().log(Level.SEVERE,
"Failed to insert a player into the database", e);
Bukkit.getLogger().log(Level.SEVERE, "Failed to insert a player into the database", e);
}
}

@Override
public void createPitPreferences(PitPreferences pitPreferences) {
try {
try (PreparedStatement statement = getConnection().prepareStatement(
format("""
INSERT INTO `%pit_data%` (`preferences`)
VALUES (?);"""))) {
try (Connection connection = getConnection()) {
try (PreparedStatement statement = connection.prepareStatement(format("""
INSERT INTO `%pit_data%` (`preferences`)
VALUES (?);"""))) {

statement.setBytes(1, plugin.getGson().toJson(pitPreferences).getBytes(StandardCharsets.UTF_8));
statement.executeUpdate();
}
} catch (SQLException e) {
Bukkit.getLogger().log(Level.SEVERE,
"Failed to insert a player into the database", e);
Bukkit.getLogger().log(Level.SEVERE, "Failed to insert a player into the database", e);
}
}

@Override
public void updateUserData(PitPlayer player) {
try {
try (PreparedStatement statement = getConnection().prepareStatement(
format("""
try (Connection connection = getConnection()) {
try (PreparedStatement statement = connection.prepareStatement(format("""
UPDATE `%user_data%`
SET `kills`=?, `streaks`=?, `bestStreaks`=?, `deaths`=?, `rating`=?, `bestRating`=?, `xp`=?, `preferences`=?
WHERE `uuid`=?"""))) {
Expand All @@ -263,18 +235,15 @@ public void updateUserData(PitPlayer player) {
statement.setString(9, player.getUniqueId().toString());
statement.executeUpdate();
}

} catch (SQLException e) {
Bukkit.getLogger().log(Level.SEVERE,
"Failed to update user data for " + player.getName() + " on the database", e);
Bukkit.getLogger().log(Level.SEVERE, "Failed to update user data for " + player.getName() + " on the database", e);
}
}

@Override
public void updateUserData(OfflinePitPlayer player) {
try {
try (PreparedStatement statement = getConnection().prepareStatement(
format("""
try (Connection connection = getConnection()) {
try (PreparedStatement statement = connection.prepareStatement(format("""
UPDATE `%user_data%`
SET `kills`=?, `streaks`=?, `deaths`=?, `rating`=?, `xp`=?
WHERE `uuid`=?"""))) {
Expand All @@ -287,21 +256,21 @@ public void updateUserData(OfflinePitPlayer player) {
statement.setString(6, player.getUniqueId().toString());
statement.executeUpdate();
}

} catch (SQLException e) {
Bukkit.getLogger().log(Level.SEVERE,
"Failed to update user data for " + player.getUniqueId().toString() + " on the database", e);
Bukkit.getLogger().log(Level.SEVERE, "Failed to update user data for " + player.getUniqueId().toString() + " on the database", e);
}
}

@Override
public void updatePitPreferences(PitPreferences pitPreferences) {
try (PreparedStatement statement = getConnection().prepareStatement(format("""
UPDATE `%pit_data%`
SET `preferences` = ?
"""))) {
statement.setBytes(1, plugin.getGson().toJson(pitPreferences).getBytes(StandardCharsets.UTF_8));
statement.executeUpdate();
try (Connection connection = getConnection()) {
try (PreparedStatement statement = connection.prepareStatement(format("""
UPDATE `%pit_data%`
SET `preferences` = ?
"""))) {
statement.setBytes(1, plugin.getGson().toJson(pitPreferences).getBytes(StandardCharsets.UTF_8));
statement.executeUpdate();
}
} catch (SQLException e) {
Bukkit.getLogger().log(Level.SEVERE, "Failed to update preferences in table", e);
}
Expand Down