9
0
mirror of https://github.com/WiIIiam278/HuskSync.git synced 2025-12-31 12:46:51 +00:00

Events & API work, save DataSaveCauses as part of versioning

This commit is contained in:
William
2022-07-07 01:52:19 +01:00
parent fd08a3e7d0
commit 1c9d74f925
48 changed files with 1477 additions and 340 deletions

View File

@@ -1,8 +1,10 @@
package net.william278.husksync.database;
import net.william278.husksync.data.DataAdapter;
import net.william278.husksync.data.DataSaveCause;
import net.william278.husksync.data.UserData;
import net.william278.husksync.data.VersionedUserData;
import net.william278.husksync.event.EventCannon;
import net.william278.husksync.player.User;
import net.william278.husksync.util.Logger;
import net.william278.husksync.util.ResourceReader;
@@ -51,6 +53,20 @@ public abstract class Database {
return dataAdapter;
}
/**
* {@link EventCannon} implementation used for firing events
*/
private final EventCannon eventCannon;
/**
* Returns the {@link EventCannon} used to fire events
*
* @return instance of the {@link EventCannon} implementation
*/
protected EventCannon getEventCannon() {
return eventCannon;
}
/**
* Logger instance used for database error logging
*/
@@ -71,12 +87,14 @@ public abstract class Database {
private final ResourceReader resourceReader;
protected Database(@NotNull String playerTableName, @NotNull String dataTableName, final int maxUserDataRecords,
@NotNull ResourceReader resourceReader, @NotNull DataAdapter dataAdapter, @NotNull Logger logger) {
@NotNull ResourceReader resourceReader, @NotNull DataAdapter dataAdapter,
@NotNull EventCannon eventCannon, @NotNull Logger logger) {
this.playerTableName = playerTableName;
this.dataTableName = dataTableName;
this.maxUserDataRecords = maxUserDataRecords;
this.resourceReader = resourceReader;
this.dataAdapter = dataAdapter;
this.eventCannon = eventCannon;
this.logger = logger;
}
@@ -159,7 +177,7 @@ public abstract class Database {
protected abstract CompletableFuture<Void> pruneUserDataRecords(@NotNull User user);
/**
* Add user data to the database<p>
* Save user data to the database<p>
* This will remove the oldest data for the user if the amount of data exceeds the limit as configured
*
* @param user The user to add data for
@@ -167,7 +185,7 @@ public abstract class Database {
* @return A future returning void when complete
* @see VersionedUserData#version(UserData)
*/
public abstract CompletableFuture<Void> setUserData(@NotNull User user, @NotNull UserData userData);
public abstract CompletableFuture<Void> setUserData(@NotNull User user, @NotNull UserData userData, @NotNull DataSaveCause dataSaveCause);
/**
* Close the database connection

View File

@@ -2,19 +2,16 @@ package net.william278.husksync.database;
import com.zaxxer.hikari.HikariDataSource;
import net.william278.husksync.config.Settings;
import net.william278.husksync.data.DataAdapter;
import net.william278.husksync.data.DataAdaptionException;
import net.william278.husksync.data.UserData;
import net.william278.husksync.data.VersionedUserData;
import net.william278.husksync.data.*;
import net.william278.husksync.event.DataSaveEvent;
import net.william278.husksync.event.EventCannon;
import net.william278.husksync.player.User;
import net.william278.husksync.util.Logger;
import net.william278.husksync.util.ResourceReader;
import org.jetbrains.annotations.NotNull;
import org.xerial.snappy.Snappy;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.sql.*;
import java.util.*;
import java.util.Date;
@@ -55,11 +52,11 @@ public class MySqlDatabase extends Database {
private HikariDataSource connectionPool;
public MySqlDatabase(@NotNull Settings settings, @NotNull ResourceReader resourceReader, @NotNull Logger logger,
@NotNull DataAdapter dataAdapter) {
@NotNull DataAdapter dataAdapter, @NotNull EventCannon eventCannon) {
super(settings.getStringValue(Settings.ConfigOption.DATABASE_PLAYERS_TABLE_NAME),
settings.getStringValue(Settings.ConfigOption.DATABASE_DATA_TABLE_NAME),
settings.getIntegerValue(Settings.ConfigOption.SYNCHRONIZATION_MAX_USER_DATA_RECORDS),
resourceReader, dataAdapter, logger);
resourceReader, dataAdapter, eventCannon, logger);
this.mySqlHost = settings.getStringValue(Settings.ConfigOption.DATABASE_HOST);
this.mySqlPort = settings.getIntegerValue(Settings.ConfigOption.DATABASE_PORT);
this.mySqlDatabaseName = settings.getStringValue(Settings.ConfigOption.DATABASE_NAME);
@@ -213,7 +210,7 @@ public class MySqlDatabase extends Database {
return CompletableFuture.supplyAsync(() -> {
try (Connection connection = getConnection()) {
try (PreparedStatement statement = connection.prepareStatement(formatStatementTables("""
SELECT `version_uuid`, `timestamp`, `data`
SELECT `version_uuid`, `timestamp`, `save_cause`, `data`
FROM `%data_table%`
WHERE `player_uuid`=?
ORDER BY `timestamp` DESC
@@ -227,6 +224,7 @@ public class MySqlDatabase extends Database {
return Optional.of(new VersionedUserData(
UUID.fromString(resultSet.getString("version_uuid")),
Date.from(resultSet.getTimestamp("timestamp").toInstant()),
DataSaveCause.getCauseByName(resultSet.getString("save_cause")),
getDataAdapter().fromBytes(dataByteArray)));
}
}
@@ -243,7 +241,7 @@ public class MySqlDatabase extends Database {
final List<VersionedUserData> retrievedData = new ArrayList<>();
try (Connection connection = getConnection()) {
try (PreparedStatement statement = connection.prepareStatement(formatStatementTables("""
SELECT `version_uuid`, `timestamp`, `data`
SELECT `version_uuid`, `timestamp`, `save_cause`, `data`
FROM `%data_table%`
WHERE `player_uuid`=?
ORDER BY `timestamp` DESC;"""))) {
@@ -256,6 +254,7 @@ public class MySqlDatabase extends Database {
final VersionedUserData data = new VersionedUserData(
UUID.fromString(resultSet.getString("version_uuid")),
Date.from(resultSet.getTimestamp("timestamp").toInstant()),
DataSaveCause.getCauseByName(resultSet.getString("save_cause")),
getDataAdapter().fromBytes(dataByteArray));
retrievedData.add(data);
}
@@ -290,20 +289,27 @@ public class MySqlDatabase extends Database {
}
@Override
public CompletableFuture<Void> setUserData(@NotNull User user, @NotNull UserData userData) {
public CompletableFuture<Void> setUserData(@NotNull User user, @NotNull UserData userData,
@NotNull DataSaveCause saveCause) {
return CompletableFuture.runAsync(() -> {
try (Connection connection = getConnection()) {
try (PreparedStatement statement = connection.prepareStatement(formatStatementTables("""
INSERT INTO `%data_table%`
(`player_uuid`,`version_uuid`,`timestamp`,`data`)
VALUES (?,UUID(),NOW(),?);"""))) {
statement.setString(1, user.uuid.toString());
statement.setBlob(2, new ByteArrayInputStream(
getDataAdapter().toBytes(userData)));
statement.executeUpdate();
final DataSaveEvent dataSaveEvent = (DataSaveEvent) getEventCannon().fireDataSaveEvent(user,
userData, saveCause).join();
if (!dataSaveEvent.isCancelled()) {
final UserData finalData = dataSaveEvent.getUserData();
try (Connection connection = getConnection()) {
try (PreparedStatement statement = connection.prepareStatement(formatStatementTables("""
INSERT INTO `%data_table%`
(`player_uuid`,`version_uuid`,`timestamp`,`save_cause`,`data`)
VALUES (?,UUID(),NOW(),?,?);"""))) {
statement.setString(1, user.uuid.toString());
statement.setString(2, saveCause.name());
statement.setBlob(3, new ByteArrayInputStream(
getDataAdapter().toBytes(finalData)));
statement.executeUpdate();
}
} catch (SQLException | DataAdaptionException e) {
getLogger().log(Level.SEVERE, "Failed to set user data in the database", e);
}
} catch (SQLException | DataAdaptionException e) {
getLogger().log(Level.SEVERE, "Failed to set user data in the database", e);
}
}).thenRun(() -> pruneUserDataRecords(user).join());
}