Skip to content

Commit 9fd2614

Browse files
committed
ロールバック処理のバグ修正
1 parent ecdbbc4 commit 9fd2614

File tree

8 files changed

+145
-19
lines changed

8 files changed

+145
-19
lines changed

src/main/java/dev/felnull/Data/GroupStorageBackup.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@
44

55
public class GroupStorageBackup {
66
public UUID groupUUID;
7-
public StorageData storageData;
7+
public StorageDataBackup storageData;
88
public long version;
99

10-
public GroupStorageBackup(UUID groupUUID, StorageData storageData, long version) {
10+
public GroupStorageBackup(UUID groupUUID, StorageDataBackup storageData, long version) {
1111
this.groupUUID = groupUUID;
1212
this.storageData = storageData;
1313
this.version = version;
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package dev.felnull.Data;
2+
3+
import dev.felnull.DataIO.ItemSerializer;
4+
import org.bukkit.inventory.ItemStack;
5+
6+
import java.util.*;
7+
8+
public class InventoryDataBackup {
9+
public String displayName;
10+
public int rows;
11+
public Set<String> requirePermission;
12+
public Map<Integer, String> itemStackBase64 = new HashMap<>(); // ← Base64形式に変える
13+
public List<String> userTags;
14+
15+
public InventoryDataBackup(InventoryData original) {
16+
this.displayName = original.displayName;
17+
this.rows = original.rows;
18+
this.requirePermission = new HashSet<>(original.requirePermission);
19+
this.userTags = new ArrayList<>(original.userTags);
20+
21+
for (Map.Entry<Integer, ItemStack> entry : original.itemStackSlot.entrySet()) {
22+
String base64 = ItemSerializer.serializeToBase64(entry.getValue());
23+
itemStackBase64.put(entry.getKey(), base64);
24+
}
25+
}
26+
}

src/main/java/dev/felnull/Data/StorageData.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,4 +53,5 @@ public void attach(GroupData group) {
5353
this.groupUUID = group.groupUUID;
5454
this.groupData.storageData = this;
5555
}
56-
}
56+
}
57+
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package dev.felnull.Data;
2+
3+
import dev.felnull.DataIO.ItemSerializer;
4+
import org.bukkit.inventory.ItemStack;
5+
6+
import java.util.*;
7+
8+
public class StorageDataBackup {
9+
public Set<String> requireBankPermission;
10+
public double bankMoney;
11+
public Map<String, InventoryDataBackup> storageInventory = new HashMap<>();
12+
13+
public StorageDataBackup(StorageData original) {
14+
this.requireBankPermission = original.requireBankPermission;
15+
this.bankMoney = original.bankMoney;
16+
17+
for (Map.Entry<String, InventoryData> entry : original.storageInventory.entrySet()) {
18+
String pageId = entry.getKey();
19+
InventoryData originalInv = entry.getValue();
20+
storageInventory.put(pageId, new InventoryDataBackup(originalInv));
21+
}
22+
}
23+
24+
public StorageData toStorageData() {
25+
StorageData data = new StorageData(requireBankPermission, new HashMap<>(), bankMoney);
26+
27+
for (Map.Entry<String, InventoryDataBackup> entry : storageInventory.entrySet()) {
28+
String pageId = entry.getKey();
29+
InventoryDataBackup backup = entry.getValue();
30+
31+
Map<Integer, ItemStack> slotMap = new HashMap<>();
32+
for (Map.Entry<Integer, String> itemEntry : backup.itemStackBase64.entrySet()) {
33+
ItemStack item = ItemSerializer.deserializeFromBase64(itemEntry.getValue());
34+
slotMap.put(itemEntry.getKey(), item);
35+
}
36+
37+
InventoryData inv = new InventoryData(
38+
backup.displayName,
39+
backup.rows,
40+
backup.requirePermission,
41+
slotMap
42+
);
43+
inv.userTags = backup.userTags;
44+
data.storageInventory.put(pageId, inv);
45+
}
46+
47+
return data;
48+
}
49+
}

src/main/java/dev/felnull/DataIO/ItemSerializer.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@
1111

1212
public class ItemSerializer {
1313
public static String serializeToBase64(ItemStack item) {
14+
if (item == null) {
15+
return null; // ← nullのまま返す(DB保存時にNULLとして扱える)
16+
}
1417
try (ByteArrayOutputStream baos = new ByteArrayOutputStream();
1518
BukkitObjectOutputStream oos = new BukkitObjectOutputStream(baos)) {
1619
oos.writeObject(item);
@@ -21,6 +24,9 @@ public static String serializeToBase64(ItemStack item) {
2124
}
2225

2326
public static ItemStack deserializeFromBase64(String base64) {
27+
if (base64 == null) {
28+
return null; // ← ここで防ぐ
29+
}
2430
byte[] data = Base64.getDecoder().decode(base64);
2531
try (BukkitObjectInputStream ois = new BukkitObjectInputStream(new ByteArrayInputStream(data))) {
2632
return (ItemStack) ois.readObject();

src/main/java/dev/felnull/DataIO/TableInitializer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ public static void initTables() {
136136
"CREATE TABLE IF NOT EXISTS rollback_log (" +
137137
"group_uuid VARCHAR(255) NOT NULL, " + // 所属グループ
138138
"timestamp TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, " + // バックアップ時刻
139-
"json_data LONGTEXT NOT NULL, " + // グループ全体のシリアライズJSON
139+
"json_data LONGBLOB NOT NULL, " + // グループ全体のシリアライズJSON(※圧縮バイナリ対応のためLONGBLOBに変更)
140140
"PRIMARY KEY (group_uuid, timestamp)" + // 時刻単位で識別
141141
");"
142142
);

src/main/java/dev/felnull/DataIO/UnifiedLogManager.java

Lines changed: 50 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,7 @@
22

33
import com.google.gson.Gson;
44
import dev.felnull.BetterStorage;
5-
import dev.felnull.Data.GroupData;
6-
import dev.felnull.Data.GroupStorageBackup;
7-
import dev.felnull.Data.InventoryData;
8-
import dev.felnull.Data.StorageData;
5+
import dev.felnull.Data.*;
96
import org.bukkit.Bukkit;
107
import org.bukkit.ChatColor;
118
import org.bukkit.Material;
@@ -20,6 +17,7 @@
2017
import java.time.format.DateTimeFormatter;
2118
import java.time.format.DateTimeParseException;
2219
import java.util.*;
20+
import java.util.logging.Logger;
2321
import java.util.zip.GZIPInputStream;
2422
import java.util.zip.GZIPOutputStream;
2523

@@ -28,22 +26,62 @@ public class UnifiedLogManager {
2826
private static final Gson gson = new Gson();
2927

3028
// === 1. スナップショット保存(過去の状態をGZIP+JSONで保存) ===
31-
public static void saveBackupSnapshot(GroupData groupData) {
29+
public static boolean saveBackupSnapshot(GroupData groupData) {
30+
Logger logger = Bukkit.getLogger();
31+
32+
logger.info("[Debug] groupUUID: " + groupData.groupUUID);
33+
logger.info("[Debug] version: " + groupData.version);
34+
35+
StorageData storage = groupData.storageData;
36+
if (storage == null) {
37+
logger.warning("[BetterStorage] スナップショット保存失敗: storageData が null");
38+
return false;
39+
}
40+
41+
// --- デバッグ出力 ---
42+
logger.info("[Debug] bankMoney: " + storage.bankMoney);
43+
logger.info("[Debug] inventory pages: " + storage.storageInventory.size());
44+
for (Map.Entry<String, InventoryData> entry : storage.storageInventory.entrySet()) {
45+
String pageId = entry.getKey();
46+
InventoryData inv = entry.getValue();
47+
logger.info(" [Page] " + pageId + " rows: " + inv.rows + " items: " + inv.itemStackSlot.size());
48+
49+
for (Map.Entry<Integer, ItemStack> slotEntry : inv.itemStackSlot.entrySet()) {
50+
int slot = slotEntry.getKey();
51+
ItemStack item = slotEntry.getValue();
52+
ItemMeta meta = item.getItemMeta();
53+
logger.info(" [Slot " + slot + "] Type: " + item.getType() + ", Meta: " + meta.getClass().getName());
54+
String displayName = meta.hasDisplayName() ? meta.getDisplayName() : "none";
55+
logger.info(" → displayName: " + displayName);
56+
57+
List<String> lore = meta.getLore();
58+
if (lore != null) {
59+
for (String line : lore) {
60+
logger.info(" → lore: " + line);
61+
}
62+
}
63+
}
64+
}
65+
3266
try (Connection conn = BetterStorage.BSPlugin.getDatabaseManager().getConnection()) {
3367
String sql = "INSERT INTO rollback_log (group_uuid, timestamp, json_data) VALUES (?, ?, ?)";
3468
try (PreparedStatement ps = conn.prepareStatement(sql)) {
35-
GroupStorageBackup backup = new GroupStorageBackup(
36-
groupData.groupUUID, groupData.storageData, groupData.version
37-
);
69+
storage.detach();
70+
StorageDataBackup safeCopy = new StorageDataBackup(storage);
71+
GroupStorageBackup backup = new GroupStorageBackup(groupData.groupUUID, safeCopy, groupData.version);
72+
3873
String json = gson.toJson(backup);
3974
byte[] compressed = compress(json.getBytes());
75+
4076
ps.setString(1, groupData.groupUUID.toString());
4177
ps.setString(2, LocalDateTime.now().format(FORMATTER));
4278
ps.setBytes(3, compressed);
4379
ps.executeUpdate();
4480
}
81+
return true;
4582
} catch (Exception e) {
46-
Bukkit.getLogger().warning("バックアップスナップショット保存失敗: " + e.getMessage());
83+
logger.warning("バックアップスナップショット保存失敗: " + e.getMessage());
84+
return false;
4785
}
4886
}
4987
private static byte[] compress(byte[] input) throws IOException {
@@ -108,7 +146,7 @@ public static void restoreSnapshot(GroupData group, GroupStorageBackup backup) {
108146
group.version = backup.version;
109147

110148
// 古いStorageDataを復元
111-
StorageData restored = backup.storageData;
149+
StorageData restored = backup.storageData.toStorageData();
112150
restored.attach(group); // GroupDataと結び付け
113151
group.storageData = restored;
114152

@@ -147,8 +185,8 @@ public static boolean restoreGroupToTimestamp(UUID groupUUID, LocalDateTime targ
147185
return false;
148186
}
149187

150-
backup.storageData.attach(group);
151-
group.storageData = backup.storageData;
188+
backup.storageData.toStorageData().attach(group);
189+
group.storageData = backup.storageData.toStorageData();
152190
group.version = backup.version;
153191

154192
// 3. スナップショット以降の差分を適用

src/main/java/dev/felnull/commands/BetterStorageCommand.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -263,9 +263,15 @@ public void run() {
263263
return;
264264
}
265265

266-
UnifiedLogManager.saveBackupSnapshot(groupData);
267-
Bukkit.getScheduler().runTask(BetterStorage.BSPlugin, () ->
268-
sender.sendMessage("ロールバック用バックアップを保存しました。"));
266+
boolean success = UnifiedLogManager.saveBackupSnapshot(groupData);
267+
Bukkit.getScheduler().runTask(BetterStorage.BSPlugin, () -> {
268+
if (success) {
269+
sender.sendMessage("ロールバック用バックアップを保存しました。");
270+
} else {
271+
sender.sendMessage("ロールバック用バックアップを保存できませんでした...");
272+
}
273+
}
274+
);
269275
}
270276
}.runTaskAsynchronously(BetterStorage.BSPlugin);
271277
return true;

0 commit comments

Comments
 (0)