Skip to content

Commit e080f3d

Browse files
committed
バグ修正
1 parent 840eee6 commit e080f3d

File tree

7 files changed

+185
-13
lines changed

7 files changed

+185
-13
lines changed

src/main/java/dev/felnull/BetterStorage.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
import dev.felnull.DataIO.TableInitializer;
55
import dev.felnull.Listeners.CommonListener;
66
import dev.felnull.commands.BetterStorageCommand;
7+
import dev.felnull.commands.CheckDBCommand;
8+
import dev.felnull.commands.RawSQLCommand;
79
import org.bukkit.Bukkit;
810
import org.bukkit.plugin.java.JavaPlugin;
911

@@ -24,10 +26,10 @@ public void onEnable() {
2426
e.printStackTrace();
2527
}
2628
initEventListeners();
27-
initCommands();
28-
dbManager = new DatabaseManager();
2929
saveDefaultConfig();
30+
dbManager = new DatabaseManager();
3031
LogCleanerScheduler.schedule(dbManager);
32+
initCommands();
3133
//ロガーの起動
3234
//Vault呼び出し
3335
//CSDirectorをnewで呼び出してメインクラスのpublic変数に置く
@@ -41,6 +43,9 @@ private void initEventListeners() {
4143
private void initCommands() {
4244
getCommand("bstorage").setExecutor(new BetterStorageCommand());
4345
getCommand("bstorage").setTabCompleter(new BetterStorageCommand());
46+
getCommand("bscheckdb").setExecutor(new CheckDBCommand(dbManager));
47+
getCommand("bsrawsql").setExecutor(new RawSQLCommand(dbManager));
48+
4449
}
4550

4651

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

Lines changed: 37 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@ public class DataIO {
2727

2828
/** グループ全体を保存(各テーブルへの分割保存) */
2929
public static boolean saveGroupData(GroupData g, long clientVersion) {
30+
31+
Bukkit.getLogger().info("[DEBUG] 保存対象 groupUUID: " + g.groupUUID);
32+
Bukkit.getLogger().info("[DEBUG] 保存対象 groupName: " + g.groupName);
3033
try (Connection conn = db.getConnection()) {
3134
// 最新version取得
3235
String selectSql = "SELECT version FROM group_table WHERE group_uuid = ?";
@@ -40,6 +43,7 @@ public static boolean saveGroupData(GroupData g, long clientVersion) {
4043

4144
// バージョン不一致なら競合
4245
if (dbVersion != clientVersion) {
46+
Bukkit.getLogger().info("V不一致");
4347
return false;
4448
}
4549

@@ -69,6 +73,7 @@ public static boolean saveGroupData(GroupData g, long clientVersion) {
6973

7074
// 成功したので差分ログを保存
7175
DiffLogManager.saveDiffLogs(BetterStorage.BSPlugin.getDatabaseManager(), g);
76+
Bukkit.getLogger().info("保存成功らしい");
7277
return true;
7378
} catch (SQLException e) {
7479
Bukkit.getLogger().warning("GroupDataの保存に失敗: " + e.getMessage());
@@ -171,15 +176,23 @@ private static void saveStorageData(Connection conn, GroupData g) throws SQLExce
171176
}
172177
}
173178

174-
public static boolean saveInventoryOnly(GroupData g, String pageId) {
179+
public static boolean saveInventoryOnly(GroupData g, StorageData storageData, String pageId) {
175180
try (Connection conn = db.getConnection()) {
176-
InventoryData inv = g.storageData.storageInventory.get(pageId);
177-
if (inv == null) return false;
181+
InventoryData inv = storageData.storageInventory.get(pageId);
182+
storageData.groupUUID = g.groupUUID;
183+
g.storageData = storageData;
184+
if (inv == null) {
185+
return false;
186+
}
178187

179-
if (!inv.isFullyLoaded()) return false;
188+
if (!inv.isFullyLoaded()) {
189+
g.storageData.loadPage(conn, g.ownerPlugin, pageId);
190+
}
180191

181192
long dbVersion = getGroupVersion(conn, g.groupUUID);
182-
if (dbVersion != g.version) return false;
193+
if (dbVersion != g.version) {
194+
return false;
195+
}
183196
g.version = dbVersion + 1;
184197

185198
saveSinglePage(conn, g, pageId, inv);
@@ -345,22 +358,37 @@ private static StorageData loadStorageMetaOnly(Connection conn, UUID groupUUID)
345358
try (PreparedStatement ps = conn.prepareStatement(
346359
"SELECT plugin_name, bank_money, require_bank_permission FROM storage_table WHERE group_uuid = ?")) {
347360
ps.setString(1, groupUUID.toString());
361+
362+
Bukkit.getLogger().info("[Debug] Executing query for group_uuid = " + groupUUID);
363+
348364
try (ResultSet rs = ps.executeQuery()) {
349-
if (!rs.next()) return null;
365+
if (!rs.next()){
366+
Bukkit.getLogger().warning("[Debug] No result found for group_uuid = " + groupUUID);
367+
return null;
368+
}
350369
pluginName = rs.getString("plugin_name");
351370
bankMoney = rs.getDouble("bank_money");
371+
String requireBankPermRaw = rs.getString("require_bank_permission");
352372
requireBankPerm = gson.fromJson(rs.getString("require_bank_permission"), new TypeToken<Set<String>>() {}.getType());
373+
374+
Bukkit.getLogger().info("[Debug] Loaded: plugin=" + pluginName + ", bank=" + bankMoney + ", perms=" + requireBankPermRaw);
353375
}
354376
}
355377

356378
Map<String, InventoryData> invMap = loadInventoryMetaOnly(conn, groupUUID, pluginName);
379+
if (invMap == null) {
380+
Bukkit.getLogger().warning("[Debug] Inventory meta load failed for groupUUID = " + groupUUID);
381+
return null;
382+
}
357383
StorageData storageData = new StorageData(requireBankPerm, invMap, bankMoney);
384+
storageData.groupData = GroupManager.getGroupByUUID(groupUUID);
358385
storageData.setFullyLoaded(false);
359386
return storageData;
360387
}
361388
//外部呼出し用
362389
public static StorageData loadStorageMetaOnly(UUID groupUUID) {
363390
try (Connection conn = db.getConnection()) {
391+
Bukkit.getLogger().info("[Debug] loadStorageMetaOnly: groupUUID = " + groupUUID);
364392
return loadStorageMetaOnly(conn, groupUUID);
365393
} catch (SQLException e) {
366394
Bukkit.getLogger().warning("StorageMetaの読み込みに失敗: " + e.getMessage());
@@ -403,10 +431,11 @@ private static Map<String, InventoryData> loadInventoryMetaOnly(Connection conn,
403431
//外部呼出し用
404432
public static Map<String, InventoryData> loadInventoryMetaOnly(UUID groupUUID, String pluginName) {
405433
try (Connection conn = db.getConnection()) {
406-
return loadInventoryMetaOnly(conn, groupUUID, pluginName);
434+
Map<String, InventoryData> result = loadInventoryMetaOnly(conn, groupUUID, pluginName);
435+
return result.isEmpty() ? null : result;
407436
} catch (SQLException e) {
408437
Bukkit.getLogger().warning("InventoryMetaの読み込みに失敗: " + e.getMessage());
409-
return Collections.emptyMap();
438+
return null;
410439
}
411440
}
412441

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,8 +96,9 @@ public static List<String> getAllGroupNames() {
9696
/**個人向けグループデータを取得**/
9797
public static @Nullable GroupData getPersonalGroup(UUID playerUUID) {
9898
return getAllGroups().stream()
99-
.filter(g -> g.isPrivate && g.groupUUID.equals(playerUUID))
99+
.filter(g -> g.isPrivate && g.groupName.equals(playerUUID.toString()))
100100
.findFirst()
101101
.orElse(null);
102102
}
103+
103104
}

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

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

33
import dev.felnull.BetterStorage;
44
import org.bukkit.Bukkit;
5+
import org.bukkit.configuration.file.FileConfiguration;
56

67
import java.sql.*;
7-
import java.util.LinkedHashMap;
8-
import java.util.Map;
8+
import java.util.*;
99
import java.util.logging.Logger;
1010

1111
public class TableInitializer {
@@ -154,4 +154,6 @@ private static String getTableNameFromIndex(String indexName) {
154154
if (indexName.contains("inventory")) return "inventory_table";
155155
return "";
156156
}
157+
158+
157159
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package dev.felnull.commands;
2+
3+
import dev.felnull.DataIO.DatabaseManager;
4+
import org.bukkit.command.Command;
5+
import org.bukkit.command.CommandExecutor;
6+
import org.bukkit.command.CommandSender;
7+
8+
import java.sql.Connection;
9+
import java.sql.PreparedStatement;
10+
import java.sql.ResultSet;
11+
import java.sql.SQLException;
12+
import java.util.ArrayList;
13+
import java.util.List;
14+
15+
public class CheckDBCommand implements CommandExecutor {
16+
17+
private final DatabaseManager db;
18+
19+
public CheckDBCommand(DatabaseManager db) {
20+
this.db = db;
21+
}
22+
23+
@Override
24+
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
25+
sender.sendMessage("§e[BetterStorage] DB整合性チェックを開始しますにゃ…");
26+
27+
try (Connection conn = db.getConnection()) {
28+
// storage_table に存在する group_uuid で、group_table に存在しないものを探す
29+
String sql = "SELECT s.group_uuid FROM storage_table s LEFT JOIN group_table g ON s.group_uuid = g.group_uuid WHERE g.group_uuid IS NULL";
30+
try (PreparedStatement ps = conn.prepareStatement(sql);
31+
ResultSet rs = ps.executeQuery()) {
32+
33+
List<String> brokenUUIDs = new ArrayList<>();
34+
while (rs.next()) {
35+
brokenUUIDs.add(rs.getString("group_uuid"));
36+
}
37+
38+
if (brokenUUIDs.isEmpty()) {
39+
sender.sendMessage("§a整合性チェック完了:異常なしにゃ!");
40+
} else {
41+
sender.sendMessage("§c破損データを検出!以下の group_uuid に対応するグループが存在しないにゃ:");
42+
for (String uuid : brokenUUIDs) {
43+
sender.sendMessage(" - §e" + uuid);
44+
}
45+
}
46+
47+
}
48+
} catch (SQLException e) {
49+
sender.sendMessage("§cエラーが発生したにゃ:" + e.getMessage());
50+
e.printStackTrace();
51+
}
52+
53+
return true;
54+
}
55+
}
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
package dev.felnull.commands;
2+
3+
import dev.felnull.DataIO.DatabaseManager;
4+
import org.bukkit.ChatColor;
5+
import org.bukkit.command.Command;
6+
import org.bukkit.command.CommandExecutor;
7+
import org.bukkit.command.CommandSender;
8+
9+
import java.sql.*;
10+
11+
public class RawSQLCommand implements CommandExecutor {
12+
private final DatabaseManager db;
13+
14+
public RawSQLCommand(DatabaseManager db) {
15+
this.db = db;
16+
}
17+
18+
@Override
19+
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
20+
21+
if (args.length == 0) {
22+
sender.sendMessage(ChatColor.RED + "SQL文を指定してください!");
23+
return false;
24+
}
25+
26+
String sql = String.join(" ", args);
27+
28+
try (Connection conn = db.getConnection(); Statement stmt = conn.createStatement()) {
29+
30+
String lowerSQL = sql.trim().toLowerCase();
31+
32+
if (lowerSQL.startsWith("select") || lowerSQL.startsWith("show") || lowerSQL.startsWith("desc")) {
33+
try (ResultSet rs = stmt.executeQuery(sql)) {
34+
ResultSetMetaData meta = rs.getMetaData();
35+
int columnCount = meta.getColumnCount();
36+
37+
// ヘッダ行
38+
StringBuilder header = new StringBuilder(ChatColor.YELLOW + "[結果]");
39+
for (int i = 1; i <= columnCount; i++) {
40+
header.append(" | ").append(meta.getColumnLabel(i));
41+
}
42+
sender.sendMessage(header.toString());
43+
44+
// データ行
45+
int rowCount = 0;
46+
while (rs.next() && rowCount < 10) { // 上限10行まで表示(多すぎ防止)
47+
StringBuilder row = new StringBuilder();
48+
for (int i = 1; i <= columnCount; i++) {
49+
row.append(" | ").append(rs.getString(i));
50+
}
51+
sender.sendMessage(row.toString());
52+
rowCount++;
53+
}
54+
55+
if (rs.next()) {
56+
sender.sendMessage(ChatColor.GRAY + "...さらに結果があります(10行のみ表示)");
57+
}
58+
59+
}
60+
} else {
61+
int rows = stmt.executeUpdate(sql);
62+
sender.sendMessage(ChatColor.GREEN + "SQL実行成功にゃ!影響行数: " + rows);
63+
}
64+
65+
} catch (SQLException e) {
66+
sender.sendMessage(ChatColor.RED + "SQL実行エラー: " + e.getMessage());
67+
e.printStackTrace();
68+
}
69+
70+
return true;
71+
}
72+
}

src/main/resources/plugin.yml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,14 @@ commands:
1010
usage: /<command> rollback|list|diff|help
1111
permission: betterstorage.command
1212
permission-message: 権限がありませんにゃ。
13+
bscheckdb:
14+
description: DB整合性を確認するにゃ
15+
usage: /bscheckdb
16+
permission: betterstorage.command
17+
bsrawsql:
18+
description: 任意SQLを実行する開発者用コマンド
19+
usage: /bsrawsql <SQL文>
20+
permission: betterstorage.command
1321
permissions:
1422
betterstorage.command:
1523
description: BetterStorageコマンドの使用を許可するにゃ。

0 commit comments

Comments
 (0)