From d4bab21256ed2c8f59cf7ee75182da685508f80d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 4 Jul 2024 12:01:56 +0000 Subject: [PATCH 01/15] =?UTF-8?q?=F0=9F=94=A7=20bump=20me.qoomon:maven-git?= =?UTF-8?q?-versioning-extension=20from=209.6.6=20to=209.8.1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [me.qoomon:maven-git-versioning-extension](https://github.com/qoomon/maven-git-versioning-extension) from 9.6.6 to 9.8.1. - [Release notes](https://github.com/qoomon/maven-git-versioning-extension/releases) - [Changelog](https://github.com/qoomon/maven-git-versioning-extension/blob/master/CHANGELOG.md) - [Commits](https://github.com/qoomon/maven-git-versioning-extension/compare/v9.6.6...v9.8.1) --- updated-dependencies: - dependency-name: me.qoomon:maven-git-versioning-extension dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- .mvn/extensions.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.mvn/extensions.xml b/.mvn/extensions.xml index 517c5f609e..26c3727521 100644 --- a/.mvn/extensions.xml +++ b/.mvn/extensions.xml @@ -4,7 +4,7 @@ me.qoomon maven-git-versioning-extension - 9.6.6 + 9.8.1 \ No newline at end of file From a6beaa34d18bf1271b7eb5daf4789ccdcb90a17e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 11 Aug 2024 01:57:07 +0000 Subject: [PATCH 02/15] =?UTF-8?q?=F0=9F=94=A7=20Bump=20com.sk89q.worldedit?= =?UTF-8?q?:worldedit-bukkit=20from=207.2.19=20to=207.3.6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps com.sk89q.worldedit:worldedit-bukkit from 7.2.19 to 7.3.6. --- updated-dependencies: - dependency-name: com.sk89q.worldedit:worldedit-bukkit dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 621347ca5f..fe16e1860f 100644 --- a/pom.xml +++ b/pom.xml @@ -341,7 +341,7 @@ com.sk89q.worldedit worldedit-bukkit - 7.2.19 + 7.3.6 provided From 364cb510cd581eccc092ea792a49ac45e937dd20 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 12 Aug 2024 11:20:08 +0000 Subject: [PATCH 03/15] =?UTF-8?q?=F0=9F=94=A7=20Bump=20com.sk89q.worldedit?= =?UTF-8?q?:worldedit-core=20from=207.2.19=20to=207.3.6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps com.sk89q.worldedit:worldedit-core from 7.2.19 to 7.3.6. --- updated-dependencies: - dependency-name: com.sk89q.worldedit:worldedit-core dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 990556b610..7fd1e15f9f 100644 --- a/pom.xml +++ b/pom.xml @@ -327,7 +327,7 @@ com.sk89q.worldedit worldedit-core - 7.2.19 + 7.3.6 provided From d4adc0dc9adc23fe2047c073d922aa15939d3e15 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 12 Aug 2024 11:24:40 +0000 Subject: [PATCH 04/15] =?UTF-8?q?=F0=9F=94=A7=20Bump=20org.apache.maven.pl?= =?UTF-8?q?ugins:maven-shade-plugin=20from=203.5.1=20to=203.6.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [org.apache.maven.plugins:maven-shade-plugin](https://github.com/apache/maven-shade-plugin) from 3.5.1 to 3.6.0. - [Release notes](https://github.com/apache/maven-shade-plugin/releases) - [Commits](https://github.com/apache/maven-shade-plugin/compare/maven-shade-plugin-3.5.1...maven-shade-plugin-3.6.0) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-shade-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 990556b610..90ba9a872e 100644 --- a/pom.xml +++ b/pom.xml @@ -139,7 +139,7 @@ org.apache.maven.plugins maven-shade-plugin - 3.5.1 + 3.6.0 From 3f55126619840cc7ef69937b6f0c3a501ae96920 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 23 Aug 2024 11:06:27 +0000 Subject: [PATCH 05/15] =?UTF-8?q?=F0=9F=94=A7=20Bump=20org.postgresql:post?= =?UTF-8?q?gresql=20from=2042.7.3=20to=2042.7.4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [org.postgresql:postgresql](https://github.com/pgjdbc/pgjdbc) from 42.7.3 to 42.7.4. - [Release notes](https://github.com/pgjdbc/pgjdbc/releases) - [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md) - [Commits](https://github.com/pgjdbc/pgjdbc/compare/REL42.7.3...REL42.7.4) --- updated-dependencies: - dependency-name: org.postgresql:postgresql dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 990556b610..7497b147fd 100644 --- a/pom.xml +++ b/pom.xml @@ -319,7 +319,7 @@ org.postgresql postgresql - 42.7.3 + 42.7.4 compile From 260426fc17dbf9bf6a6fd318edd6290022d09887 Mon Sep 17 00:00:00 2001 From: m1919810 Date: Sat, 1 Feb 2025 01:50:51 +0800 Subject: [PATCH 06/15] formatting --- .../implementation/listeners/AncientAltarListener.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/AncientAltarListener.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/AncientAltarListener.java index 1b5c864062..d5a4d159af 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/AncientAltarListener.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/AncientAltarListener.java @@ -322,7 +322,7 @@ public void onBlockPlace(BlockPlaceEvent e) { ItemStackWrapper wrapper = ItemStackWrapper.wrap(catalyst); List items = ItemStackWrapper.wrapList(inputs); - if (SlimefunUtils.isItemSimilar(wrapper, SlimefunItems.BROKEN_SPAWNER, false, false)) { + if (SlimefunUtils.isItemSimilar(wrapper, SlimefunItems.BROKEN_SPAWNER, false, false, false)) { if (!checkRecipe(SlimefunItems.BROKEN_SPAWNER, items).isPresent()) { return Optional.empty(); } From 0866d9e794599f39db3fee3669a4a74a6d247730 Mon Sep 17 00:00:00 2001 From: StarWishsama Date: Sun, 2 Feb 2025 10:35:47 +0800 Subject: [PATCH 07/15] fix(ci): missing vars access in pr workflow --- .github/workflows/pr-checker.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/pr-checker.yml b/.github/workflows/pr-checker.yml index 199a33dea8..2b7a79f963 100644 --- a/.github/workflows/pr-checker.yml +++ b/.github/workflows/pr-checker.yml @@ -4,7 +4,8 @@ name: Pull Request Checker on: - pull_request: + pull_request_target: + types: [opened, synchronize, reopened] paths: - '.github/workflows/**' - 'src/**' From d154a1f0be2c23d4701a24b0db7238d80701e1eb Mon Sep 17 00:00:00 2001 From: Ddggdd135 <1306334428@qq.com> Date: Sun, 2 Feb 2025 17:53:18 +0800 Subject: [PATCH 08/15] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dsqlite=E4=B8=8BtableInf?= =?UTF-8?q?ormationTable=E6=B2=A1=E6=9C=89=E8=A2=AB=E6=AD=A3=E7=A1=AE?= =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plugin/slimefun4/storage/adapter/sqlite/SqliteAdapter.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/adapter/sqlite/SqliteAdapter.java b/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/adapter/sqlite/SqliteAdapter.java index c33a6a9cc8..153516bbf9 100644 --- a/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/adapter/sqlite/SqliteAdapter.java +++ b/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/adapter/sqlite/SqliteAdapter.java @@ -38,6 +38,7 @@ public void initStorage(DataType type) { case BLOCK_STORAGE -> createBlockStorageTables(); } + tableInformationTable = SqlUtils.mapTable(DataScope.TABLE_INFORMATION); createTableInformationTable(); } From 16d408e8f6d061d279cc2d4a36bcbee8877f089b Mon Sep 17 00:00:00 2001 From: StarWishsama Date: Sun, 2 Feb 2025 19:33:40 +0800 Subject: [PATCH 09/15] fix(ci): temporary disable git version on pr workflow --- .github/workflows/pr-checker.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/pr-checker.yml b/.github/workflows/pr-checker.yml index 2b7a79f963..d647ca9eca 100644 --- a/.github/workflows/pr-checker.yml +++ b/.github/workflows/pr-checker.yml @@ -35,7 +35,7 @@ jobs: cache: 'maven' - name: Codestyle Check - run: mvn -s .mvn/settings.xml -B spotless:check compile --errors + run: mvn -s .mvn/settings.xml -B spotless:check --errors # Setup for the preview build - name: Environment Setup @@ -49,7 +49,7 @@ jobs: sed -i "s/UNOFFICIAL<\/version>/$JAR_VERSION<\/version>/g" pom.xml - name: Build with Maven - run: mvn -s .mvn/settings.xml package --errors + run: mvn -s .mvn/settings.xml package -Dversioning.disable --errors - name: Upload the artifact uses: actions/upload-artifact@v4 From 7f444c510fb70374ac9e7333e450a843848c9261 Mon Sep 17 00:00:00 2001 From: StarWishsama Date: Fri, 7 Feb 2025 14:39:04 +0800 Subject: [PATCH 10/15] refactor: do not attempt to create file (#1017) --- .../slimefun4/storage/controller/BlockDataConfigWrapper.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/controller/BlockDataConfigWrapper.java b/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/controller/BlockDataConfigWrapper.java index ba6fa0be8a..e1a0c55d73 100644 --- a/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/controller/BlockDataConfigWrapper.java +++ b/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/controller/BlockDataConfigWrapper.java @@ -14,7 +14,7 @@ public class BlockDataConfigWrapper extends Config { private final SlimefunBlockData blockData; public BlockDataConfigWrapper(SlimefunBlockData blockData) { - super(new File("")); + super(null, null); this.blockData = blockData; } From 94467a8ca68cae8a12046a2ac185b986e45cca44 Mon Sep 17 00:00:00 2001 From: StarWishsama Date: Fri, 7 Feb 2025 15:16:36 +0800 Subject: [PATCH 11/15] fix: `wind_burst` shouldn't break sf block when `mobGriefing` is disabled --- .../implementation/listeners/ExplosionsListener.java | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/ExplosionsListener.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/ExplosionsListener.java index cb91bdf153..c15d332c07 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/ExplosionsListener.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/ExplosionsListener.java @@ -15,6 +15,7 @@ import java.util.List; import javax.annotation.Nonnull; import javax.annotation.ParametersAreNonnullByDefault; +import org.bukkit.ExplosionResult; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.entity.EntityType; @@ -31,10 +32,8 @@ * calls the explosive part of the {@link BlockBreakHandler}. * * @author TheBusyBiscuit - * * @see BlockBreakHandler * @see WitherProof - * */ public class ExplosionsListener implements Listener { @@ -49,7 +48,8 @@ public void onEntityExplode(EntityExplodeEvent e) { * so we just ignore it. */ if (Slimefun.getMinecraftVersion().isAtLeast(MinecraftVersion.MINECRAFT_1_21) - && e.getEntityType() == EntityType.WIND_CHARGE) { + && (e.getEntityType() == EntityType.WIND_CHARGE + || e.getEntityType() == EntityType.BREEZE_WIND_CHARGE)) { return; } @@ -58,6 +58,11 @@ public void onEntityExplode(EntityExplodeEvent e) { @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) public void onBlockExplode(BlockExplodeEvent e) { + if (Slimefun.getMinecraftVersion().isAtLeast(MinecraftVersion.MINECRAFT_1_21) + && e.getExplosionResult() == ExplosionResult.TRIGGER_BLOCK) { + return; + } + removeResistantBlocks(e.blockList().iterator()); } From f7424d10e07ee3337c55a50351e8e9a30827867e Mon Sep 17 00:00:00 2001 From: StarWishsama Date: Fri, 7 Feb 2025 15:55:28 +0800 Subject: [PATCH 12/15] fix: energy regulator broken randomly When energy network refreshing its children and unloaded universal data exists, random machine will stopped by error reporter --- .../controller/BlockDataController.java | 25 +++++++------ .../SlimefunUniversalBlockData.java | 36 +++++++++++-------- .../controller/SlimefunUniversalData.java | 4 +++ 3 files changed, 40 insertions(+), 25 deletions(-) diff --git a/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/controller/BlockDataController.java b/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/controller/BlockDataController.java index df2eaecf47..afa98657ce 100644 --- a/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/controller/BlockDataController.java +++ b/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/controller/BlockDataController.java @@ -248,8 +248,6 @@ public SlimefunUniversalBlockData createUniversalBlock(Location l, String sfId) var uuid = UUID.randomUUID(); var uniData = new SlimefunUniversalBlockData(uuid, sfId, l); - uniData.setIsDataLoaded(true); - uniData.initLastPresent(); loadedUniversalData.put(uuid, uniData); @@ -267,6 +265,8 @@ public SlimefunUniversalBlockData createUniversalBlock(Location l, String sfId) .getBlockDataController() .saveUniversalData(uuid, sfId, Set.of(UniversalDataTrait.BLOCK, UniversalDataTrait.INVENTORY)); + uniData.setIsDataLoaded(true); + return uniData; } @@ -541,13 +541,16 @@ public void getUniversalBlockData(@Nonnull UUID uuid, IAsyncReadCallback getUniversalBlockDataFromCache(@Nonnull Location l) { checkDestroy(); + for (SlimefunUniversalData uniData : loadedUniversalData.values()) { + if (uniData instanceof SlimefunUniversalBlockData ubd + && ubd.isDataLoaded() + && ubd.getLastPresent() != null + && l.equals(ubd.getLastPresent().toLocation())) { + return Optional.of(ubd); + } + } - return loadedUniversalData.values().stream() - .filter(uniData -> uniData instanceof SlimefunUniversalBlockData ubd - && ubd.getLastPresent() != null - && l.equals(ubd.getLastPresent().toLocation())) - .map(data -> (SlimefunUniversalBlockData) data) - .findFirst(); + return Optional.empty(); } /** @@ -727,7 +730,7 @@ public void loadUniversalRecord() { ? new SlimefunUniversalBlockData(uuid, sfId) : new SlimefunUniversalData(uuid, sfId); - traits.forEach(t -> uniData.getTraits().add(t)); + traits.forEach(uniData::addTrait); scheduleReadTask(() -> loadUniversalData(uniData)); }); @@ -857,8 +860,6 @@ public void loadUniversalData(SlimefunUniversalData uniData) { DataUtils.blockDataDebase64(recordSet.get(FieldKey.DATA_VALUE)), false)); - uniData.setIsDataLoaded(true); - loadedUniversalData.putIfAbsent(uniData.getUUID(), uniData); if (uniData.hasTrait(UniversalDataTrait.INVENTORY)) { @@ -902,6 +903,8 @@ public void loadUniversalData(SlimefunUniversalData uniData) { uniData.getUUID()); } } + + uniData.setIsDataLoaded(true); } finally { lock.unlock(key); } diff --git a/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/controller/SlimefunUniversalBlockData.java b/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/controller/SlimefunUniversalBlockData.java index 732e1f5155..e0c8b7265a 100644 --- a/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/controller/SlimefunUniversalBlockData.java +++ b/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/controller/SlimefunUniversalBlockData.java @@ -38,6 +38,10 @@ public void setLastPresent(Location l) { } public BlockPosition getLastPresent() { + if (!isDataLoaded()) { + return null; + } + var data = getData(UniversalDataTrait.BLOCK.getReservedKey()); if (lastPresent != null) { @@ -60,22 +64,26 @@ public BlockPosition getLastPresent() { } // 修复因使用不一致的文本转换导致的位置无法解析 - try { - var lArr = data.split(","); - var bp = new BlockPosition( - Bukkit.getWorld(lArr[0].replace("[world=", "")), - (int) Double.parseDouble(lArr[1].replace("x=", "")), - (int) Double.parseDouble(lArr[2].replace("y=", "")), - (int) Double.parseDouble(lArr[3].replace("z=", "").replace("]", ""))); - - setTraitData(UniversalDataTrait.BLOCK, LocationUtils.getLocKey(bp.toLocation())); - - return bp; - } catch (Exception x) { - throw new RuntimeException("Unable to fix location " + data + ", it might be broken", x); - } + oldLocationFix(data); } return lastPresent; } + + private void oldLocationFix(String data) { + try { + var lArr = data.split(","); + var bp = new BlockPosition( + Bukkit.getWorld(lArr[0].replace("[world=", "")), + (int) Double.parseDouble(lArr[1].replace("x=", "")), + (int) Double.parseDouble(lArr[2].replace("y=", "")), + (int) Double.parseDouble(lArr[3].replace("z=", "").replace("]", ""))); + + setTraitData(UniversalDataTrait.BLOCK, LocationUtils.getLocKey(bp.toLocation())); + + lastPresent = bp; + } catch (Exception x) { + throw new RuntimeException("Unable to fix location " + data + ", it might be broken", x); + } + } } diff --git a/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/controller/SlimefunUniversalData.java b/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/controller/SlimefunUniversalData.java index baf6d59829..678c90822c 100644 --- a/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/controller/SlimefunUniversalData.java +++ b/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/controller/SlimefunUniversalData.java @@ -81,6 +81,10 @@ public UUID getUUID() { return UUID.fromString(getKey()); } + public void addTrait(UniversalDataTrait trait) { + traits.add(trait); + } + public boolean hasTrait(UniversalDataTrait trait) { return traits.contains(trait); } From 66ec3df421ebe42cf746f11d8f79f2d5654ef75e Mon Sep 17 00:00:00 2001 From: StarWishsama Date: Fri, 7 Feb 2025 16:22:25 +0800 Subject: [PATCH 13/15] fix: fix unidata loading order --- .../slimefun4/storage/controller/BlockDataController.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/controller/BlockDataController.java b/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/controller/BlockDataController.java index afa98657ce..70813d0c2c 100644 --- a/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/controller/BlockDataController.java +++ b/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/controller/BlockDataController.java @@ -250,6 +250,8 @@ public SlimefunUniversalBlockData createUniversalBlock(Location l, String sfId) uniData.initLastPresent(); + uniData.setIsDataLoaded(true); + loadedUniversalData.put(uuid, uniData); var preset = UniversalMenuPreset.getPreset(sfId); @@ -265,8 +267,6 @@ public SlimefunUniversalBlockData createUniversalBlock(Location l, String sfId) .getBlockDataController() .saveUniversalData(uuid, sfId, Set.of(UniversalDataTrait.BLOCK, UniversalDataTrait.INVENTORY)); - uniData.setIsDataLoaded(true); - return uniData; } @@ -862,6 +862,8 @@ public void loadUniversalData(SlimefunUniversalData uniData) { loadedUniversalData.putIfAbsent(uniData.getUUID(), uniData); + uniData.setIsDataLoaded(true); + if (uniData.hasTrait(UniversalDataTrait.INVENTORY)) { var menuPreset = UniversalMenuPreset.getPreset(uniData.getSfId()); if (menuPreset != null) { @@ -903,8 +905,6 @@ public void loadUniversalData(SlimefunUniversalData uniData) { uniData.getUUID()); } } - - uniData.setIsDataLoaded(true); } finally { lock.unlock(key); } From 25070baf7d7eeeca769322f311e8ffd2260e6035 Mon Sep 17 00:00:00 2001 From: StarWishsama Date: Tue, 11 Feb 2025 18:53:45 +0800 Subject: [PATCH 14/15] refactor: rewrite `DatabasePatch` --- .../storage/adapter/IDataSourceAdapter.java | 6 ++- .../storage/adapter/mysql/MysqlAdapter.java | 38 +++++++++----- .../adapter/postgresql/PostgreSqlAdapter.java | 38 +++++++++----- .../adapter/sqlcommon/SqlCommonAdapter.java | 49 ++++++++++++++----- .../adapter/sqlcommon/SqlConstants.java | 15 ++++++ .../storage/adapter/sqlcommon/SqlUtils.java | 10 ++-- .../storage/adapter/sqlite/SqliteAdapter.java | 39 +++++++++------ .../slimefun4/storage/common/DataScope.java | 2 +- .../slimefun4/storage/common/FieldKey.java | 3 +- .../storage/patch/DatabasePatch.java | 42 ++++++++++++++++ .../storage/patch/DatabasePatchV1.java | 17 +------ .../storage/patch/DatabasePatchV2.java | 20 ++++++++ 12 files changed, 204 insertions(+), 75 deletions(-) create mode 100644 src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/patch/DatabasePatchV2.java diff --git a/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/adapter/IDataSourceAdapter.java b/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/adapter/IDataSourceAdapter.java index b0caa3c18b..64320ddc17 100644 --- a/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/adapter/IDataSourceAdapter.java +++ b/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/adapter/IDataSourceAdapter.java @@ -6,7 +6,11 @@ import java.util.List; public interface IDataSourceAdapter { - int DATABASE_VERSION = 1; + /** + * 当前数据库架构版本号 + * 在数据库结构有变动时更新 + */ + int DATABASE_VERSION = 2; void prepare(T config); diff --git a/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/adapter/mysql/MysqlAdapter.java b/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/adapter/mysql/MysqlAdapter.java index e66305bf4a..998e7908e2 100644 --- a/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/adapter/mysql/MysqlAdapter.java +++ b/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/adapter/mysql/MysqlAdapter.java @@ -14,9 +14,11 @@ import static com.xzavier0722.mc.plugin.slimefun4.storage.adapter.sqlcommon.SqlConstants.FIELD_PLAYER_UUID; import static com.xzavier0722.mc.plugin.slimefun4.storage.adapter.sqlcommon.SqlConstants.FIELD_RESEARCH_KEY; import static com.xzavier0722.mc.plugin.slimefun4.storage.adapter.sqlcommon.SqlConstants.FIELD_SLIMEFUN_ID; -import static com.xzavier0722.mc.plugin.slimefun4.storage.adapter.sqlcommon.SqlConstants.FIELD_TABLE_VERSION; +import static com.xzavier0722.mc.plugin.slimefun4.storage.adapter.sqlcommon.SqlConstants.FIELD_TABLE_METADATA_KEY; +import static com.xzavier0722.mc.plugin.slimefun4.storage.adapter.sqlcommon.SqlConstants.FIELD_TABLE_METADATA_VALUE; import static com.xzavier0722.mc.plugin.slimefun4.storage.adapter.sqlcommon.SqlConstants.FIELD_UNIVERSAL_TRAITS; import static com.xzavier0722.mc.plugin.slimefun4.storage.adapter.sqlcommon.SqlConstants.FIELD_UNIVERSAL_UUID; +import static com.xzavier0722.mc.plugin.slimefun4.storage.adapter.sqlcommon.SqlConstants.METADATA_VERSION; import com.xzavier0722.mc.plugin.slimefun4.storage.adapter.IDataSourceAdapter; import com.xzavier0722.mc.plugin.slimefun4.storage.adapter.sqlcommon.SqlCommonAdapter; @@ -26,6 +28,7 @@ import com.xzavier0722.mc.plugin.slimefun4.storage.common.RecordKey; import com.xzavier0722.mc.plugin.slimefun4.storage.common.RecordSet; import io.github.thebusybiscuit.slimefun4.implementation.Slimefun; +import java.text.MessageFormat; import java.util.List; public class MysqlAdapter extends SqlCommonAdapter { @@ -51,8 +54,8 @@ public void initStorage(DataType type) { } } - tableInformationTable = SqlUtils.mapTable(DataScope.TABLE_INFORMATION, config.tablePrefix()); - createTableInformationTable(); + tableMetadataTable = SqlUtils.mapTable(DataScope.TABLE_METADATA, config.tablePrefix()); + createTableMetadataTable(); } @Override @@ -388,18 +391,27 @@ private void createUniversalDataTable() { + ");"); } - private void createTableInformationTable() { - executeSql("CREATE TABLE IF NOT EXISTS " - + tableInformationTable - + "(" - + FIELD_TABLE_VERSION - + " INT UNIQUE NOT NULL DEFAULT '0'" - + ");"); + private void createTableMetadataTable() { + executeSql(MessageFormat.format( + """ + CREATE TABLE IF NOT EXISTS {0} + ( + {1} VARCHAR(100) UNIQUE NOT NULL, + {2} TEXT NOT NULL + ); + """, + tableMetadataTable, FIELD_TABLE_METADATA_KEY, FIELD_TABLE_METADATA_VALUE)); if (Slimefun.isNewlyInstalled()) { - executeSql("INSERT INTO " + tableInformationTable + " (" + FIELD_TABLE_VERSION + ") SELECT '" - + IDataSourceAdapter.DATABASE_VERSION + "' WHERE NOT EXISTS (SELECT 1 FROM " + tableInformationTable - + ")"); + executeSql(MessageFormat.format( + """ + INSERT INTO {0} ({1}, {2}) VALUES ({3}, {4}); + """, + tableMetadataTable, + FIELD_TABLE_METADATA_KEY, + FIELD_TABLE_METADATA_VALUE, + METADATA_VERSION, + IDataSourceAdapter.DATABASE_VERSION)); } } } diff --git a/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/adapter/postgresql/PostgreSqlAdapter.java b/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/adapter/postgresql/PostgreSqlAdapter.java index 500fda78de..52069084db 100644 --- a/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/adapter/postgresql/PostgreSqlAdapter.java +++ b/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/adapter/postgresql/PostgreSqlAdapter.java @@ -14,9 +14,11 @@ import static com.xzavier0722.mc.plugin.slimefun4.storage.adapter.sqlcommon.SqlConstants.FIELD_PLAYER_UUID; import static com.xzavier0722.mc.plugin.slimefun4.storage.adapter.sqlcommon.SqlConstants.FIELD_RESEARCH_KEY; import static com.xzavier0722.mc.plugin.slimefun4.storage.adapter.sqlcommon.SqlConstants.FIELD_SLIMEFUN_ID; -import static com.xzavier0722.mc.plugin.slimefun4.storage.adapter.sqlcommon.SqlConstants.FIELD_TABLE_VERSION; +import static com.xzavier0722.mc.plugin.slimefun4.storage.adapter.sqlcommon.SqlConstants.FIELD_TABLE_METADATA_KEY; +import static com.xzavier0722.mc.plugin.slimefun4.storage.adapter.sqlcommon.SqlConstants.FIELD_TABLE_METADATA_VALUE; import static com.xzavier0722.mc.plugin.slimefun4.storage.adapter.sqlcommon.SqlConstants.FIELD_UNIVERSAL_TRAITS; import static com.xzavier0722.mc.plugin.slimefun4.storage.adapter.sqlcommon.SqlConstants.FIELD_UNIVERSAL_UUID; +import static com.xzavier0722.mc.plugin.slimefun4.storage.adapter.sqlcommon.SqlConstants.METADATA_VERSION; import com.xzavier0722.mc.plugin.slimefun4.storage.adapter.IDataSourceAdapter; import com.xzavier0722.mc.plugin.slimefun4.storage.adapter.sqlcommon.SqlCommonAdapter; @@ -26,6 +28,7 @@ import com.xzavier0722.mc.plugin.slimefun4.storage.common.RecordKey; import com.xzavier0722.mc.plugin.slimefun4.storage.common.RecordSet; import io.github.thebusybiscuit.slimefun4.implementation.Slimefun; +import java.text.MessageFormat; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; @@ -53,8 +56,8 @@ public void initStorage(DataType type) { } } - tableInformationTable = SqlUtils.mapTable(DataScope.TABLE_INFORMATION, config.tablePrefix()); - createTableInformationTable(); + tableMetadataTable = SqlUtils.mapTable(DataScope.TABLE_METADATA, config.tablePrefix()); + createTableMetadataTable(); } @Override @@ -404,18 +407,27 @@ private void createUniversalDataTable() { + ");"); } - private void createTableInformationTable() { - executeSql("CREATE TABLE IF NOT EXISTS " - + tableInformationTable - + "(" - + FIELD_TABLE_VERSION - + " INT UNIQUE NOT NULL DEFAULT '0'" - + ");"); + private void createTableMetadataTable() { + executeSql(MessageFormat.format( + """ + CREATE TABLE IF NOT EXISTS {0} + ( + {1} VARCHAR(100) UNIQUE NOT NULL, + {2} TEXT NOT NULL + ); + """, + tableMetadataTable, FIELD_TABLE_METADATA_KEY, FIELD_TABLE_METADATA_VALUE)); if (Slimefun.isNewlyInstalled()) { - executeSql("INSERT INTO " + tableInformationTable + " (" + FIELD_TABLE_VERSION + ") SELECT '" - + IDataSourceAdapter.DATABASE_VERSION + "' WHERE NOT EXISTS (SELECT 1 FROM " + tableInformationTable - + ")"); + executeSql(MessageFormat.format( + """ + INSERT INTO {0} ({1}, {2}) VALUES ({3}, {4}); + """, + tableMetadataTable, + FIELD_TABLE_METADATA_KEY, + FIELD_TABLE_METADATA_VALUE, + METADATA_VERSION, + IDataSourceAdapter.DATABASE_VERSION)); } } } diff --git a/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/adapter/sqlcommon/SqlCommonAdapter.java b/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/adapter/sqlcommon/SqlCommonAdapter.java index 659ca28a0f..4849b10e1a 100644 --- a/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/adapter/sqlcommon/SqlCommonAdapter.java +++ b/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/adapter/sqlcommon/SqlCommonAdapter.java @@ -1,6 +1,9 @@ package com.xzavier0722.mc.plugin.slimefun4.storage.adapter.sqlcommon; +import static com.xzavier0722.mc.plugin.slimefun4.storage.adapter.sqlcommon.SqlConstants.FIELD_TABLE_METADATA_KEY; +import static com.xzavier0722.mc.plugin.slimefun4.storage.adapter.sqlcommon.SqlConstants.FIELD_TABLE_METADATA_VALUE; import static com.xzavier0722.mc.plugin.slimefun4.storage.adapter.sqlcommon.SqlConstants.FIELD_TABLE_VERSION; +import static com.xzavier0722.mc.plugin.slimefun4.storage.adapter.sqlcommon.SqlConstants.METADATA_VERSION; import static com.xzavier0722.mc.plugin.slimefun4.storage.adapter.sqlcommon.SqlConstants.TABLE_NAME_TABLE_INFORMATION; import city.norain.slimefun4.timings.entry.SQLEntry; @@ -10,6 +13,7 @@ import com.xzavier0722.mc.plugin.slimefun4.storage.common.RecordSet; import com.xzavier0722.mc.plugin.slimefun4.storage.patch.DatabasePatch; import com.xzavier0722.mc.plugin.slimefun4.storage.patch.DatabasePatchV1; +import com.xzavier0722.mc.plugin.slimefun4.storage.patch.DatabasePatchV2; import com.zaxxer.hikari.HikariDataSource; import io.github.thebusybiscuit.slimefun4.implementation.Slimefun; import java.sql.SQLException; @@ -26,7 +30,7 @@ public abstract class SqlCommonAdapter implements ID chunkDataTable, blockInvTable, universalInvTable; - protected String tableInformationTable; + protected String tableMetadataTable; protected T config; @Override @@ -73,7 +77,7 @@ protected String mapTable(DataScope scope) { case UNIVERSAL_INVENTORY -> universalInvTable; case UNIVERSAL_RECORD -> universalRecordTable; case UNIVERSAL_DATA -> universalDataTable; - case TABLE_INFORMATION -> tableInformationTable; + case TABLE_METADATA -> tableMetadataTable; case NONE -> throw new IllegalArgumentException("NONE cannot be a storage data scope!"); }; } @@ -93,28 +97,47 @@ public void shutdown() { universalInvTable = null; universalDataTable = null; universalRecordTable = null; + tableMetadataTable = null; } public int getDatabaseVersion() { - var query = executeQuery("SELECT (" + FIELD_TABLE_VERSION + ") FROM " - + (tableInformationTable == null ? TABLE_NAME_TABLE_INFORMATION : tableInformationTable)); + if (Slimefun.isNewlyInstalled()) { + return IDataSourceAdapter.DATABASE_VERSION; + } + + var query = executeQuery(String.format( + "SELECT (%s) FROM %s WHERE %s='%s';", + FIELD_TABLE_METADATA_VALUE, tableMetadataTable, FIELD_TABLE_METADATA_KEY, METADATA_VERSION)); if (query.isEmpty()) { - return 0; + try { + var prefix = config instanceof SqlCommonConfig sqc ? sqc.tablePrefix() : ""; + var fallbackQuery = executeQuery( + "SELECT (" + FIELD_TABLE_VERSION + ") FROM " + (prefix + TABLE_NAME_TABLE_INFORMATION)); + + if (fallbackQuery.isEmpty()) { + return 0; + } + + return fallbackQuery.getFirst().getInt(null); + } catch (Exception e) { + return 0; + } } else { - return query.getFirst().getInt(FieldKey.TABLE_VERSION); + return query.getFirst().getInt(FieldKey.METADATA_VALUE); } } @Override public void patch() { DatabasePatch patch = null; + var dbVer = getDatabaseVersion(); - switch (getDatabaseVersion()) { - case 0: { - patch = new DatabasePatchV1(); - break; - } + Slimefun.logger().log(Level.INFO, "当前数据库版本 {0}", new Object[] {dbVer}); + + switch (dbVer) { + case 0 -> patch = new DatabasePatchV1(); + case 1 -> patch = new DatabasePatchV2(); } if (patch == null) { @@ -123,7 +146,9 @@ public void patch() { try (var conn = ds.getConnection()) { Slimefun.logger().log(Level.INFO, "正在更新数据库版本至 " + patch.getVersion() + ", 可能需要一段时间..."); - patch.patch(conn.createStatement(), config); + var stmt = conn.createStatement(); + patch.updateVersion(stmt, config); + patch.patch(stmt, config); Slimefun.logger().log(Level.INFO, "更新完成. "); } catch (SQLException e) { Slimefun.logger().log(Level.SEVERE, "更新数据库时出现问题!", e); diff --git a/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/adapter/sqlcommon/SqlConstants.java b/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/adapter/sqlcommon/SqlConstants.java index d4de38093c..5481ee23d1 100644 --- a/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/adapter/sqlcommon/SqlConstants.java +++ b/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/adapter/sqlcommon/SqlConstants.java @@ -12,8 +12,14 @@ public interface SqlConstants { String TABLE_NAME_UNIVERSAL_INVENTORY = "universal_inventory"; String TABLE_NAME_UNIVERSAL_RECORD = "universal_record"; String TABLE_NAME_UNIVERSAL_DATA = "universal_data"; + /** + * @deprecated + * 由于设计不当,该表已被弃用 + */ String TABLE_NAME_TABLE_INFORMATION = "table_information"; + String TABLE_NAME_TABLE_METADATA = "table_metadata"; + String FIELD_PLAYER_UUID = "p_uuid"; String FIELD_PLAYER_NAME = "p_name"; @@ -38,5 +44,14 @@ public interface SqlConstants { String FIELD_UNIVERSAL_TRAITS = "universal_traits"; + /** + * @deprecated + * 由于设计不当,该字段已被弃用 + */ String FIELD_TABLE_VERSION = "table_version"; + + String FIELD_TABLE_METADATA_KEY = "table_metadata_key"; + String FIELD_TABLE_METADATA_VALUE = "table_metadata_value"; + + String METADATA_VERSION = "version"; } diff --git a/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/adapter/sqlcommon/SqlUtils.java b/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/adapter/sqlcommon/SqlUtils.java index 679bb0a799..4bbb6f06f4 100644 --- a/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/adapter/sqlcommon/SqlUtils.java +++ b/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/adapter/sqlcommon/SqlUtils.java @@ -14,7 +14,8 @@ import static com.xzavier0722.mc.plugin.slimefun4.storage.adapter.sqlcommon.SqlConstants.FIELD_PLAYER_UUID; import static com.xzavier0722.mc.plugin.slimefun4.storage.adapter.sqlcommon.SqlConstants.FIELD_RESEARCH_KEY; import static com.xzavier0722.mc.plugin.slimefun4.storage.adapter.sqlcommon.SqlConstants.FIELD_SLIMEFUN_ID; -import static com.xzavier0722.mc.plugin.slimefun4.storage.adapter.sqlcommon.SqlConstants.FIELD_TABLE_VERSION; +import static com.xzavier0722.mc.plugin.slimefun4.storage.adapter.sqlcommon.SqlConstants.FIELD_TABLE_METADATA_KEY; +import static com.xzavier0722.mc.plugin.slimefun4.storage.adapter.sqlcommon.SqlConstants.FIELD_TABLE_METADATA_VALUE; import static com.xzavier0722.mc.plugin.slimefun4.storage.adapter.sqlcommon.SqlConstants.FIELD_UNIVERSAL_TRAITS; import static com.xzavier0722.mc.plugin.slimefun4.storage.adapter.sqlcommon.SqlConstants.FIELD_UNIVERSAL_UUID; import static com.xzavier0722.mc.plugin.slimefun4.storage.adapter.sqlcommon.SqlConstants.TABLE_NAME_BACKPACK; @@ -25,7 +26,7 @@ import static com.xzavier0722.mc.plugin.slimefun4.storage.adapter.sqlcommon.SqlConstants.TABLE_NAME_CHUNK_DATA; import static com.xzavier0722.mc.plugin.slimefun4.storage.adapter.sqlcommon.SqlConstants.TABLE_NAME_PLAYER_PROFILE; import static com.xzavier0722.mc.plugin.slimefun4.storage.adapter.sqlcommon.SqlConstants.TABLE_NAME_PLAYER_RESEARCH; -import static com.xzavier0722.mc.plugin.slimefun4.storage.adapter.sqlcommon.SqlConstants.TABLE_NAME_TABLE_INFORMATION; +import static com.xzavier0722.mc.plugin.slimefun4.storage.adapter.sqlcommon.SqlConstants.TABLE_NAME_TABLE_METADATA; import static com.xzavier0722.mc.plugin.slimefun4.storage.adapter.sqlcommon.SqlConstants.TABLE_NAME_UNIVERSAL_DATA; import static com.xzavier0722.mc.plugin.slimefun4.storage.adapter.sqlcommon.SqlConstants.TABLE_NAME_UNIVERSAL_INVENTORY; import static com.xzavier0722.mc.plugin.slimefun4.storage.adapter.sqlcommon.SqlConstants.TABLE_NAME_UNIVERSAL_RECORD; @@ -67,7 +68,8 @@ public class SqlUtils { fieldMap.put(FieldKey.DATA_VALUE, FIELD_DATA_VALUE); fieldMap.put(FieldKey.UNIVERSAL_UUID, FIELD_UNIVERSAL_UUID); fieldMap.put(FieldKey.UNIVERSAL_TRAITS, FIELD_UNIVERSAL_TRAITS); - fieldMap.put(FieldKey.TABLE_VERSION, FIELD_TABLE_VERSION); + fieldMap.put(FieldKey.METADATA_KEY, FIELD_TABLE_METADATA_KEY); + fieldMap.put(FieldKey.METADATA_VALUE, FIELD_TABLE_METADATA_VALUE); mapper = new FieldMapper<>(fieldMap); } @@ -84,7 +86,7 @@ public static String mapTable(DataScope scope) { case UNIVERSAL_INVENTORY -> TABLE_NAME_UNIVERSAL_INVENTORY; case UNIVERSAL_RECORD -> TABLE_NAME_UNIVERSAL_RECORD; case UNIVERSAL_DATA -> TABLE_NAME_UNIVERSAL_DATA; - case TABLE_INFORMATION -> TABLE_NAME_TABLE_INFORMATION; + case TABLE_METADATA -> TABLE_NAME_TABLE_METADATA; case NONE -> throw new IllegalArgumentException("NONE cannot be a storage data scope!"); }; } diff --git a/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/adapter/sqlite/SqliteAdapter.java b/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/adapter/sqlite/SqliteAdapter.java index 153516bbf9..228b74f5a2 100644 --- a/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/adapter/sqlite/SqliteAdapter.java +++ b/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/adapter/sqlite/SqliteAdapter.java @@ -14,9 +14,11 @@ import static com.xzavier0722.mc.plugin.slimefun4.storage.adapter.sqlcommon.SqlConstants.FIELD_PLAYER_UUID; import static com.xzavier0722.mc.plugin.slimefun4.storage.adapter.sqlcommon.SqlConstants.FIELD_RESEARCH_KEY; import static com.xzavier0722.mc.plugin.slimefun4.storage.adapter.sqlcommon.SqlConstants.FIELD_SLIMEFUN_ID; -import static com.xzavier0722.mc.plugin.slimefun4.storage.adapter.sqlcommon.SqlConstants.FIELD_TABLE_VERSION; +import static com.xzavier0722.mc.plugin.slimefun4.storage.adapter.sqlcommon.SqlConstants.FIELD_TABLE_METADATA_KEY; +import static com.xzavier0722.mc.plugin.slimefun4.storage.adapter.sqlcommon.SqlConstants.FIELD_TABLE_METADATA_VALUE; import static com.xzavier0722.mc.plugin.slimefun4.storage.adapter.sqlcommon.SqlConstants.FIELD_UNIVERSAL_TRAITS; import static com.xzavier0722.mc.plugin.slimefun4.storage.adapter.sqlcommon.SqlConstants.FIELD_UNIVERSAL_UUID; +import static com.xzavier0722.mc.plugin.slimefun4.storage.adapter.sqlcommon.SqlConstants.METADATA_VERSION; import city.norain.slimefun4.timings.entry.SQLEntry; import com.xzavier0722.mc.plugin.slimefun4.storage.adapter.IDataSourceAdapter; @@ -28,6 +30,7 @@ import com.xzavier0722.mc.plugin.slimefun4.storage.common.RecordSet; import io.github.thebusybiscuit.slimefun4.implementation.Slimefun; import java.sql.SQLException; +import java.text.MessageFormat; import java.util.List; public class SqliteAdapter extends SqlCommonAdapter { @@ -38,8 +41,8 @@ public void initStorage(DataType type) { case BLOCK_STORAGE -> createBlockStorageTables(); } - tableInformationTable = SqlUtils.mapTable(DataScope.TABLE_INFORMATION); - createTableInformationTable(); + tableMetadataTable = SqlUtils.mapTable(DataScope.TABLE_METADATA); + createTableMetadataTable(); } @Override @@ -384,19 +387,27 @@ private void createUniversalDataTable() { + ");"); } - private void createTableInformationTable() { - var table = SqlUtils.mapTable(DataScope.TABLE_INFORMATION); - executeSql("CREATE TABLE IF NOT EXISTS " - + table - + "(" - + FIELD_TABLE_VERSION - + " INT UNIQUE NOT NULL DEFAULT '0'" - + ");"); + private void createTableMetadataTable() { + executeSql(MessageFormat.format( + """ + CREATE TABLE IF NOT EXISTS {0} + ( + {1} VARCHAR(255) UNIQUE NOT NULL, + {2} TEXT NOT NULL + ); + """, + SqlUtils.mapTable(DataScope.TABLE_METADATA), FIELD_TABLE_METADATA_KEY, FIELD_TABLE_METADATA_VALUE)); if (Slimefun.isNewlyInstalled()) { - executeSql("INSERT INTO " + tableInformationTable + " (" + FIELD_TABLE_VERSION + ") SELECT '" - + IDataSourceAdapter.DATABASE_VERSION + "' WHERE NOT EXISTS (SELECT 1 FROM " + tableInformationTable - + ")"); + executeSql(MessageFormat.format( + """ + INSERT INTO {0} ({1}, {2}) VALUES ({3}, {4}); + """, + SqlUtils.mapTable(DataScope.TABLE_METADATA), + FIELD_TABLE_METADATA_KEY, + FIELD_TABLE_METADATA_VALUE, + METADATA_VERSION, + IDataSourceAdapter.DATABASE_VERSION)); } } diff --git a/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/common/DataScope.java b/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/common/DataScope.java index 03a855f0b7..1095e3ac91 100644 --- a/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/common/DataScope.java +++ b/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/common/DataScope.java @@ -13,7 +13,7 @@ public enum DataScope { UNIVERSAL_RECORD(new FieldKey[] {FieldKey.UNIVERSAL_UUID}), UNIVERSAL_DATA(new FieldKey[] {FieldKey.UNIVERSAL_UUID, FieldKey.DATA_KEY}), UNIVERSAL_INVENTORY(new FieldKey[] {FieldKey.UNIVERSAL_UUID, FieldKey.INVENTORY_SLOT}), - TABLE_INFORMATION; + TABLE_METADATA; private final FieldKey[] primaryKeys; diff --git a/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/common/FieldKey.java b/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/common/FieldKey.java index f43fc5be0a..193dbbc727 100644 --- a/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/common/FieldKey.java +++ b/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/common/FieldKey.java @@ -29,7 +29,8 @@ public enum FieldKey { UNIVERSAL_TRAITS, - TABLE_VERSION; + METADATA_KEY, + METADATA_VALUE; private final boolean isNumType; diff --git a/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/patch/DatabasePatch.java b/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/patch/DatabasePatch.java index 2aab164f10..59e9f1e5d8 100644 --- a/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/patch/DatabasePatch.java +++ b/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/patch/DatabasePatch.java @@ -1,6 +1,14 @@ package com.xzavier0722.mc.plugin.slimefun4.storage.patch; +import static com.xzavier0722.mc.plugin.slimefun4.storage.adapter.sqlcommon.SqlConstants.FIELD_TABLE_METADATA_KEY; +import static com.xzavier0722.mc.plugin.slimefun4.storage.adapter.sqlcommon.SqlConstants.FIELD_TABLE_METADATA_VALUE; +import static com.xzavier0722.mc.plugin.slimefun4.storage.adapter.sqlcommon.SqlConstants.METADATA_VERSION; + import com.xzavier0722.mc.plugin.slimefun4.storage.adapter.sqlcommon.ISqlCommonConfig; +import com.xzavier0722.mc.plugin.slimefun4.storage.adapter.sqlcommon.SqlCommonConfig; +import com.xzavier0722.mc.plugin.slimefun4.storage.adapter.sqlcommon.SqlUtils; +import com.xzavier0722.mc.plugin.slimefun4.storage.adapter.sqlite.SqliteConfig; +import com.xzavier0722.mc.plugin.slimefun4.storage.common.DataScope; import java.sql.SQLException; import java.sql.Statement; import lombok.Getter; @@ -9,5 +17,39 @@ public abstract class DatabasePatch { protected int version; + public DatabasePatch(int version) { + this.version = version; + } + + public void updateVersion(Statement stmt, ISqlCommonConfig config) throws SQLException { + var table = SqlUtils.mapTable( + DataScope.TABLE_METADATA, config instanceof SqlCommonConfig scc ? scc.tablePrefix() : ""); + + if (config instanceof SqliteConfig) { + stmt.execute(String.format( + "INSERT INTO %s (%s, %s) VALUES ('%s', '%s') ON CONFLICT(%s) DO UPDATE SET %s='%s'", + table, + FIELD_TABLE_METADATA_KEY, + FIELD_TABLE_METADATA_VALUE, + METADATA_VERSION, + getVersion(), + FIELD_TABLE_METADATA_KEY, + FIELD_TABLE_METADATA_VALUE, + getVersion())); + } else { + stmt.execute(String.format( + "INSERT INTO %s (%s, %s) VALUES ('%s', '%s') ON DUPLICATE KEY UPDATE %s='%s', %s=%s", + table, + FIELD_TABLE_METADATA_KEY, + FIELD_TABLE_METADATA_VALUE, + METADATA_VERSION, + getVersion(), + FIELD_TABLE_METADATA_KEY, + METADATA_VERSION, + FIELD_TABLE_METADATA_VALUE, + getVersion())); + } + } + public abstract void patch(Statement stmt, ISqlCommonConfig config) throws SQLException; } diff --git a/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/patch/DatabasePatchV1.java b/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/patch/DatabasePatchV1.java index 07053e6f8f..1d12cabba4 100644 --- a/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/patch/DatabasePatchV1.java +++ b/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/patch/DatabasePatchV1.java @@ -1,36 +1,21 @@ package com.xzavier0722.mc.plugin.slimefun4.storage.patch; import static com.xzavier0722.mc.plugin.slimefun4.storage.adapter.sqlcommon.SqlConstants.FIELD_INVENTORY_ITEM; -import static com.xzavier0722.mc.plugin.slimefun4.storage.adapter.sqlcommon.SqlConstants.FIELD_TABLE_VERSION; import com.xzavier0722.mc.plugin.slimefun4.storage.adapter.mysql.MysqlConfig; import com.xzavier0722.mc.plugin.slimefun4.storage.adapter.sqlcommon.ISqlCommonConfig; -import com.xzavier0722.mc.plugin.slimefun4.storage.adapter.sqlcommon.SqlCommonConfig; import com.xzavier0722.mc.plugin.slimefun4.storage.adapter.sqlcommon.SqlUtils; -import com.xzavier0722.mc.plugin.slimefun4.storage.adapter.sqlite.SqliteConfig; import com.xzavier0722.mc.plugin.slimefun4.storage.common.DataScope; import java.sql.SQLException; import java.sql.Statement; public class DatabasePatchV1 extends DatabasePatch { public DatabasePatchV1() { - this.version = 1; + super(1); } @Override public void patch(Statement stmt, ISqlCommonConfig config) throws SQLException { - var table = SqlUtils.mapTable( - DataScope.TABLE_INFORMATION, config instanceof SqlCommonConfig scc ? scc.tablePrefix() : ""); - - if (config instanceof SqliteConfig) { - stmt.execute("INSERT INTO " + table + " (" + FIELD_TABLE_VERSION + ") SELECT " + getVersion() - + " WHERE NOT EXISTS (SELECT 1 FROM " + table + ");"); - stmt.execute("UPDATE " + table + " SET " + FIELD_TABLE_VERSION + " = '1' WHERE rowid = (SELECT rowid FROM " - + table + " LIMIT 1);"); - } else { - stmt.execute("UPDATE " + table + " SET " + FIELD_TABLE_VERSION + " = '1' LIMIT 1"); - } - if (config instanceof MysqlConfig mysqlConf) { var uniInvTable = SqlUtils.mapTable(DataScope.UNIVERSAL_INVENTORY, mysqlConf.tablePrefix()); stmt.execute("ALTER TABLE " + uniInvTable + " MODIFY COLUMN " + FIELD_INVENTORY_ITEM + " TEXT;"); diff --git a/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/patch/DatabasePatchV2.java b/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/patch/DatabasePatchV2.java new file mode 100644 index 0000000000..9ae086255a --- /dev/null +++ b/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/patch/DatabasePatchV2.java @@ -0,0 +1,20 @@ +package com.xzavier0722.mc.plugin.slimefun4.storage.patch; + +import com.xzavier0722.mc.plugin.slimefun4.storage.adapter.sqlcommon.ISqlCommonConfig; +import com.xzavier0722.mc.plugin.slimefun4.storage.adapter.sqlcommon.SqlCommonConfig; +import com.xzavier0722.mc.plugin.slimefun4.storage.adapter.sqlcommon.SqlConstants; +import java.sql.SQLException; +import java.sql.Statement; + +public class DatabasePatchV2 extends DatabasePatch { + + public DatabasePatchV2() { + super(2); + } + + @Override + public void patch(Statement stmt, ISqlCommonConfig config) throws SQLException { + var tablePrefix = config instanceof SqlCommonConfig scc ? scc.tablePrefix() : ""; + stmt.execute("DROP TABLE IF EXISTS " + tablePrefix + SqlConstants.TABLE_NAME_TABLE_INFORMATION); + } +} From cc1da97e79b0bae036643996d162b18e89900a21 Mon Sep 17 00:00:00 2001 From: StarWishsama Date: Tue, 11 Feb 2025 19:00:18 +0800 Subject: [PATCH 15/15] fix(wrapper): setValue should handle null properly (#1019) --- .../slimefun4/storage/controller/BlockDataConfigWrapper.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/controller/BlockDataConfigWrapper.java b/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/controller/BlockDataConfigWrapper.java index e1a0c55d73..fd7f7fcbb1 100644 --- a/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/controller/BlockDataConfigWrapper.java +++ b/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/controller/BlockDataConfigWrapper.java @@ -73,6 +73,10 @@ public void setDefaultValue(@Nonnull String path, @Nullable Object value) { @Override public void setValue(@Nonnull String path, Object value) { + if (value == null) { + blockData.removeData(path); + } + if (!(value instanceof String str)) { throw new NotImplementedException(); }