diff --git a/README.md b/README.md index 1b9c7f7..0d78a57 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ ## 功能介绍 - 本插件支持 PlayerTitle 的 [新版RGB颜色格式](https://ricedoc.handyplus.cn/wiki/PlayerTitle/rgb/#新版本格式) (详情见下文) -- 本插件仅支持 PostgresSQL 数据库,不支持 MySQL、Sqlite 等 +- 支持 PostgresSQL 和 Sqlite 数据库 - 本插件使用 **TUI** 作为简易的交互方式,非 PlayerTitle 的箱子UI - 支持设置称号**限量销售、限时销售** - 支持玩家使用称号币自定义称号 @@ -83,6 +83,12 @@ ## 管理员指南 +### 0. 数据库 + +如果使用 Postgresql 数据库,需要手动创建数据库。 + +如果使用 sqlite 数据库,插件会自动在插件目录下创建数据库文件。配置文件内的 Host、Port、User、Pass 字段不会被使用。 + ### 1. 创建称号 使用 `/mplt create [称号名称] [称号描述]` 创建称号,称号支持RGB彩色字,需要使用 `&#`为开头的十六进制RGB颜色代码表示颜色,例如`�`表示黑色。可以使用 [Minecraft 渐变颜色生成器](https://ssl.lunadeer.cn:14440/) 来生成具有渐变效果的称号。 @@ -167,6 +173,7 @@ ```yaml # 数据库配置 Database: + Type: sqlite # pgsql, sqlite Host: localhost Port: 5432 Name: miniplayertitle diff --git a/pom.xml b/pom.xml index 4df13eb..88ca637 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ cn.lunadeer MiniPlayerTitle - 2.9.1 + 2.10.0 jar MiniPlayerTitle @@ -76,5 +76,10 @@ postgresql 42.6.0 + + org.postgresql + postgresql + 42.6.0 + diff --git a/src/main/java/cn/lunadeer/miniplayertitle/utils/ConfigManager.java b/src/main/java/cn/lunadeer/miniplayertitle/utils/ConfigManager.java index 26a80bf..882f1e5 100644 --- a/src/main/java/cn/lunadeer/miniplayertitle/utils/ConfigManager.java +++ b/src/main/java/cn/lunadeer/miniplayertitle/utils/ConfigManager.java @@ -15,6 +15,11 @@ public class ConfigManager { _plugin.reloadConfig(); _file = _plugin.getConfig(); _debug = _file.getBoolean("Debug", false); + _db_type = _file.getString("Database.Type", "sqlite"); + if (!_db_type.equals("pgsql") && !_db_type.equals("sqlite")) { + XLogger.err("当前数据库只支持 pgsql 或 sqlite,已重置为 sqlite"); + setDbType("sqlite"); + } _db_host = _file.getString("Database.Host", "localhost"); _db_port = _file.getString("Database.Port", "5432"); _db_name = _file.getString("Database.Name", "miniplayertitle"); @@ -38,10 +43,28 @@ public class ConfigManager { _plugin.saveConfig(); } - public String getDBConnectionUrl() { - return "jdbc:postgresql://" + _db_host + ":" + _db_port + "/" + _db_name; + + public String getDbType() { + return _db_type; } + public void setDbType(String db_type) { + _db_type = db_type; + _file.set("Database.Type", db_type); + _plugin.saveConfig(); + } + + public String getDbHost() { + return _db_host; + } + + public String getDbPort() { + return _db_port; + } + + public String getDbName() { + return _db_name; + } public void setDbUser(String db_user) { _db_user = db_user; @@ -124,6 +147,7 @@ public class ConfigManager { private FileConfiguration _file; private Boolean _debug; + private String _db_type; private String _db_host; private String _db_port; private String _db_user; diff --git a/src/main/java/cn/lunadeer/miniplayertitle/utils/Database.java b/src/main/java/cn/lunadeer/miniplayertitle/utils/Database.java index f50c58b..445ada6 100644 --- a/src/main/java/cn/lunadeer/miniplayertitle/utils/Database.java +++ b/src/main/java/cn/lunadeer/miniplayertitle/utils/Database.java @@ -6,12 +6,30 @@ import java.sql.*; public class Database { - public static Connection createConnection(){ + public static Connection createConnection() { try { - Class.forName("org.postgresql.Driver"); - return DriverManager.getConnection(MiniPlayerTitle.config.getDBConnectionUrl(), MiniPlayerTitle.config.getDbUser(), MiniPlayerTitle.config.getDbPass()); + String connectionUrl; + if (MiniPlayerTitle.config.getDbType().equals("pgsql")) { + XLogger.info("正在连接到 PostgreSQL 数据库"); + Class.forName("org.postgresql.Driver"); + connectionUrl = "jdbc:postgresql://" + MiniPlayerTitle.config.getDbHost() + ":" + MiniPlayerTitle.config.getDbPort(); + connectionUrl += "/" + MiniPlayerTitle.config.getDbName(); + return DriverManager.getConnection(connectionUrl, MiniPlayerTitle.config.getDbUser(), MiniPlayerTitle.config.getDbPass()); + } else if (MiniPlayerTitle.config.getDbType().equals("sqlite")) { + XLogger.info("正在连接到 SQLite 数据库"); + Class.forName("org.sqlite.JDBC"); + connectionUrl = "jdbc:sqlite:" + MiniPlayerTitle.instance.getDataFolder() + "/" + MiniPlayerTitle.config.getDbName() + ".db"; + return DriverManager.getConnection(connectionUrl); + } else { + XLogger.err("=== 严重错误 ==="); + XLogger.err("数据库类型错误,只能为 pgsql 或 sqlite"); + XLogger.err("==============="); + return null; + } } catch (ClassNotFoundException | SQLException e) { + XLogger.err("=== 严重错误 ==="); XLogger.err("Database connection failed: " + e.getMessage()); + XLogger.err("==============="); return null; } } @@ -26,13 +44,42 @@ public class Database { // if query with no result return null if (stmt.execute(sql)) { return stmt.getResultSet(); - } else { - return null; } } catch (SQLException e) { - XLogger.err("Database query failed: " + e.getMessage()); - XLogger.err("SQL: " + sql); - return null; + handleDatabaseError("Database query failed: ", e, sql); + } + return null; + } + + private static void handleDatabaseError(String errorMessage, SQLException e, String sql) { + XLogger.err("=== 严重错误 ==="); + XLogger.err(errorMessage + e.getMessage()); + XLogger.err("SQL: " + sql); + XLogger.err("==============="); + } + + private static void addColumnIfNotExists(String tableName, String columnName, String columnDefinition) { + if (MiniPlayerTitle.config.getDbType().equals("pgsql")) { + String sql = "ALTER TABLE " + tableName + " ADD COLUMN IF NOT EXISTS " + columnName + " " + columnDefinition + ";"; + query(sql); + } else if (MiniPlayerTitle.config.getDbType().equals("sqlite")) { + try { + ResultSet rs = query("PRAGMA table_info(" + tableName + ");"); + boolean columnExists = false; + if (rs != null) { + while (rs.next()) { + if (columnName.equals(rs.getString("name"))) { + columnExists = true; + break; + } + } + } + if (!columnExists) { + query("ALTER TABLE " + tableName + " ADD COLUMN " + columnName + " " + columnDefinition + ";"); + } + } catch (SQLException e) { + handleDatabaseError("Database operation failed: ", e, ""); + } } } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 8c5eda1..5c79715 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -1,4 +1,5 @@ Database: + Type: sqlite # pgsql, sqlite Host: localhost Port: 5432 Name: miniplayertitle