From f2d4bec138e46f9cdc95e01b55781db5becfad9b Mon Sep 17 00:00:00 2001 From: William Date: Mon, 4 Jul 2022 14:53:26 +0100 Subject: [PATCH] Version data via the database implementation --- .../husksync/data/VersionedUserData.java | 15 ++++++++------- .../william278/husksync/database/Database.java | 7 ++++--- .../husksync/database/MySqlDatabase.java | 10 ++++------ .../husksync/listener/EventListener.java | 2 +- .../william278/husksync/player/OnlineUser.java | 6 +++--- 5 files changed, 20 insertions(+), 20 deletions(-) diff --git a/common/src/main/java/net/william278/husksync/data/VersionedUserData.java b/common/src/main/java/net/william278/husksync/data/VersionedUserData.java index 2f03a564..e8da5b48 100644 --- a/common/src/main/java/net/william278/husksync/data/VersionedUserData.java +++ b/common/src/main/java/net/william278/husksync/data/VersionedUserData.java @@ -15,13 +15,14 @@ import java.util.UUID; public record VersionedUserData(@NotNull UUID versionUUID, @NotNull Date versionTimestamp, @NotNull UserData userData) implements Comparable { - 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.

+ * 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); } diff --git a/common/src/main/java/net/william278/husksync/database/Database.java b/common/src/main/java/net/william278/husksync/database/Database.java index 0fb0c374..e7bc4d2f 100644 --- a/common/src/main/java/net/william278/husksync/database/Database.java +++ b/common/src/main/java/net/william278/husksync/database/Database.java @@ -135,7 +135,7 @@ public abstract class Database { public abstract CompletableFuture> getUserData(@NotNull User user); /** - * Prune user data records for a given user to the maximum value as configured + * (Internal) 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 setUserData(@NotNull User user, @NotNull VersionedUserData userData); + public abstract CompletableFuture setUserData(@NotNull User user, @NotNull UserData userData); /** * Close the database connection diff --git a/common/src/main/java/net/william278/husksync/database/MySqlDatabase.java b/common/src/main/java/net/william278/husksync/database/MySqlDatabase.java index 3442b955..106671aa 100644 --- a/common/src/main/java/net/william278/husksync/database/MySqlDatabase.java +++ b/common/src/main/java/net/william278/husksync/database/MySqlDatabase.java @@ -289,18 +289,16 @@ public class MySqlDatabase extends Database { } @Override - public CompletableFuture setUserData(@NotNull User user, @NotNull VersionedUserData userData) { + public CompletableFuture 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) { diff --git a/common/src/main/java/net/william278/husksync/listener/EventListener.java b/common/src/main/java/net/william278/husksync/listener/EventListener.java index dba852a1..84ddea52 100644 --- a/common/src/main/java/net/william278/husksync/listener/EventListener.java +++ b/common/src/main/java/net/william278/husksync/listener/EventListener.java @@ -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()))); } diff --git a/common/src/main/java/net/william278/husksync/player/OnlineUser.java b/common/src/main/java/net/william278/husksync/player/OnlineUser.java index 1653d306..509e86c8 100644 --- a/common/src/main/java/net/william278/husksync/player/OnlineUser.java +++ b/common/src/main/java/net/william278/husksync/player/OnlineUser.java @@ -241,11 +241,11 @@ public abstract class OnlineUser extends User { * * @return the player's current {@link UserData} */ - public final CompletableFuture getUserData() { + public final CompletableFuture 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())); } }