9
0
mirror of https://github.com/WiIIiam278/HuskSync.git synced 2025-12-30 20:29:28 +00:00

Implement data rollbacks and deletion

This commit is contained in:
William
2022-07-08 16:05:12 +01:00
parent b7709f2d6c
commit f650db4438
10 changed files with 212 additions and 56 deletions

View File

@@ -169,12 +169,30 @@ public abstract class Database {
public abstract CompletableFuture<List<VersionedUserData>> getUserData(@NotNull User user);
/**
* <b>(Internal)</b> Prune user data records for a given user to the maximum value as configured
* Gets a specific {@link VersionedUserData} entry for a user from the database, by its UUID.
*
* @param user The user to get data for
* @param versionUuid The UUID of the {@link VersionedUserData} entry to get
* @return A future returning an optional containing the {@link VersionedUserData}, if it exists, or an empty optional if it does not
*/
public abstract CompletableFuture<Optional<VersionedUserData>> getUserData(@NotNull User user, @NotNull UUID versionUuid);
/**
* <b>(Internal)</b> Prune user data for a given user to the maximum value as configured
*
* @param user The user to prune data for
* @return A future returning void when complete
*/
protected abstract CompletableFuture<Void> pruneUserDataRecords(@NotNull User user);
protected abstract CompletableFuture<Void> pruneUserData(@NotNull User user);
/**
* Deletes a specific {@link VersionedUserData} entry for a user from the database, by its UUID.
*
* @param user The user to get data for
* @param versionUuid The UUID of the {@link VersionedUserData} entry to delete
* @return A future returning void when complete
*/
public abstract CompletableFuture<Boolean> deleteUserData(@NotNull User user, @NotNull UUID versionUuid);
/**
* Save user data to the database<p>

View File

@@ -268,7 +268,38 @@ public class MySqlDatabase extends Database {
}
@Override
protected CompletableFuture<Void> pruneUserDataRecords(@NotNull User user) {
public CompletableFuture<Optional<VersionedUserData>> getUserData(@NotNull User user, @NotNull UUID versionUuid) {
return CompletableFuture.supplyAsync(() -> {
try (Connection connection = getConnection()) {
try (PreparedStatement statement = connection.prepareStatement(formatStatementTables("""
SELECT `version_uuid`, `timestamp`, `save_cause`, `data`
FROM `%data_table%`
WHERE `player_uuid`=? AND `version_uuid`=?
ORDER BY `timestamp` DESC
LIMIT 1;"""))) {
statement.setString(1, user.uuid.toString());
statement.setString(2, versionUuid.toString());
final ResultSet resultSet = statement.executeQuery();
if (resultSet.next()) {
final Blob blob = resultSet.getBlob("data");
final byte[] dataByteArray = blob.getBytes(1, (int) blob.length());
blob.free();
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)));
}
}
} catch (SQLException | DataAdaptionException e) {
getLogger().log(Level.SEVERE, "Failed to fetch specific user data by UUID from the database", e);
}
return Optional.empty();
});
}
@Override
protected CompletableFuture<Void> pruneUserData(@NotNull User user) {
return CompletableFuture.runAsync(() -> getUserData(user).thenAccept(data -> {
if (data.size() > maxUserDataRecords) {
try (Connection connection = getConnection()) {
@@ -288,6 +319,25 @@ public class MySqlDatabase extends Database {
}));
}
@Override
public CompletableFuture<Boolean> deleteUserData(@NotNull User user, @NotNull UUID versionUuid) {
return CompletableFuture.supplyAsync(() -> {
try (Connection connection = getConnection()) {
try (PreparedStatement statement = connection.prepareStatement(formatStatementTables("""
DELETE FROM `%data_table%`
WHERE `player_uuid`=? AND `version_uuid`=?
LIMIT 1;"""))) {
statement.setString(1, user.uuid.toString());
statement.setString(2, versionUuid.toString());
return statement.executeUpdate() > 0;
}
} catch (SQLException e) {
getLogger().log(Level.SEVERE, "Failed to delete specific user data from the database", e);
}
return false;
});
}
@Override
public CompletableFuture<Void> setUserData(@NotNull User user, @NotNull UserData userData,
@NotNull DataSaveCause saveCause) {
@@ -311,7 +361,7 @@ public class MySqlDatabase extends Database {
getLogger().log(Level.SEVERE, "Failed to set user data in the database", e);
}
}
}).thenRun(() -> pruneUserDataRecords(user).join());
}).thenRun(() -> pruneUserData(user).join());
}
@Override