diff --git a/pom.xml b/pom.xml index 6d66674..319d6f3 100644 --- a/pom.xml +++ b/pom.xml @@ -82,7 +82,7 @@ cn.lunadeer MinecraftPluginUtils - 1.3.3-SNAPSHOT + 1.3.4-SNAPSHOT com.github.BlueMap-Minecraft diff --git a/src/main/java/cn/lunadeer/dominion/Dominion.java b/src/main/java/cn/lunadeer/dominion/Dominion.java index 16417bc..9b80fa2 100644 --- a/src/main/java/cn/lunadeer/dominion/Dominion.java +++ b/src/main/java/cn/lunadeer/dominion/Dominion.java @@ -6,6 +6,8 @@ import cn.lunadeer.dominion.events.SelectPointEvents; import cn.lunadeer.dominion.managers.ConfigManager; import cn.lunadeer.dominion.managers.DatabaseTables; import cn.lunadeer.minecraftpluginutils.*; +import cn.lunadeer.minecraftpluginutils.databse.DatabaseManager; +import cn.lunadeer.minecraftpluginutils.databse.DatabaseType; import cn.lunadeer.minecraftpluginutils.scui.CuiManager; import org.bukkit.Bukkit; import org.bukkit.Location; @@ -26,8 +28,8 @@ public final class Dominion extends JavaPlugin { new XLogger(this); config = new ConfigManager(this); XLogger.setDebug(config.isDebug()); - database = new DatabaseManager(this, - DatabaseManager.TYPE.valueOf(config.getDbType().toUpperCase()), + new DatabaseManager(this, + DatabaseType.valueOf(config.getDbType().toUpperCase()), config.getDbHost(), config.getDbPort(), config.getDbName(), @@ -74,12 +76,11 @@ public final class Dominion extends JavaPlugin { @Override public void onDisable() { // Plugin shutdown logic - database.close(); + DatabaseManager.instance.close(); } public static Dominion instance; public static ConfigManager config; - public static DatabaseManager database; public static Map> pointsSelect = new HashMap<>(); private GiteaReleaseCheck giteaReleaseCheck; } diff --git a/src/main/java/cn/lunadeer/dominion/dtos/DominionDTO.java b/src/main/java/cn/lunadeer/dominion/dtos/DominionDTO.java index 2f3a548..347b95c 100644 --- a/src/main/java/cn/lunadeer/dominion/dtos/DominionDTO.java +++ b/src/main/java/cn/lunadeer/dominion/dtos/DominionDTO.java @@ -3,6 +3,7 @@ package cn.lunadeer.dominion.dtos; import cn.lunadeer.dominion.Cache; import cn.lunadeer.dominion.Dominion; import cn.lunadeer.minecraftpluginutils.XLogger; +import cn.lunadeer.minecraftpluginutils.databse.DatabaseManager; import org.bukkit.Location; import org.bukkit.World; @@ -15,7 +16,7 @@ import java.util.List; public class DominionDTO { private static List query(String sql, Object... args) { List dominions = new ArrayList<>(); - try (ResultSet rs = Dominion.database.query(sql, args)) { + try (ResultSet rs = DatabaseManager.instance.query(sql, args)) { if (sql.contains("UPDATE") || sql.contains("DELETE") || sql.contains("INSERT")) { // 如果是更新操作,重新加载缓存 Cache.instance.loadDominions(); diff --git a/src/main/java/cn/lunadeer/dominion/managers/DatabaseTables.java b/src/main/java/cn/lunadeer/dominion/managers/DatabaseTables.java index 0dc1548..4d87c8a 100644 --- a/src/main/java/cn/lunadeer/dominion/managers/DatabaseTables.java +++ b/src/main/java/cn/lunadeer/dominion/managers/DatabaseTables.java @@ -1,119 +1,159 @@ package cn.lunadeer.dominion.managers; -import cn.lunadeer.dominion.Dominion; import cn.lunadeer.dominion.dtos.Flag; +import cn.lunadeer.minecraftpluginutils.databse.Field; +import cn.lunadeer.minecraftpluginutils.databse.FieldType; +import cn.lunadeer.minecraftpluginutils.databse.TableColumn; +import cn.lunadeer.minecraftpluginutils.databse.syntax.AddColumn; +import cn.lunadeer.minecraftpluginutils.databse.syntax.CreateTable; +import cn.lunadeer.minecraftpluginutils.databse.syntax.InsertRow; public class DatabaseTables { public static void migrate() { - String sql = ""; - // player name - Dominion.database.createTableIfNotExists( - "player_name", - new String[]{"id", "uuid", "last_known_name", "last_join_at"}, - new String[]{"SERIAL PRIMARY KEY", "VARCHAR(36) NOT NULL UNIQUE", "TEXT NOT NULL", "TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP"}, - null - ); + TableColumn player_name_id = new TableColumn("id", FieldType.INT, true, true, true, true, null); + TableColumn player_name_uuid = new TableColumn("uuid", FieldType.STRING, false, false, true, true, null); + TableColumn player_name_last_known_name = new TableColumn("last_known_name", FieldType.STRING, false, false, true, false, null); + TableColumn player_name_last_join_at = new TableColumn("last_join_at", FieldType.DATETIME, false, false, true, false, "CURRENT_TIMESTAMP"); + CreateTable player_name = new CreateTable().ifNotExists(); + player_name.table("player_name") + .field(player_name_id) + .field(player_name_uuid) + .field(player_name_last_known_name) + .field(player_name_last_join_at); + player_name.execute(); // dominion table - Dominion.database.createTableIfNotExists( - "dominion", - new String[]{"id", - "owner", - "name", - "world", - "x1", "y1", "z1", "x2", "y2", "z2", - "parent_dom_id", - "join_message", - "leave_message"}, - new String[]{ - "SERIAL PRIMARY KEY", - "VARCHAR(36) NOT NULL", - "TEXT NOT NULL UNIQUE", - "TEXT NOT NULL", "INT NOT NULL", "INT NOT NULL", "INT NOT NULL", "INT NOT NULL", "INT NOT NULL", "INT NOT NULL", - "INT NOT NULL DEFAULT -1", - "TEXT NOT NULL DEFAULT '欢迎'", - "TEXT NOT NULL DEFAULT '再见'"}, - new String[]{ - "FOREIGN KEY (owner) REFERENCES player_name(uuid) ON DELETE CASCADE", - "FOREIGN KEY (parent_dom_id) REFERENCES dominion(id) ON DELETE CASCADE" - } - ); + TableColumn dominion_id = new TableColumn("id", FieldType.INT, true, true, true, true, null); + TableColumn dominion_owner = new TableColumn("owner", FieldType.STRING, false, false, true, false, null); + TableColumn dominion_name = new TableColumn("name", FieldType.STRING, false, false, true, false, null); + TableColumn dominion_world = new TableColumn("world", FieldType.STRING, false, false, true, false, null); + TableColumn dominion_x1 = new TableColumn("x1", FieldType.INT, false, false, true, false, null); + TableColumn dominion_y1 = new TableColumn("y1", FieldType.INT, false, false, true, false, null); + TableColumn dominion_z1 = new TableColumn("z1", FieldType.INT, false, false, true, false, null); + TableColumn dominion_x2 = new TableColumn("x2", FieldType.INT, false, false, true, false, null); + TableColumn dominion_y2 = new TableColumn("y2", FieldType.INT, false, false, true, false, null); + TableColumn dominion_z2 = new TableColumn("z2", FieldType.INT, false, false, true, false, null); + TableColumn dominion_parent_dom_id = new TableColumn("parent_dom_id", FieldType.INT, false, false, true, false, -1); + TableColumn dominion_join_message = new TableColumn("join_message", FieldType.STRING, false, false, true, false, "'欢迎'"); + TableColumn dominion_leave_message = new TableColumn("leave_message", FieldType.STRING, false, false, true, false, "'再见'"); + CreateTable.ForeignKey dominion_owner_fk = new CreateTable.ForeignKey(dominion_owner, "player_name", player_name_uuid, true); + CreateTable.ForeignKey dominion_parent_dom_id_fk = new CreateTable.ForeignKey(dominion_parent_dom_id, "dominion", dominion_id, true); + CreateTable dominion = new CreateTable().ifNotExists(); + dominion.table("dominion") + .field(dominion_id) + .field(dominion_owner) + .field(dominion_name) + .field(dominion_world) + .field(dominion_x1) + .field(dominion_y1) + .field(dominion_z1) + .field(dominion_x2) + .field(dominion_y2) + .field(dominion_z2) + .field(dominion_parent_dom_id) + .field(dominion_join_message) + .field(dominion_leave_message) + .foreignKey(dominion_owner_fk) + .foreignKey(dominion_parent_dom_id_fk); + dominion.execute(); // player privilege - Dominion.database.createTableIfNotExists( - "player_privilege", - new String[]{"id", "player_uuid", "dom_id", "admin"}, - new String[]{"SERIAL PRIMARY KEY", "VARCHAR(36) NOT NULL", "INT NOT NULL", "BOOLEAN NOT NULL DEFAULT FALSE"}, - new String[]{ - "UNIQUE (player_uuid, dom_id)", - "FOREIGN KEY (player_uuid) REFERENCES player_name(uuid) ON DELETE CASCADE", - "FOREIGN KEY (dom_id) REFERENCES dominion(id) ON DELETE CASCADE" - } - ); + TableColumn player_privilege_id = new TableColumn("id", FieldType.INT, true, true, true, true, null); + TableColumn player_privilege_player_uuid = new TableColumn("player_uuid", FieldType.STRING, false, false, true, false, null); + TableColumn player_privilege_dom_id = new TableColumn("dom_id", FieldType.INT, false, false, true, false, null); + TableColumn player_privilege_admin = new TableColumn("admin", FieldType.BOOLEAN, false, false, true, false, false); + CreateTable.ForeignKey player_privilege_player_uuid_fk = new CreateTable.ForeignKey(player_privilege_player_uuid, "player_name", player_name_uuid, true); + CreateTable.ForeignKey player_privilege_dom_id_fk = new CreateTable.ForeignKey(player_privilege_dom_id, "dominion", dominion_id, true); + CreateTable player_privilege = new CreateTable().ifNotExists(); + player_privilege.table("player_privilege") + .field(player_privilege_id) + .field(player_privilege_player_uuid) + .field(player_privilege_dom_id) + .field(player_privilege_admin) + .foreignKey(player_privilege_player_uuid_fk) + .foreignKey(player_privilege_dom_id_fk) + .unique(player_privilege_player_uuid, player_privilege_dom_id); + player_name.execute(); - Dominion.database.insertRowIfNotExists("player_name", - new String[]{"id", "uuid", "last_known_name"}, - new String[]{"-1", "00000000-0000-0000-0000-000000000000", "server"}, - 0 - ); + // server root player name + Field server_player_name_id_field = new Field("id", -1); + Field server_player_name_uuid_field = new Field("uuid", "00000000-0000-0000-0000-000000000000"); + Field server_player_name_last_known_name_field = new Field("last_known_name", "server"); + InsertRow insert_server_player_name = new InsertRow().table("player_name").onConflictDoNothing(server_player_name_id_field) + .field(server_player_name_id_field) + .field(server_player_name_uuid_field) + .field(server_player_name_last_known_name_field); + insert_server_player_name.execute(); - Dominion.database.insertRowIfNotExists("dominion", - new String[]{ - "id", - "owner", - "name", - "world", - "x1", "y1", "z1", "x2", "y2", "z2", - "parent_dom_id", - "join_message", - "leave_message"}, - new String[]{ - "-1", - "00000000-0000-0000-0000-000000000000", - "根领地", - "all", - "-2147483648", "-2147483648", "-2147483648", - "2147483647", "2147483647", "2147483647", - "-1", - "欢迎", - "再见"}, - 0 - ); + // server root dominion + Field server_dom_id_field = new Field("id", -1); + Field server_dom_owner_field = new Field("owner", "00000000-0000-0000-0000-000000000000"); + Field server_dom_name_field = new Field("name", "根领地"); + Field server_dom_world_field = new Field("world", "all"); + Field server_dom_x1_field = new Field("x1", -2147483648); + Field server_dom_y1_field = new Field("y1", -2147483648); + Field server_dom_z1_field = new Field("z1", -2147483648); + Field server_dom_x2_field = new Field("x2", 2147483647); + Field server_dom_y2_field = new Field("y2", 2147483647); + Field server_dom_z2_field = new Field("z2", 2147483647); + Field server_dom_parent_dom_id_field = new Field("parent_dom_id", -1); + Field server_dom_join_message_field = new Field("join_message", "欢迎"); + Field server_dom_leave_message_field = new Field("leave_message", "再见"); + InsertRow insert_server_dom = new InsertRow().table("dominion").onConflictDoNothing(server_dom_id_field) + .field(server_dom_id_field) + .field(server_dom_owner_field) + .field(server_dom_name_field) + .field(server_dom_world_field) + .field(server_dom_x1_field) + .field(server_dom_y1_field) + .field(server_dom_z1_field) + .field(server_dom_x2_field) + .field(server_dom_y2_field) + .field(server_dom_z2_field) + .field(server_dom_parent_dom_id_field) + .field(server_dom_join_message_field) + .field(server_dom_leave_message_field); + insert_server_dom.execute(); for (Flag flag : Flag.getAllDominionFlags()) { - Dominion.database.addColumnIfNotExists("dominion", - flag.getFlagName(), - "BOOLEAN NOT NULL DEFAULT " + flag.getDefaultValue()); + TableColumn column = new TableColumn(flag.getFlagName(), FieldType.BOOLEAN, false, false, true, false, flag.getDefaultValue()); + new AddColumn(column).table("dominion").ifNotExists().execute(); } for (Flag flag : Flag.getAllPrivilegeFlags()) { - Dominion.database.addColumnIfNotExists("player_privilege", - flag.getFlagName(), - "BOOLEAN NOT NULL DEFAULT " + flag.getDefaultValue()); + TableColumn column = new TableColumn(flag.getFlagName(), FieldType.BOOLEAN, false, false, true, false, flag.getDefaultValue()); + new AddColumn(column).table("player_privilege").ifNotExists().execute(); } // 1.18.0 - Dominion.database.addColumnIfNotExists("dominion", "tp_location", "TEXT NOT NULL DEFAULT 'default'"); + TableColumn dominion_tp_location = new TableColumn("tp_location", FieldType.STRING, false, false, true, false, "'default'"); + new AddColumn(dominion_tp_location).table("dominion").ifNotExists().execute(); // 1.31.0 - Dominion.database.createTableIfNotExists( - "privilege_template", - new String[]{"id", "creator", "name", "admin"}, - new String[]{"SERIAL PRIMARY KEY", "VARCHAR(36) NOT NULL", "TEXT NOT NULL", "BOOLEAN NOT NULL DEFAULT FALSE"}, - new String[]{ - "UNIQUE (creator, name)", - "FOREIGN KEY (creator) REFERENCES player_name(uuid) ON DELETE CASCADE" - } - ); + TableColumn privilege_template_id = new TableColumn("id", FieldType.INT, true, true, true, true, null); + TableColumn privilege_template_creator = new TableColumn("creator", FieldType.STRING, false, false, true, false, null); + TableColumn privilege_template_name = new TableColumn("name", FieldType.STRING, false, false, true, false, null); + TableColumn privilege_template_admin = new TableColumn("admin", FieldType.BOOLEAN, false, false, true, false, false); + CreateTable.ForeignKey privilege_template_creator_fk = new CreateTable.ForeignKey(privilege_template_creator, "player_name", player_name_uuid, true); + CreateTable privilege_template = new CreateTable().ifNotExists(); + privilege_template.table("privilege_template") + .field(privilege_template_id) + .field(privilege_template_creator) + .field(privilege_template_name) + .field(privilege_template_admin) + .foreignKey(privilege_template_creator_fk) + .unique(privilege_template_creator, privilege_template_name); + privilege_template.execute(); + for (Flag flag : Flag.getAllPrivilegeFlags()) { - Dominion.database.addColumnIfNotExists("privilege_template", - flag.getFlagName(), - "BOOLEAN NOT NULL DEFAULT " + flag.getDefaultValue()); + TableColumn column = new TableColumn(flag.getFlagName(), FieldType.BOOLEAN, false, false, true, false, flag.getDefaultValue()); + new AddColumn(column).table("privilege_template").ifNotExists().execute(); } // 1.31.6 - Dominion.database.addColumnIfNotExists("dominion", "color", "TEXT NOT NULL DEFAULT '#00BFFF'"); + TableColumn dominion_color = new TableColumn("color", FieldType.STRING, false, false, true, false, "'#00BFFF'"); + new AddColumn(dominion_color).table("dominion").ifNotExists().execute(); } }