aboutsummaryrefslogtreecommitdiffstats
path: root/src/main/java/com/leonardobishop
diff options
context:
space:
mode:
authorLMBishop <13875753+LMBishop@users.noreply.github.com>2021-06-03 18:33:45 +0100
committerLMBishop <13875753+LMBishop@users.noreply.github.com>2021-06-03 18:33:45 +0100
commite87c40a581a5dde310cba7a168e532c837f2efc6 (patch)
treef1c057463d6b7f4e566ef897ad9a261fa9070ba7 /src/main/java/com/leonardobishop
parente5a28b13be1e71eda33a1e3f5e8e56e5dad6c063 (diff)
Add types to task progress
- This restricts the possible types for task progress to int, double and float
Diffstat (limited to 'src/main/java/com/leonardobishop')
-rw-r--r--src/main/java/com/leonardobishop/quests/storage/MySqlStorageProvider.java95
1 files changed, 75 insertions, 20 deletions
diff --git a/src/main/java/com/leonardobishop/quests/storage/MySqlStorageProvider.java b/src/main/java/com/leonardobishop/quests/storage/MySqlStorageProvider.java
index 83147a19..6a69a3a9 100644
--- a/src/main/java/com/leonardobishop/quests/storage/MySqlStorageProvider.java
+++ b/src/main/java/com/leonardobishop/quests/storage/MySqlStorageProvider.java
@@ -37,17 +37,18 @@ public class MySqlStorageProvider implements StorageProvider {
" PRIMARY KEY (`id`));";
private static final String CREATE_TABLE_TASK_PROGRESS =
"CREATE TABLE IF NOT EXISTS `{prefix}task_progress` (" +
- " `id` INT NOT NULL AUTO_INCREMENT," +
- " `uuid` VARCHAR(36) NOT NULL," +
- " `quest_id` VARCHAR(50) NOT NULL," +
- " `task_id` VARCHAR(50) NOT NULL," +
- " `completed` BOOL NOT NULL," +
- " `progress` VARCHAR(64) NULL," +
+ " `id` INT NOT NULL AUTO_INCREMENT," +
+ " `uuid` VARCHAR(36) NOT NULL," +
+ " `quest_id` VARCHAR(50) NOT NULL," +
+ " `task_id` VARCHAR(50) NOT NULL," +
+ " `completed` BOOL NOT NULL," +
+ " `progress` VARCHAR(64) NULL," +
+ " `data_type` VARCHAR(10) NULL," +
" PRIMARY KEY (`id`));";
private static final String SELECT_PLAYER_QUEST_PROGRESS =
"SELECT quest_id, started, completed, completed_before, completion_date FROM `{prefix}quest_progress` WHERE uuid=?;";
private static final String SELECT_PLAYER_TASK_PROGRESS =
- "SELECT quest_id, task_id, completed, progress FROM `{prefix}task_progress` WHERE uuid=?;";
+ "SELECT quest_id, task_id, completed, progress, data_type FROM `{prefix}task_progress` WHERE uuid=?;";
private static final String SELECT_KNOWN_PLAYER_QUEST_PROGRESS =
"SELECT quest_id FROM `{prefix}quest_progress` WHERE uuid=?;";
private static final String SELECT_KNOWN_PLAYER_TASK_PROGRESS =
@@ -55,11 +56,11 @@ public class MySqlStorageProvider implements StorageProvider {
private static final String INSERT_PLAYER_QUEST_PROGRESS =
"INSERT INTO `{prefix}quest_progress` (uuid, quest_id, started, completed, completed_before, completion_date) VALUES (?,?,?,?,?,?)";
private static final String INSERT_PLAYER_TASK_PROGRESS =
- "INSERT INTO `{prefix}task_progress` (uuid, quest_id, task_id, completed, progress) VALUES (?,?,?,?,?)";
+ "INSERT INTO `{prefix}task_progress` (uuid, quest_id, task_id, completed, progress, data_type) VALUES (?,?,?,?,?,?)";
private static final String UPDATE_PLAYER_QUEST_PROGRESS =
"UPDATE `{prefix}quest_progress` SET started=?, completed=?, completed_before=?, completion_date=? WHERE uuid=? AND quest_id=?";
private static final String UPDATE_PLAYER_TASK_PROGRESS =
- "UPDATE `{prefix}task_progress` SET completed=?, progress=? WHERE uuid=? AND quest_id=? AND task_id=?";
+ "UPDATE `{prefix}task_progress` SET completed=?, progress=?, data_type=? WHERE uuid=? AND quest_id=? AND task_id=?";
private final HikariDataSource hikari;
private final String prefix;
@@ -148,7 +149,36 @@ public class MySqlStorageProvider implements StorageProvider {
String questId = rs.getString(1);
String taskId = rs.getString(2);
boolean completed = rs.getBoolean(3);
- Object progress = rs.getObject(4);
+ String encodedProgress = rs.getString(4);
+ String type = rs.getString(5);
+ Object progress;
+ try {
+ if (type == null) {
+ progress = null;
+ } else if (type.equals("double")) {
+ progress = Double.valueOf(encodedProgress);
+ } else if (type.equals("float")) {
+ progress = Float.valueOf(encodedProgress);
+ } else if (type.equals("int")) {
+ progress = Integer.valueOf(encodedProgress);
+ } else {
+ throw new RuntimeException("unknown data type '" + type + "'");
+ }
+ } catch (NumberFormatException ex) {
+ plugin.getQuestsLogger().warning("Cannot retrieve progress for task '"
+ + taskId + "' in quest '" + questId + "' for player " + uuid
+ + " since data is malformed!");
+ continue;
+ } catch (RuntimeException ex) {
+ if (ex.getMessage().startsWith("unknown data type ")) {
+ plugin.getQuestsLogger().warning("Cannot retrieve progress for task '"
+ + taskId + "' in quest '" + questId + "' for player " + uuid
+ + ": " + ex.getMessage());
+ continue;
+ } else {
+ throw ex;
+ }
+ }
QuestProgress linkedQuestProgress = questProgressMap.get(questId);
if (linkedQuestProgress == null) continue; // lost quest progress ?
@@ -178,7 +208,7 @@ public class MySqlStorageProvider implements StorageProvider {
try (ResultSet rs = ps.executeQuery()) {
while (rs.next()) {
- knownQuestIds.add(rs.getString(0));
+ knownQuestIds.add(rs.getString(1));
}
}
}
@@ -187,8 +217,8 @@ public class MySqlStorageProvider implements StorageProvider {
try (ResultSet rs = ps.executeQuery()) {
while (rs.next()) {
- String questId = rs.getString(0);
- String taskId = rs.getString(1);
+ String questId = rs.getString(1);
+ String taskId = rs.getString(2);
knownTaskIds.putIfAbsent(questId, new ArrayList<>());
knownTaskIds.get(questId).add(taskId);
@@ -223,19 +253,44 @@ public class MySqlStorageProvider implements StorageProvider {
}
List<String> taskIds = knownTaskIds.getOrDefault(questProgress.getQuestId(), Collections.emptyList());
for (TaskProgress taskProgress : questProgress.getTaskProgress()) {
- if (taskIds.contains(taskProgress.getTaskId())) {
+ String taskId = taskProgress.getTaskId();
+
+ String encodedProgress;
+ Object progress = taskProgress.getProgress();
+ String type;
+ if (progress == null) {
+ type = null;
+ encodedProgress = null;
+ } else if (progress instanceof Double) {
+ type = "double";
+ encodedProgress = String.valueOf(progress);
+ } else if (progress instanceof Integer) {
+ type = "int";
+ encodedProgress = String.valueOf(progress);
+ } else if (progress instanceof Float) {
+ type = "float";
+ encodedProgress = String.valueOf(progress);
+ } else {
+ plugin.getQuestsLogger().warning("Cannot store progress for task '"
+ + taskId + "' in quest '" + questId + "' for player " + uuid
+ + " since type " + progress.getClass().getName() + " cannot be encoded!");
+ continue;
+ }
+ if (taskIds.contains(taskId)) {
updateTaskProgress.setBoolean(1, taskProgress.isCompleted());
- updateTaskProgress.setObject(2, taskProgress.getProgress());
- updateTaskProgress.setString(3, uuid.toString());
- updateTaskProgress.setString(4, questProgress.getQuestId());
- updateTaskProgress.setString(5, taskProgress.getTaskId());
+ updateTaskProgress.setString(2, encodedProgress);
+ updateTaskProgress.setString(3, type);
+ updateTaskProgress.setString(4, uuid.toString());
+ updateTaskProgress.setString(5, questId);
+ updateTaskProgress.setString(6, taskId);
updateTaskProgress.addBatch();
} else {
insertTaskProgress.setString(1, uuid.toString());
- insertTaskProgress.setString(2, questProgress.getQuestId());
+ insertTaskProgress.setString(2, questId);
insertTaskProgress.setString(3, taskProgress.getTaskId());
insertTaskProgress.setBoolean(4, taskProgress.isCompleted());
- insertTaskProgress.setObject(5, taskProgress.getProgress());
+ insertTaskProgress.setString(5, encodedProgress);
+ insertTaskProgress.setString(6, type);
insertTaskProgress.addBatch();
}
}