Version data via the database implementation

feat/data-edit-commands
William 3 years ago
parent d78dd42b72
commit f2d4bec138

@ -15,13 +15,14 @@ import java.util.UUID;
public record VersionedUserData(@NotNull UUID versionUUID, @NotNull Date versionTimestamp,
@NotNull UserData userData) implements Comparable<VersionedUserData> {
public VersionedUserData(@NotNull final UUID versionUUID, @NotNull final Date versionTimestamp,
@NotNull UserData userData) {
this.versionUUID = versionUUID;
this.versionTimestamp = versionTimestamp;
this.userData = userData;
}
/**
* Version {@link UserData} into a {@link VersionedUserData}, assigning it a random {@link UUID} and the current timestamp {@link Date}
*
* @param userData The {@link UserData} to version
* @return A new {@link VersionedUserData}
* @implNote This isn't used to version data that is going to be set to a database to prevent UUID collisions.<p>
* Database implementations should instead use their own UUID generation functions.
*/
public static VersionedUserData version(@NotNull UserData userData) {
return new VersionedUserData(UUID.randomUUID(), new Date(), userData);
}

@ -135,7 +135,7 @@ public abstract class Database {
public abstract CompletableFuture<List<VersionedUserData>> getUserData(@NotNull User user);
/**
* Prune user data records for a given user to the maximum value as configured
* <b>(Internal)</b> Prune user data records 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
@ -147,10 +147,11 @@ public abstract class Database {
* 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
* @param userData The uniquely versioned data to add as a {@link VersionedUserData}
* @param userData The {@link UserData} to set. The implementation should version it with a random UUID and the current timestamp during insertion.
* @return A future returning void when complete
* @see VersionedUserData#version(UserData)
*/
public abstract CompletableFuture<Void> setUserData(@NotNull User user, @NotNull VersionedUserData userData);
public abstract CompletableFuture<Void> setUserData(@NotNull User user, @NotNull UserData userData);
/**
* Close the database connection

@ -289,18 +289,16 @@ public class MySqlDatabase extends Database {
}
@Override
public CompletableFuture<Void> setUserData(@NotNull User user, @NotNull VersionedUserData userData) {
public CompletableFuture<Void> setUserData(@NotNull User user, @NotNull UserData userData) {
return CompletableFuture.runAsync(() -> {
try (Connection connection = getConnection()) {
try (PreparedStatement statement = connection.prepareStatement(formatStatementTables("""
INSERT INTO `%data_table%`
(`player_uuid`,`version_uuid`,`timestamp`,`data`)
VALUES (?,?,?,?);"""))) {
VALUES (?,UUID(),NOW(),?);"""))) {
statement.setString(1, user.uuid.toString());
statement.setString(2, userData.versionUUID().toString());
statement.setTimestamp(3, Timestamp.from(userData.versionTimestamp().toInstant()));
statement.setBlob(4, new ByteArrayInputStream(Snappy
.compress(userData.userData().toJson().getBytes(StandardCharsets.UTF_8))));
statement.setBlob(2, new ByteArrayInputStream(Snappy
.compress(userData.toJson().getBytes(StandardCharsets.UTF_8))));
statement.executeUpdate();
}
} catch (SQLException | IOException e) {

@ -89,7 +89,7 @@ public abstract class EventListener {
return;
}
huskSync.getRedisManager().setUserServerSwitch(user).thenRun(() -> user.getUserData().thenAccept(
userData -> huskSync.getRedisManager().setUserData(user, userData.userData()).thenRun(
userData -> huskSync.getRedisManager().setUserData(user, userData).thenRun(
() -> huskSync.getDatabase().setUserData(user, userData).join())));
}

@ -241,11 +241,11 @@ public abstract class OnlineUser extends User {
*
* @return the player's current {@link UserData}
*/
public final CompletableFuture<VersionedUserData> getUserData() {
public final CompletableFuture<UserData> getUserData() {
return CompletableFuture.supplyAsync(
() -> VersionedUserData.version(new UserData(getStatus().join(), getInventory().join(),
() -> new UserData(getStatus().join(), getInventory().join(),
getEnderChest().join(), getPotionEffects().join(), getAdvancements().join(),
getStatistics().join(), getLocation().join(), getPersistentDataContainer().join())));
getStatistics().join(), getLocation().join(), getPersistentDataContainer().join()));
}
}

Loading…
Cancel
Save