diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000..9a48de2 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,2 @@ +github: [ CarmJos ] +custom: [ 'https://donate.carm.cc' ] \ No newline at end of file diff --git a/README.md b/README.md index c4db872..e33c874 100644 --- a/README.md +++ b/README.md @@ -9,4 +9,55 @@ |___/ |___/ ``` -# EasySQL-Plugin \ No newline at end of file +# EasySQL-Plugin + +轻松(用)SQL的独立运行库插件,支持多种服务端,适用于MineCraft全版本。 + + +## 安装 + +## 配置 + +## 开发 + +### 依赖方式 + +## 指令 +插件主指令为 `/easysql` ,所有指令只允许后台执行。 + +```text +# help +- 查看插件指令帮助。 + +# version +- 查看插件版本并进行版本更新查询。 + +# list +- 列出当前所有的数据源配置与相关信息。 + +# stats <数据源名称> +- 查看指定数据源的统计信息与当前仍未关闭的查询。 +``` + +## 开源协议 + +本项目源码采用 [GNU General Public License v3.0](https://opensource.org/licenses/GPL-3.0) 开源协议。 + +
+ 关于 GPL 协议 + +> GNU General Public Licence (GPL) 有可能是开源界最常用的许可模式。GPL 保证了所有开发者的权利,同时为使用者提供了足够的复制,分发,修改的权利: +> +> #### 可自由复制 +> 你可以将软件复制到你的电脑,你客户的电脑,或者任何地方。复制份数没有任何限制。 +> #### 可自由分发 +> 在你的网站提供下载,拷贝到U盘送人,或者将源代码打印出来从窗户扔出去(环保起见,请别这样做)。 +> #### 可以用来盈利 +> 你可以在分发软件的时候收费,但你必须在收费前向你的客户提供该软件的 GNU GPL 许可协议,以便让他们知道,他们可以从别的渠道免费得到这份软件,以及你收费的理由。 +> #### 可自由修改 +> 如果你想添加或删除某个功能,没问题,如果你想在别的项目中使用部分代码,也没问题,唯一的要求是,使用了这段代码的项目也必须使用 GPL 协议。 +> +> 需要注意的是,分发的时候,需要明确提供源代码和二进制文件,另外,用于某些程序的某些协议有一些问题和限制,你可以看一下 @PierreJoye 写的 Practical Guide to GPL Compliance 一文。使用 GPL 协议,你必须在源代码代码中包含相应信息,以及协议本身。 +> +> *以上文字来自 [五种开源协议GPL,LGPL,BSD,MIT,Apache](https://www.oschina.net/question/54100_9455) 。* +
diff --git a/easysql-plugin-api/src/main/java/cc/carm/plugin/easysql/EasySQLAPI.java b/easysql-plugin-api/src/main/java/cc/carm/plugin/easysql/EasySQLAPI.java index 61219cc..112a553 100644 --- a/easysql-plugin-api/src/main/java/cc/carm/plugin/easysql/EasySQLAPI.java +++ b/easysql-plugin-api/src/main/java/cc/carm/plugin/easysql/EasySQLAPI.java @@ -1,16 +1,16 @@ package cc.carm.plugin.easysql; -import cc.carm.plugin.easysql.api.EasySQLManager; +import cc.carm.plugin.easysql.api.EasySQLRegistry; public class EasySQLAPI { - protected static EasySQLManager api; + protected static EasySQLRegistry api; - protected static void init(EasySQLManager api) { + protected static void init(EasySQLRegistry api) { EasySQLAPI.api = api; } - public static EasySQLManager get() { + public static EasySQLRegistry get() { return api; } diff --git a/easysql-plugin-api/src/main/java/cc/carm/plugin/easysql/api/DBConfiguration.java b/easysql-plugin-api/src/main/java/cc/carm/plugin/easysql/api/DBConfiguration.java index 39b2265..8b94896 100644 --- a/easysql-plugin-api/src/main/java/cc/carm/plugin/easysql/api/DBConfiguration.java +++ b/easysql-plugin-api/src/main/java/cc/carm/plugin/easysql/api/DBConfiguration.java @@ -9,14 +9,13 @@ import java.util.List; public class DBConfiguration { - public DBConfiguration create(@NotNull SQLSourceType sourceType, @NotNull String url) { + public DBConfiguration create(@NotNull SQLDriverType sourceType, @NotNull String url) { return new DBConfiguration(sourceType.getDriverClass(), sourceType.getUrlPrefix(), url, sourceType.getDefaultSettings()); } private final @NotNull String driverClassName; private final @NotNull String urlPrefix; - private final @NotNull List defaultSettings; - private final @NotNull List extraSettings; + private final @NotNull List initializeSQLs; private @NotNull String url; @@ -24,28 +23,33 @@ public class DBConfiguration { private @Nullable String password; private @Nullable String connectionInitSql; - private @Nullable String connectionTestQuery; + private @Nullable String poolName; + private @Nullable Integer maxPoolSize; + private @Nullable Integer maxActive; + + private @Nullable Integer maxHoldTime; + + private @Nullable Long idleTimeout; + + private @Nullable Long maxWaitTime; + + private @Nullable String schema; private @Nullable Boolean autoCommit; private @Nullable Boolean readOnly; - private @Nullable Long connectionTimeout; - private @Nullable Long validationTimeout; - private @Nullable Long idleTimeout; - private @Nullable Long leakDetectionThreshold; - private @Nullable Long maxLifetime; - private @Nullable Long keepaliveTime; - private @Nullable Integer maxPoolSize; - private @Nullable Integer minIdle; + private @Nullable String validationSQL; + private @Nullable Integer validationTimeout; + private @Nullable Long validationInterval; + private DBConfiguration(@NotNull String driverClass, @NotNull String urlPrefix, - @NotNull String url, @NotNull String[] defaultSettings) { + @NotNull String url, @NotNull String[] initializeSQLs) { this.driverClassName = driverClass; this.urlPrefix = urlPrefix; this.url = url; - this.defaultSettings = Arrays.asList(defaultSettings); - this.extraSettings = new ArrayList<>(); + this.initializeSQLs = Arrays.asList(initializeSQLs); } public @NotNull String getDriverClassName() { @@ -56,39 +60,23 @@ public class DBConfiguration { return urlPrefix; } - public @NotNull List getDefaultSettings() { - return defaultSettings; + public @NotNull List getInitializeSQLs() { + return initializeSQLs; } - public @NotNull List getExtraSettings() { - return extraSettings; - } - - public DBConfiguration setDefaultSettings(@Nullable String[] defaultSettings) { - this.defaultSettings.clear(); - this.defaultSettings.addAll(Arrays.asList(defaultSettings)); + public DBConfiguration setInitializeSQLs(@Nullable String[] initializeSQLs) { + this.initializeSQLs.clear(); + this.initializeSQLs.addAll(Arrays.asList(initializeSQLs)); return this; } - - public DBConfiguration clearDefaultSettings() { - this.defaultSettings.clear(); - return this; - } - - public DBConfiguration setExtraSettings(@Nullable String[] extraSettings) { - this.defaultSettings.clear(); - this.extraSettings.addAll(Arrays.asList(extraSettings)); - return this; - } - - public DBConfiguration addExtraSetting(@NotNull String extraSetting) { - this.extraSettings.add(extraSetting); + public DBConfiguration addInitializeSQL(@NotNull String initializeSQL) { + this.initializeSQLs.add(initializeSQL); return this; } public DBConfiguration clearExtraSettings() { - this.defaultSettings.clear(); + this.initializeSQLs.clear(); return this; } @@ -128,12 +116,21 @@ public class DBConfiguration { return this; } - public @Nullable String getConnectionTestQuery() { - return connectionTestQuery; + public @Nullable String getValidationSQL() { + return validationSQL; } - public DBConfiguration setConnectionTestQuery(String connectionTestQuery) { - this.connectionTestQuery = connectionTestQuery; + public DBConfiguration setValidationSQL(String validationSQL) { + this.validationSQL = validationSQL; + return this; + } + + public @Nullable Long getValidationInterval() { + return validationInterval; + } + + public DBConfiguration setValidationInterval(@Nullable Long validationInterval) { + this.validationInterval = validationInterval; return this; } @@ -173,20 +170,20 @@ public class DBConfiguration { return this; } - public @Nullable Long getConnectionTimeout() { - return connectionTimeout; + public @Nullable Integer getMaxHoldTime() { + return maxHoldTime; } - public DBConfiguration setConnectionTimeout(Long connectionTimeout) { - this.connectionTimeout = connectionTimeout; + public DBConfiguration setMaxHoldTime(@Nullable Integer maxHoldTime) { + this.maxHoldTime = maxHoldTime; return this; } - public @Nullable Long getValidationTimeout() { + public @Nullable Integer getValidationTimeout() { return validationTimeout; } - public DBConfiguration setValidationTimeout(Long validationTimeout) { + public DBConfiguration setValidationTimeout(Integer validationTimeout) { this.validationTimeout = validationTimeout; return this; } @@ -200,30 +197,12 @@ public class DBConfiguration { return this; } - public @Nullable Long getLeakDetectionThreshold() { - return leakDetectionThreshold; + public @Nullable Integer getMaxActive() { + return maxActive; } - public DBConfiguration setLeakDetectionThreshold(Long leakDetectionThreshold) { - this.leakDetectionThreshold = leakDetectionThreshold; - return this; - } - - public @Nullable Long getMaxLifetime() { - return maxLifetime; - } - - public DBConfiguration setMaxLifetime(Long maxLifetime) { - this.maxLifetime = maxLifetime; - return this; - } - - public @Nullable Long getKeepaliveTime() { - return keepaliveTime; - } - - public DBConfiguration setKeepaliveTime(Long keepaliveTime) { - this.keepaliveTime = keepaliveTime; + public DBConfiguration setMaxActive(Integer maxActive) { + this.maxActive = maxActive; return this; } @@ -231,17 +210,18 @@ public class DBConfiguration { return maxPoolSize; } - public DBConfiguration setMaxPoolSize(Integer maxPoolSize) { + public DBConfiguration setMaxPoolSize(@Nullable Integer maxPoolSize) { this.maxPoolSize = maxPoolSize; return this; } - public @Nullable Integer getMinIdle() { - return minIdle; + public @Nullable Long getMaxWaitTime() { + return maxWaitTime; } - public DBConfiguration setMinIdle(Integer minIdle) { - this.minIdle = minIdle; + public DBConfiguration setMaxWaitTime(Long maxWaitTime) { + this.maxWaitTime = maxWaitTime; return this; } + } diff --git a/easysql-plugin-api/src/main/java/cc/carm/plugin/easysql/api/EasySQLManager.java b/easysql-plugin-api/src/main/java/cc/carm/plugin/easysql/api/EasySQLRegistry.java similarity index 71% rename from easysql-plugin-api/src/main/java/cc/carm/plugin/easysql/api/EasySQLManager.java rename to easysql-plugin-api/src/main/java/cc/carm/plugin/easysql/api/EasySQLRegistry.java index 211c12f..6a8e9bc 100644 --- a/easysql-plugin-api/src/main/java/cc/carm/plugin/easysql/api/EasySQLManager.java +++ b/easysql-plugin-api/src/main/java/cc/carm/plugin/easysql/api/EasySQLRegistry.java @@ -10,11 +10,12 @@ import java.util.Map; import java.util.Optional; import java.util.Properties; import java.util.UUID; +import java.util.function.Consumer; /** * 入口类 */ -public interface EasySQLManager { +public interface EasySQLRegistry { /** * 获取原生注册的指定名称的 SQLManager 实例 @@ -75,15 +76,33 @@ public interface EasySQLManager { @NotNull String propertyFileName) throws Exception; /** - * 终止一个 SQLManager 实例。 + * 终止并关闭一个 SQLManager 实例。 * - * @param manager - * @return + * @param manager SQLManager实例 + * @param activeQueries 终止前仍未被关闭的SQLQuery列表 */ - default Map shutdown(SQLManager manager) { - return shutdown(manager, true); + void shutdown(SQLManager manager, @Nullable Consumer> activeQueries); + + /** + * 终止并关闭一个 SQLManager 实例。 + * + * @param manager SQLManager实例 + * @param forceClose 是否强制关闭进行中的查询 + */ + default void shutdown(SQLManager manager, boolean forceClose) { + shutdown(manager, (unclosedQueries) -> { + if (forceClose) unclosedQueries.values().forEach(SQLQuery::close); + }); } - Map shutdown(SQLManager manager, boolean forceClose); + /** + * 终止并关闭一个 SQLManager 实例。 + *
若在终止时仍有活跃的查询,则将会强制关闭。 + * + * @param manager SQLManager实例 + */ + default void shutdown(SQLManager manager) { + shutdown(manager, true); + } } diff --git a/easysql-plugin-api/src/main/java/cc/carm/plugin/easysql/api/SQLSourceType.java b/easysql-plugin-api/src/main/java/cc/carm/plugin/easysql/api/SQLDriverType.java similarity index 86% rename from easysql-plugin-api/src/main/java/cc/carm/plugin/easysql/api/SQLSourceType.java rename to easysql-plugin-api/src/main/java/cc/carm/plugin/easysql/api/SQLDriverType.java index a1279cf..adda972 100644 --- a/easysql-plugin-api/src/main/java/cc/carm/plugin/easysql/api/SQLSourceType.java +++ b/easysql-plugin-api/src/main/java/cc/carm/plugin/easysql/api/SQLDriverType.java @@ -2,7 +2,7 @@ package cc.carm.plugin.easysql.api; import org.jetbrains.annotations.NotNull; -public enum SQLSourceType { +public enum SQLDriverType { MARIADB("org.mariadb.jdbc.Driver", "jdbc:mariadb://", "mariadb", new String[]{}), MYSQL("com.mysql.jdbc.Driver", "jdbc:mysql://", "mysql", new String[]{}), @@ -13,12 +13,12 @@ public enum SQLSourceType { private final @NotNull String urlPrefix; private final @NotNull String[] defaultSettings; - SQLSourceType(@NotNull String driverClass, @NotNull String urlPrefix, - @NotNull String databaseID, @NotNull String[] defaultSettings) { + SQLDriverType(@NotNull String driverClass, @NotNull String urlPrefix, + @NotNull String databaseID, @NotNull String[] initializeSQLs) { this.databaseID = databaseID; this.driverClass = driverClass; this.urlPrefix = urlPrefix; - this.defaultSettings = defaultSettings; + this.defaultSettings = initializeSQLs; } public @NotNull String getDatabaseID() { diff --git a/easysql-plugin-core/pom.xml b/easysql-plugin-core/pom.xml index 43c3518..cb192e9 100644 --- a/easysql-plugin-core/pom.xml +++ b/easysql-plugin-core/pom.xml @@ -31,8 +31,8 @@ - com.zaxxer - HikariCP + com.github.chris2018998 + beecp compile diff --git a/easysql-plugin-core/src/main/java/cc/carm/plugin/easysql/EasySQLPluginPlatform.java b/easysql-plugin-core/src/main/java/cc/carm/plugin/easysql/EasySQLPluginPlatform.java index cb17095..0fd7e99 100644 --- a/easysql-plugin-core/src/main/java/cc/carm/plugin/easysql/EasySQLPluginPlatform.java +++ b/easysql-plugin-core/src/main/java/cc/carm/plugin/easysql/EasySQLPluginPlatform.java @@ -9,6 +9,8 @@ import java.util.logging.Logger; public interface EasySQLPluginPlatform { + + @NotNull Map readConfigurations(); @NotNull Map readProperties(); diff --git a/easysql-plugin-core/src/main/java/cc/carm/plugin/easysql/EasySQLManagerImpl.java b/easysql-plugin-core/src/main/java/cc/carm/plugin/easysql/EasySQLRegistryImpl.java similarity index 63% rename from easysql-plugin-core/src/main/java/cc/carm/plugin/easysql/EasySQLManagerImpl.java rename to easysql-plugin-core/src/main/java/cc/carm/plugin/easysql/EasySQLRegistryImpl.java index 9f6e0f8..5feab18 100644 --- a/easysql-plugin-core/src/main/java/cc/carm/plugin/easysql/EasySQLManagerImpl.java +++ b/easysql-plugin-core/src/main/java/cc/carm/plugin/easysql/EasySQLRegistryImpl.java @@ -4,21 +4,22 @@ import cc.carm.lib.easysql.api.SQLManager; import cc.carm.lib.easysql.api.SQLQuery; import cc.carm.lib.easysql.manager.SQLManagerImpl; import cc.carm.plugin.easysql.api.DBConfiguration; -import cc.carm.plugin.easysql.api.EasySQLManager; +import cc.carm.plugin.easysql.api.EasySQLRegistry; +import cn.beecp.BeeDataSource; +import cn.beecp.BeeDataSourceConfig; import com.google.common.collect.ImmutableMap; -import com.zaxxer.hikari.HikariConfig; -import com.zaxxer.hikari.HikariDataSource; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Unmodifiable; import java.util.*; +import java.util.function.Consumer; -public class EasySQLManagerImpl implements EasySQLManager { +public class EasySQLRegistryImpl implements EasySQLRegistry { private final HashMap sqlManagerRegistry = new HashMap<>(); - public EasySQLManagerImpl(@NotNull EasySQLPluginPlatform platform) { + public EasySQLRegistryImpl(@NotNull EasySQLPluginPlatform platform) { Map configurations = platform.readConfigurations(); if (configurations.isEmpty()) { @@ -64,54 +65,53 @@ public class EasySQLManagerImpl implements EasySQLManager { @Override public @NotNull SQLManager create(@Nullable String name, @NotNull DBConfiguration configuration) { - HikariConfig config = new HikariConfig(); + BeeDataSourceConfig config = new BeeDataSourceConfig(); config.setDriverClassName(configuration.getDriverClassName()); config.setJdbcUrl(configuration.getUrlPrefix() + configuration.getUrl()); - - Optional.ofNullable(configuration.getPoolName()).ifPresent(config::setPoolName); Optional.ofNullable(configuration.getUsername()).ifPresent(config::setUsername); Optional.ofNullable(configuration.getPassword()).ifPresent(config::setPassword); - Optional.ofNullable(configuration.getMaxPoolSize()).ifPresent(config::setMaximumPoolSize); - Optional.ofNullable(configuration.getMinIdle()).ifPresent(config::setMinimumIdle); + + Optional.ofNullable(configuration.getPoolName()).ifPresent(config::setPoolName); + Optional.ofNullable(configuration.getMaxPoolSize()).ifPresent(config::setMaxActive); + Optional.ofNullable(configuration.getMaxActive()).ifPresent(config::setMaxActive); + Optional.ofNullable(configuration.getIdleTimeout()).ifPresent(config::setIdleTimeout); - Optional.ofNullable(configuration.getKeepaliveTime()).ifPresent(config::setKeepaliveTime); - Optional.ofNullable(configuration.getConnectionTimeout()).ifPresent(config::setConnectionTimeout); - Optional.ofNullable(configuration.getValidationTimeout()).ifPresent(config::setValidationTimeout); - Optional.ofNullable(configuration.getMaxLifetime()).ifPresent(config::setMaxLifetime); - Optional.ofNullable(configuration.getLeakDetectionThreshold()).ifPresent(config::setLeakDetectionThreshold); - Optional.ofNullable(configuration.getConnectionTestQuery()).ifPresent(config::setConnectionTestQuery); - Optional.ofNullable(configuration.getConnectionInitSql()).ifPresent(config::setConnectionInitSql); - Optional.ofNullable(configuration.getAutoCommit()).ifPresent(config::setAutoCommit); - Optional.ofNullable(configuration.getReadOnly()).ifPresent(config::setReadOnly); - Optional.ofNullable(configuration.getSchema()).ifPresent(config::setSchema); + Optional.ofNullable(configuration.getMaxWaitTime()).ifPresent(config::setMaxWait); + Optional.ofNullable(configuration.getMaxHoldTime()).ifPresent(config::setHoldTimeout); + + Optional.ofNullable(configuration.getAutoCommit()).ifPresent(config::setDefaultAutoCommit); + Optional.ofNullable(configuration.getReadOnly()).ifPresent(config::setDefaultReadOnly); + Optional.ofNullable(configuration.getSchema()).ifPresent(config::setDefaultSchema); + + Optional.ofNullable(configuration.getValidationSQL()).ifPresent(config::setValidTestSql); + Optional.ofNullable(configuration.getValidationTimeout()).ifPresent(config::setValidTestTimeout); + Optional.ofNullable(configuration.getValidationInterval()).ifPresent(config::setValidAssumeTime); return create(name, config); } @Override public @NotNull SQLManager create(@Nullable String name, @NotNull Properties properties) { - return create(name, new HikariConfig(properties)); + return create(name, new BeeDataSourceConfig(properties)); } @Override public @NotNull SQLManager create(@Nullable String name, @NotNull String propertyFileName) { - return create(name, new HikariConfig(propertyFileName)); + return create(name, new BeeDataSourceConfig(propertyFileName)); } - public @NotNull SQLManager create(@Nullable String name, @NotNull HikariConfig configuration) { - return new SQLManagerImpl(new HikariDataSource(configuration), name); + public @NotNull SQLManager create(@Nullable String name, @NotNull BeeDataSourceConfig configuration) { + return new SQLManagerImpl(new BeeDataSource(configuration), name); } @Override - public Map shutdown(SQLManager manager, boolean forceClose) { - Map queries = manager.getActiveQuery(); - if (forceClose) manager.getActiveQuery().values().forEach(SQLQuery::close); + public void shutdown(SQLManager manager, @Nullable Consumer> activeQueries) { + if (activeQueries != null) activeQueries.accept(manager.getActiveQuery()); - if (manager.getDataSource() instanceof HikariDataSource) { - //Close hikari pool - ((HikariDataSource) manager.getDataSource()).close(); + if (manager.getDataSource() instanceof BeeDataSource) { + BeeDataSource dataSource = (BeeDataSource) manager.getDataSource(); + dataSource.close(); //Close bee connection pool } - - return queries; } + } diff --git a/easysql-plugin-core/src/main/resources/INFO.txt b/easysql-plugin-core/src/main/resources/INFO.txt new file mode 100644 index 0000000..9781e25 --- /dev/null +++ b/easysql-plugin-core/src/main/resources/INFO.txt @@ -0,0 +1,11 @@ + +&5&l ______ _____ ____ _ &d&l_____ _ _ +&5&l| ____| / ____|/ __ \| | &d&l| __ \| | (_) +&5&l| |__ __ _ ___ _ _| (___ | | | | | &d&l| |__) | |_ _ __ _ _ _ __ +&5&l| __| / _` / __| | | |\___ \| | | | | &d&l| ___/| | | | |/ _` | | '_ \ +&5&l| |___| (_| \__ \ |_| |____) | |__| | |____ &d&l| | | | |_| | (_| | | | | | +&5&l|______\__,_|___/\__, |_____/ \___\_\______| &d&l|_| |_|\__,_|\__, |_|_| |_| +&5&l __/ | &d&l __/ | +&5&l |___/ &d&l|___/ + +&f View more information at Github &d&lhttps://github.com/CarmJos/EasySQL-Plugin \ No newline at end of file diff --git a/easysql-plugin-core/src/main/resources/config.yml b/easysql-plugin-core/src/main/resources/config.yml index 6504643..e4214e7 100644 --- a/easysql-plugin-core/src/main/resources/config.yml +++ b/easysql-plugin-core/src/main/resources/config.yml @@ -3,16 +3,17 @@ # 检查更新为异步操作,绝不会影响性能与使用体验。 check-update: true +properties: + enable: true + folder: "properties/" -instances: - name1: +configurations: + "example-mariadb": # database id + driver-type: mariadb + url: 127.0.0.1 # 数据库地址 + port: 3306 # 数据库端口 + use-ssl: false # 是否使用SSL连接 + username: minecraft # 数据库用户名 + password: password #数据库连接密码 + database: minecraft #数据库名 - url: jdbc:mysql://localhost:3306/name1 - port: 3306 - username: mc - password: password - use-ssl: false - name2: - url: jdbc:mysql://localhost:3306/name2 - username: mc - password: password \ No newline at end of file diff --git a/platforms/easysql-plugin-bukkit/src/main/resources/plugin.yml b/platforms/easysql-plugin-bukkit/src/main/resources/plugin.yml new file mode 100644 index 0000000..e69de29 diff --git a/pom.xml b/pom.xml index 2664e7e..ff65acf 100644 --- a/pom.xml +++ b/pom.xml @@ -124,11 +124,10 @@ - - com.zaxxer - HikariCP - ${hikaricp.version} - true + + com.github.chris2018998 + beecp + 3.3.2