1
mirror of https://github.com/CarmJos/MineSQL.git synced 2024-09-19 12:15:45 +00:00

Sponge8 support

This commit is contained in:
huanmeng_qwq 2022-06-22 03:08:54 +08:00
parent a2ab7d4d9f
commit 554cec190c
6 changed files with 331 additions and 6 deletions

View File

@ -74,18 +74,17 @@ public class BukkitConfiguration implements PluginConfiguration {
EasySQLBukkit.getInstance().error("端口未配置正确," + " 请检查配置文件 databases." + dbName + "");
continue;
}
DBConfiguration configuration = DBConfiguration.create(driverType, host + ":" + port);
DBConfiguration dbConfiguration = DBConfiguration.create(driverType, host + ":" + port);
String username = dbSection.getString("username");
String password = dbSection.getString("password");
dbConfiguration.setUsername(username);
dbConfiguration.setPassword(password);
dbConfigurations.put(dbName, dbConfiguration);
}
}
return dbConfigurations;
}
}

View File

@ -67,7 +67,6 @@ public class EasySQLBukkit extends EasyPlugin implements EasySQLPluginPlatform {
} else {
log("已禁用检查更新,跳过。");
}
return true;
}

View File

@ -55,6 +55,43 @@
<url>https://github.com/CarmJos/EasySQL-Plugin/actions/workflows/maven.yml</url>
</ciManagement>
<repositories>
<repository>
<id>sponge</id>
<url>http://repo.spongepowered.org/maven</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>${project.parent.groupId}</groupId>
<artifactId>easysql-plugin-core</artifactId>
<version>${project.parent.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.spongepowered</groupId>
<artifactId>spongeapi</artifactId>
<version>8.0.0</version>
<scope>provided</scope>
<exclusions>
<exclusion>
<groupId>ninja.leaping.configurate</groupId>
<artifactId>configurate-hocon</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.bstats</groupId>
<artifactId>bstats-sponge</artifactId>
<version>3.0.0</version>
<optional>true</optional>
<scope>compile</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>

View File

@ -0,0 +1,184 @@
package cc.carm.plugin.easysql;
import cc.carm.lib.easysql.api.SQLManager;
import cc.carm.plugin.easysql.api.DBConfiguration;
import cc.carm.plugin.easysql.configuration.PluginConfiguration;
import cc.carm.plugin.easysql.util.DBPropertiesUtil;
import cc.carm.plugin.easysql.util.JarResourceUtils;
import cn.beecp.BeeDataSource;
import com.google.common.io.MoreFiles;
import com.google.inject.Inject;
import org.apache.logging.log4j.Logger;
import org.bstats.charts.SimplePie;
import org.bstats.sponge.Metrics;
import org.jetbrains.annotations.NotNull;
import org.spongepowered.api.Server;
import org.spongepowered.api.config.ConfigDir;
import org.spongepowered.api.event.Listener;
import org.spongepowered.api.event.lifecycle.StoppingEngineEvent;
import org.spongepowered.configurate.ConfigurateException;
import org.spongepowered.configurate.ConfigurationNode;
import org.spongepowered.configurate.hocon.HoconConfigurationLoader;
import org.spongepowered.plugin.PluginContainer;
import org.spongepowered.plugin.builtin.jvm.Plugin;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Properties;
/**
* 2022/6/20<br>
* MineSQL<br>
*
* @author huanmeng_qwq
*/
@Plugin("easysql-plugin")
public class EasySQLSponge implements EasySQLPluginPlatform {
@Inject
@ConfigDir(sharedRoot = false)
private Path configDirectory;
@Inject
private org.apache.logging.log4j.Logger logger;
private static EasySQLSponge instance;
private ConfigurationNode root;
private PluginConfiguration configuration;
private EasySQLRegistryImpl registry;
private PluginContainer pluginContainer;
private final Metrics metrics;
@Inject
public EasySQLSponge(Metrics.Factory factory, PluginContainer pluginContainer) {
this.metrics = factory.make(14075);
instance = this;
HoconConfigurationLoader loader = HoconConfigurationLoader.builder().path(resolveConfig()).build();
try {
this.root = loader.load();
this.configuration = new SpongeConfiguration(root);
this.registry = new EasySQLRegistryImpl(this);
this.pluginContainer = pluginContainer;
enable();
} catch (ConfigurateException ex) {
throw new RuntimeException(ex);
}
}
@Listener
public void disable(StoppingEngineEvent<Server> e) {
getLog().info("终止全部数据库连接...");
for (String dbName : new HashSet<>(getRegistry().list().keySet())) {
getLog().info(" 正在关闭数据库 " + dbName + "...");
SQLManager manager = getRegistry().get(dbName);
getRegistry().shutdown(manager, activeQueries -> {
getLog().info(" 数据库 " + dbName + " 仍有有 " + activeQueries + " 条活动查询,强制关闭中...");
if (manager.getDataSource() instanceof BeeDataSource) {
BeeDataSource dataSource = (BeeDataSource) manager.getDataSource();
dataSource.close(); //Close bee connection pool
}
});
}
getRegistry().getManagers().clear(); // release all managers
}
public void enable() {
/*
//todo acf-commands not support sponge8
getLog().info("初始化指令管理器...");
getLog().info("注册相关指令...");
*/
if (getConfiguration().isMetricsEnabled()) {
getLog().info("启用统计数据...");
metrics.addCustomChart(new SimplePie("update_check",
() -> getConfiguration().isUpdateCheckerEnabled() ? "ENABLED" : "DISABLED")
);
metrics.addCustomChart(new SimplePie("properties_configuration",
() -> getConfiguration().isPropertiesEnabled() ? "ENABLED" : "DISABLED")
);
}
if (getConfiguration().isUpdateCheckerEnabled()) {
getLog().info("开始检查更新...");
getRegistry().checkUpdate(pluginContainer.metadata().version().getQualifier());
} else {
getLog().info("已禁用检查更新,跳过。");
}
}
@Override
public @NotNull Map<String, DBConfiguration> readConfigurations() {
return configuration.getDBConfigurations();
}
@Override
public @NotNull Map<String, Properties> readProperties() {
if (!getConfiguration().isPropertiesEnabled()) return new HashMap<>();
String propertiesFolder = getConfiguration().getPropertiesFolder();
if (propertiesFolder == null || propertiesFolder.length() == 0) return new HashMap<>();
File file = new File(configDirectory.toFile(), propertiesFolder);
if (!file.exists() || !file.isDirectory()) {
try {
JarResourceUtils.copyFolderFromJar(
"db-properties", file,
JarResourceUtils.CopyOption.COPY_IF_NOT_EXIST
);
} catch (Exception ex) {
logger.error("初始化properties示例文件失败" + ex.getMessage());
}
}
return DBPropertiesUtil.readFromFolder(file);
}
private Path resolveConfig() {
Path path = configDirectory.resolve("easysql.conf");
if (!Files.exists(path)) {
try {
//noinspection UnstableApiUsage
MoreFiles.createParentDirectories(configDirectory);
try (InputStream is = getClass().getClassLoader().getResourceAsStream("easysql.conf")) {
Files.copy(is, path);
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
return path;
}
public ConfigurationNode getRootConfig() {
return root;
}
public PluginConfiguration getConfiguration() {
return configuration;
}
@Override
public @NotNull EasySQLRegistryImpl getRegistry() {
return registry;
}
public java.util.logging.Logger getLogger() {
return java.util.logging.Logger.getLogger("easysql-plugin");
}
public static EasySQLSponge getInstance() {
return instance;
}
public Logger getLog() {
return logger;
}
}

View File

@ -0,0 +1,89 @@
package cc.carm.plugin.easysql;
import cc.carm.plugin.easysql.api.DBConfiguration;
import cc.carm.plugin.easysql.api.SQLDriverType;
import cc.carm.plugin.easysql.configuration.PluginConfiguration;
import org.jetbrains.annotations.NotNull;
import org.spongepowered.configurate.ConfigurationNode;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* 2022/6/20<br>
* MineSQL<br>
*
* @author huanmeng_qwq
*/
public class SpongeConfiguration implements PluginConfiguration {
private final ConfigurationNode config;
public SpongeConfiguration(ConfigurationNode config) {
this.config = config;
}
@Override
public boolean isDebugEnabled() {
return config.node("debug").getBoolean(false);
}
@Override
public boolean isMetricsEnabled() {
return config.node("metrics").getBoolean(false);
}
@Override
public boolean isUpdateCheckerEnabled() {
return config.node("check-update").getBoolean(true);
}
@Override
public boolean isPropertiesEnabled() {
return config.node("properties", "enable").getBoolean(true);
}
@Override
public String getPropertiesFolder() {
return config.node("properties", "folder").getString("db-properties/");
}
@Override
public @NotNull Map<String, DBConfiguration> getDBConfigurations() {
Map<String, DBConfiguration> dbConfigurations = new LinkedHashMap<>();
ConfigurationNode dbConfigurationsSection = config.node("databases");
if (dbConfigurationsSection != null) {
for (Map.Entry<Object, ? extends ConfigurationNode> dbEntry : dbConfigurationsSection.childrenMap().entrySet()) {
if (dbEntry.getKey().toString().startsWith("example-")) continue;
ConfigurationNode dbSection = dbEntry.getValue();
if (dbSection == null) continue;
String driverString = dbSection.getString("driver-type");
SQLDriverType driverType = SQLDriverType.parse(driverString);
if (driverType == null) {
EasySQLSponge.getInstance().getLog().error("不存在预设的驱动类型 " + driverString + "," + " 请检查配置文件 databases." + dbEntry + "");
continue;
}
String host = dbSection.getString("host");
if (host == null) {
EasySQLSponge.getInstance().getLog().error("地址配置不得为空," + " 请检查配置文件 databases." + dbEntry + "");
continue;
}
int port = dbSection.node("port").getInt(-1);
if (port < 0) {
EasySQLSponge.getInstance().getLog().error("端口未配置正确," + " 请检查配置文件 databases." + dbEntry + "");
continue;
}
DBConfiguration dbConfiguration = DBConfiguration.create(driverType, host + ":" + port);
String username = dbSection.getString("username");
String password = dbSection.getString("password");
dbConfiguration.setUsername(username);
dbConfiguration.setPassword(password);
dbConfigurations.put(dbEntry.getKey().toString(), dbConfiguration);
}
}
return dbConfigurations;
}
}

View File

@ -0,0 +1,17 @@
debug = false
metrics = false
check-update = true
properties {
enable = true
folder = "db-properties/"
}
databases {
example-test {
driver-type = "MYSQL"
host = "localhost"
port = -1
username = "root"
password = "root"
}
}