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