Driver configuration is configured through json,

Support driver attribute configuration.
This commit is contained in:
SwallowGG
2023-11-12 22:25:51 +08:00
parent 12c1c46bcd
commit eed78015dc
75 changed files with 859 additions and 467 deletions

View File

@ -17,4 +17,18 @@
</dependency> </dependency>
</dependencies> </dependencies>
<artifactId>chat2db-clickhouse</artifactId> <artifactId>chat2db-clickhouse</artifactId>
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<!--properties的配置文件会和编译后的class文件放在一起-->
<include>**/*.json</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
</build>
</project> </project>

View File

@ -1,16 +1,16 @@
package ai.chat2db.plugin.clickhouse; package ai.chat2db.plugin.clickhouse;
import ai.chat2db.plugin.clickhouse.builder.DBConfigBuilder;
import ai.chat2db.spi.DBManage; import ai.chat2db.spi.DBManage;
import ai.chat2db.spi.MetaData; import ai.chat2db.spi.MetaData;
import ai.chat2db.spi.Plugin; import ai.chat2db.spi.Plugin;
import ai.chat2db.spi.config.DBConfig; import ai.chat2db.spi.config.DBConfig;
import ai.chat2db.spi.util.FileUtils;
public class ClickHousePlugin implements Plugin { public class ClickHousePlugin implements Plugin {
@Override @Override
public DBConfig getDBConfig() { public DBConfig getDBConfig() {
return DBConfigBuilder.buildDBConfig(); return FileUtils.readJsonValue(this.getClass(),"clickhouse.json", DBConfig.class);
} }
@Override @Override

View File

@ -1,23 +0,0 @@
package ai.chat2db.plugin.clickhouse.builder;
import ai.chat2db.spi.config.DBConfig;
import ai.chat2db.spi.config.DriverConfig;
import com.google.common.collect.Lists;
public class DBConfigBuilder {
public static DBConfig buildDBConfig() {
DBConfig dbConfig = new DBConfig();
dbConfig.setName("ClickHouse");
dbConfig.setDbType("CLICKHOUSE");
DriverConfig driverConfig = new DriverConfig();
driverConfig.setJdbcDriver("clickhouse-jdbc-0.3.2-patch8-http.jar");
driverConfig.setJdbcDriverClass("com.clickhouse.jdbc.ClickHouseDriver");
driverConfig.setDownloadJdbcDriverUrls(Lists.newArrayList("https://oss.sqlgpt.cn/lib/clickhouse-jdbc-0.3.2-patch8-http.jar"));
dbConfig.setDefaultDriverConfig(driverConfig);
dbConfig.setDriverConfigList(Lists.newArrayList(driverConfig));
return dbConfig;
}
}

View File

@ -0,0 +1,16 @@
{
"dbType": "CLICKHOUSE",
"driverConfigList": [
{
"url": "jdbc:clickhouse://localhost:8123/",
"defaultDriver": true,
"custom": false,
"downloadJdbcDriverUrls": [
"https://oss.sqlgpt.cn/lib/clickhouse-jdbc-0.3.2-patch8-http.jar"
],
"jdbcDriver": "clickhouse-jdbc-0.3.2-patch8-http.jar",
"jdbcDriverClass": "com.clickhouse.jdbc.ClickHouseDriver"
}
],
"name": "ClickHouse"
}

View File

@ -17,5 +17,18 @@
</dependency> </dependency>
</dependencies> </dependencies>
<artifactId>chat2db-db2</artifactId> <artifactId>chat2db-db2</artifactId>
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<!--properties的配置文件会和编译后的class文件放在一起-->
<include>**/*.json</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
</build>
</project> </project>

View File

@ -1,15 +1,16 @@
package ai.chat2db.plugin.db2; package ai.chat2db.plugin.db2;
import ai.chat2db.plugin.db2.builder.DBConfigBuilder;
import ai.chat2db.spi.DBManage; import ai.chat2db.spi.DBManage;
import ai.chat2db.spi.MetaData; import ai.chat2db.spi.MetaData;
import ai.chat2db.spi.Plugin; import ai.chat2db.spi.Plugin;
import ai.chat2db.spi.config.DBConfig; import ai.chat2db.spi.config.DBConfig;
import ai.chat2db.spi.util.FileUtils;
public class DB2Plugin implements Plugin { public class DB2Plugin implements Plugin {
@Override @Override
public DBConfig getDBConfig() { public DBConfig getDBConfig() {
return DBConfigBuilder.buildDBConfig(); return FileUtils.readJsonValue(this.getClass(),"db2.json", DBConfig.class);
} }
@Override @Override

View File

@ -1,22 +0,0 @@
package ai.chat2db.plugin.db2.builder;
import ai.chat2db.spi.config.DBConfig;
import ai.chat2db.spi.config.DriverConfig;
import com.google.common.collect.Lists;
public class DBConfigBuilder {
public static DBConfig buildDBConfig() {
DBConfig dbConfig = new DBConfig();
dbConfig.setName("DB2");
dbConfig.setDbType("DB2");
DriverConfig driverConfig = new DriverConfig();
driverConfig.setJdbcDriver("db2jcc4_4.26.14.jar");
driverConfig.setJdbcDriverClass("com.ibm.db2.jcc.DB2Driver");
driverConfig.setDownloadJdbcDriverUrls(Lists.newArrayList("https://oss.sqlgpt.cn/lib/db2jcc4_4.26.14.jar"));
dbConfig.setDefaultDriverConfig(driverConfig);
dbConfig.setDriverConfigList(Lists.newArrayList(driverConfig));
return dbConfig;
}
}

View File

@ -0,0 +1,16 @@
{
"dbType": "DB2",
"driverConfigList": [
{
"url": "jdbc:db2://localhost:50000/",
"defaultDriver": true,
"custom": false,
"downloadJdbcDriverUrls": [
"https://oss.sqlgpt.cn/lib/db2jcc4_4.26.14.jar"
],
"jdbcDriver": "db2jcc4_4.26.14.jar",
"jdbcDriverClass": "com.ibm.db2.jcc.DB2Driver"
}
],
"name": "DB2"
}

View File

@ -18,5 +18,18 @@
</dependencies> </dependencies>
<artifactId>chat2db-dm</artifactId> <artifactId>chat2db-dm</artifactId>
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<!--properties的配置文件会和编译后的class文件放在一起-->
<include>**/*.json</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
</build>
</project> </project>

View File

@ -1,15 +1,16 @@
package ai.chat2db.plugin.dm; package ai.chat2db.plugin.dm;
import ai.chat2db.plugin.dm.builder.DBConfigBuilder;
import ai.chat2db.spi.DBManage; import ai.chat2db.spi.DBManage;
import ai.chat2db.spi.MetaData; import ai.chat2db.spi.MetaData;
import ai.chat2db.spi.Plugin; import ai.chat2db.spi.Plugin;
import ai.chat2db.spi.config.DBConfig; import ai.chat2db.spi.config.DBConfig;
import ai.chat2db.spi.util.FileUtils;
public class DMPlugin implements Plugin { public class DMPlugin implements Plugin {
@Override @Override
public DBConfig getDBConfig() { public DBConfig getDBConfig() {
return DBConfigBuilder.buildDBConfig(); return FileUtils.readJsonValue(this.getClass(),"dm.json", DBConfig.class);
} }
@Override @Override

View File

@ -1,23 +0,0 @@
package ai.chat2db.plugin.dm.builder;
import ai.chat2db.spi.config.DBConfig;
import ai.chat2db.spi.config.DriverConfig;
import com.google.common.collect.Lists;
public class DBConfigBuilder {
public static DBConfig buildDBConfig() {
DBConfig dbConfig = new DBConfig();
dbConfig.setName("DM");
dbConfig.setDbType("DM");
DriverConfig driverConfig = new DriverConfig();
driverConfig.setJdbcDriver("DmJdbcDriver18-8.1.2.141.jar");
driverConfig.setJdbcDriverClass("dm.jdbc.driver.DmDriver");
driverConfig.setDownloadJdbcDriverUrls(Lists.newArrayList("https://oss.sqlgpt.cn/lib/DmJdbcDriver18-8.1.2.141.jar"));
dbConfig.setDefaultDriverConfig(driverConfig);
dbConfig.setDriverConfigList(Lists.newArrayList(driverConfig));
return dbConfig;
}
}

View File

@ -0,0 +1,16 @@
{
"dbType": "DM",
"driverConfigList": [
{
"url": "jdbc:dm://localhost:5236/",
"defaultDriver": true,
"custom": false,
"downloadJdbcDriverUrls": [
"https://oss.sqlgpt.cn/lib/DmJdbcDriver18-8.1.2.141.jar"
],
"jdbcDriver": "DmJdbcDriver18-8.1.2.141.jar",
"jdbcDriverClass": "dm.jdbc.driver.DmDriver"
}
],
"name": "DM"
}

View File

@ -17,5 +17,18 @@
</dependency> </dependency>
</dependencies> </dependencies>
<artifactId>chat2db-h2</artifactId> <artifactId>chat2db-h2</artifactId>
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<!--properties的配置文件会和编译后的class文件放在一起-->
<include>**/*.json</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
</build>
</project> </project>

View File

@ -1,16 +1,16 @@
package ai.chat2db.plugin.h2; package ai.chat2db.plugin.h2;
import ai.chat2db.plugin.h2.builder.DBConfigBuilder;
import ai.chat2db.spi.DBManage; import ai.chat2db.spi.DBManage;
import ai.chat2db.spi.MetaData; import ai.chat2db.spi.MetaData;
import ai.chat2db.spi.Plugin; import ai.chat2db.spi.Plugin;
import ai.chat2db.spi.config.DBConfig; import ai.chat2db.spi.config.DBConfig;
import ai.chat2db.spi.jdbc.DefaultMetaService; import ai.chat2db.spi.jdbc.DefaultMetaService;
import ai.chat2db.spi.util.FileUtils;
public class H2Plugin extends DefaultMetaService implements Plugin { public class H2Plugin extends DefaultMetaService implements Plugin {
@Override @Override
public DBConfig getDBConfig() { public DBConfig getDBConfig() {
return DBConfigBuilder.buildDBConfig(); return FileUtils.readJsonValue(this.getClass(),"h2.json", DBConfig.class);
} }
@Override @Override
@ -22,4 +22,5 @@ public class H2Plugin extends DefaultMetaService implements Plugin {
public DBManage getDBManage() { public DBManage getDBManage() {
return new H2DBManage(); return new H2DBManage();
} }
} }

View File

@ -1,23 +0,0 @@
package ai.chat2db.plugin.h2.builder;
import ai.chat2db.spi.config.DBConfig;
import ai.chat2db.spi.config.DriverConfig;
import com.google.common.collect.Lists;
public class DBConfigBuilder {
public static DBConfig buildDBConfig() {
DBConfig dbConfig = new DBConfig();
dbConfig.setName("H2");
dbConfig.setDbType("H2");
DriverConfig driverConfig = new DriverConfig();
driverConfig.setJdbcDriver("h2-2.1.214.jar");
driverConfig.setJdbcDriverClass("org.h2.Driver");
driverConfig.setDownloadJdbcDriverUrls(Lists.newArrayList("https://oss.sqlgpt.cn/lib/h2-2.1.214.jar"));
dbConfig.setDefaultDriverConfig(driverConfig);
dbConfig.setDriverConfigList(Lists.newArrayList(driverConfig));
return dbConfig;
}
}

View File

@ -0,0 +1,16 @@
{
"dbType": "H2",
"driverConfigList": [
{
"url": "jdbc:h2:tcp://localhost:9092/",
"defaultDriver": true,
"custom": false,
"downloadJdbcDriverUrls": [
"https://oss.sqlgpt.cn/lib/h2-2.1.214.jar"
],
"jdbcDriver": "h2-2.1.214.jar",
"jdbcDriverClass": "org.h2.Driver"
}
],
"name": "H2"
}

View File

@ -18,6 +18,18 @@
</dependencies> </dependencies>
<artifactId>chat2db-hive</artifactId> <artifactId>chat2db-hive</artifactId>
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.json</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
</build>
</project> </project>

View File

@ -1,15 +1,15 @@
package ai.chat2db.plugin.hive; package ai.chat2db.plugin.hive;
import ai.chat2db.plugin.hive.builder.DBConfigBuilder;
import ai.chat2db.spi.DBManage; import ai.chat2db.spi.DBManage;
import ai.chat2db.spi.MetaData; import ai.chat2db.spi.MetaData;
import ai.chat2db.spi.Plugin; import ai.chat2db.spi.Plugin;
import ai.chat2db.spi.config.DBConfig; import ai.chat2db.spi.config.DBConfig;
import ai.chat2db.spi.util.FileUtils;
public class HivePlugin implements Plugin { public class HivePlugin implements Plugin {
@Override @Override
public DBConfig getDBConfig() { public DBConfig getDBConfig() {
return DBConfigBuilder.buildDBConfig(); return FileUtils.readJsonValue(this.getClass(),"hive.json", DBConfig.class);
} }
@Override @Override

View File

@ -1,20 +0,0 @@
package ai.chat2db.plugin.hive.builder;
import ai.chat2db.spi.config.DBConfig;
import ai.chat2db.spi.config.DriverConfig;
import com.google.common.collect.Lists;
public class DBConfigBuilder {
public static DBConfig buildDBConfig() {
DBConfig dbConfig = new DBConfig();
dbConfig.setName("Hive");
dbConfig.setDbType("HIVE");
DriverConfig driverConfig = new DriverConfig();
driverConfig.setJdbcDriver("hive-jdbc-3.1.2-standalone.jar");
driverConfig.setJdbcDriverClass("org.apache.hive.jdbc.HiveDriver");
driverConfig.setDownloadJdbcDriverUrls(Lists.newArrayList("https://oss.sqlgpt.cn/lib/hive-jdbc-3.1.2-standalone.jar"));
dbConfig.setDefaultDriverConfig(driverConfig);
dbConfig.setDriverConfigList(Lists.newArrayList(driverConfig));
return dbConfig;
}
}

View File

@ -0,0 +1,16 @@
{
"dbType": "HIVE",
"driverConfigList": [
{
"url": "jdbc:hive2://localhost:10000/",
"defaultDriver": true,
"custom": false,
"downloadJdbcDriverUrls": [
"https://oss.sqlgpt.cn/lib/hive-jdbc-3.1.2-standalone.jar"
],
"jdbcDriver": "hive-jdbc-3.1.2-standalone.jar",
"jdbcDriverClass": "org.apache.hive.jdbc.HiveDriver"
}
],
"name": "Hive"
}

View File

@ -18,5 +18,18 @@
</dependencies> </dependencies>
<artifactId>chat2db-kingbase</artifactId> <artifactId>chat2db-kingbase</artifactId>
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<!--properties的配置文件会和编译后的class文件放在一起-->
<include>**/*.json</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
</build>
</project> </project>

View File

@ -1,15 +1,15 @@
package ai.chat2db.plugin.kingbase; package ai.chat2db.plugin.kingbase;
import ai.chat2db.plugin.kingbase.builder.DBConfigBuilder;
import ai.chat2db.spi.DBManage; import ai.chat2db.spi.DBManage;
import ai.chat2db.spi.MetaData; import ai.chat2db.spi.MetaData;
import ai.chat2db.spi.Plugin; import ai.chat2db.spi.Plugin;
import ai.chat2db.spi.config.DBConfig; import ai.chat2db.spi.config.DBConfig;
import ai.chat2db.spi.util.FileUtils;
public class KingBasePlugin implements Plugin { public class KingBasePlugin implements Plugin {
@Override @Override
public DBConfig getDBConfig() { public DBConfig getDBConfig() {
return DBConfigBuilder.buildDBConfig(); return FileUtils.readJsonValue(this.getClass(),"kingbase.json", DBConfig.class);
} }
@Override @Override

View File

@ -1,28 +0,0 @@
package ai.chat2db.plugin.kingbase.builder;
import ai.chat2db.spi.config.DBConfig;
import ai.chat2db.spi.config.DriverConfig;
import com.google.common.collect.Lists;
public class DBConfigBuilder {
public static DBConfig buildDBConfig() {
DBConfig dbConfig = new DBConfig();
dbConfig.setName("KingBase");
dbConfig.setDbType("KINGBASE");
DriverConfig driverConfig = new DriverConfig();
driverConfig.setJdbcDriver("kingbase8-8.6.0.jar");
driverConfig.setJdbcDriverClass("com.kingbase8.Driver");
driverConfig.setDownloadJdbcDriverUrls(Lists.newArrayList("https://oss.sqlgpt.cn/lib/kingbase8-8.6.0.jar"));
dbConfig.setDefaultDriverConfig(driverConfig);
DriverConfig driverConfig1 = new DriverConfig();
driverConfig1.setJdbcDriver("kingbase8-8.2.0.jar");
driverConfig1.setJdbcDriverClass("com.kingbase8.Driver");
driverConfig1.setDownloadJdbcDriverUrls(Lists.newArrayList("https://oss.sqlgpt.cn/lib/kingbase8-8.2.0.jar"));
dbConfig.setDriverConfigList(Lists.newArrayList(driverConfig,driverConfig1));
return dbConfig;
}
}

View File

@ -0,0 +1,26 @@
{
"dbType": "KINGBASE",
"driverConfigList": [
{
"url": "jdbc:kingbase8://localhost:54321/",
"defaultDriver": true,
"custom": false,
"downloadJdbcDriverUrls": [
"https://oss.sqlgpt.cn/lib/kingbase8-8.6.0.jar"
],
"jdbcDriver": "kingbase8-8.6.0.jar",
"jdbcDriverClass": "com.kingbase8.Driver"
},
{
"url": "jdbc:kingbase8://localhost:54321/",
"custom": false,
"defaultDriver": false,
"downloadJdbcDriverUrls": [
"https://oss.sqlgpt.cn/lib/kingbase8-8.2.0.jar"
],
"jdbcDriver": "kingbase8-8.2.0.jar",
"jdbcDriverClass": "com.kingbase8.Driver"
}
],
"name": "KingBase"
}

View File

@ -23,5 +23,18 @@
</dependencies> </dependencies>
<artifactId>chat2db-mariadb</artifactId> <artifactId>chat2db-mariadb</artifactId>
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<!--properties的配置文件会和编译后的class文件放在一起-->
<include>**/*.json</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
</build>
</project> </project>

View File

@ -1,15 +1,15 @@
package ai.chat2db.plugin.mariadb; package ai.chat2db.plugin.mariadb;
import ai.chat2db.plugin.mariadb.builder.DBConfigBuilder;
import ai.chat2db.spi.DBManage; import ai.chat2db.spi.DBManage;
import ai.chat2db.spi.MetaData; import ai.chat2db.spi.MetaData;
import ai.chat2db.spi.Plugin; import ai.chat2db.spi.Plugin;
import ai.chat2db.spi.config.DBConfig; import ai.chat2db.spi.config.DBConfig;
import ai.chat2db.spi.util.FileUtils;
public class MariaDBPlugin implements Plugin { public class MariaDBPlugin implements Plugin {
@Override @Override
public DBConfig getDBConfig() { public DBConfig getDBConfig() {
return DBConfigBuilder.buildDBConfig(); return FileUtils.readJsonValue(this.getClass(),"mariadb.json", DBConfig.class);
} }
@Override @Override

View File

@ -1,20 +0,0 @@
package ai.chat2db.plugin.mariadb.builder;
import ai.chat2db.spi.config.DBConfig;
import ai.chat2db.spi.config.DriverConfig;
import com.google.common.collect.Lists;
public class DBConfigBuilder {
public static DBConfig buildDBConfig() {
DBConfig dbConfig = new DBConfig();
dbConfig.setName("MariaDB");
dbConfig.setDbType("MARIADB");
DriverConfig driverConfig = new DriverConfig();
driverConfig.setJdbcDriver("mariadb-java-client-3.0.8.jar");
driverConfig.setJdbcDriverClass("org.mariadb.jdbc.Driver");
driverConfig.setDownloadJdbcDriverUrls(Lists.newArrayList("https://oss.sqlgpt.cn/lib/mariadb-java-client-3.0.8.jar"));
dbConfig.setDefaultDriverConfig(driverConfig);
dbConfig.setDriverConfigList(Lists.newArrayList(driverConfig));
return dbConfig;
}
}

View File

@ -0,0 +1,16 @@
{
"dbType": "MARIADB",
"driverConfigList": [
{
"url": "jdbc:mariadb://localhost:3306/",
"defaultDriver": true,
"custom": false,
"downloadJdbcDriverUrls": [
"https://oss.sqlgpt.cn/lib/mariadb-java-client-3.0.8.jar"
],
"jdbcDriver": "mariadb-java-client-3.0.8.jar",
"jdbcDriverClass": "org.mariadb.jdbc.Driver"
}
],
"name": "MariaDB"
}

View File

@ -18,6 +18,19 @@
</dependencies> </dependencies>
<artifactId>chat2db-mongodb</artifactId> <artifactId>chat2db-mongodb</artifactId>
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<!--properties的配置文件会和编译后的class文件放在一起-->
<include>**/*.json</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
</build>
</project> </project>

View File

@ -1,15 +1,16 @@
package ai.chat2db.plugin.mongodb; package ai.chat2db.plugin.mongodb;
import ai.chat2db.plugin.mongodb.builder.DBConfigBuilder;
import ai.chat2db.spi.DBManage; import ai.chat2db.spi.DBManage;
import ai.chat2db.spi.MetaData; import ai.chat2db.spi.MetaData;
import ai.chat2db.spi.Plugin; import ai.chat2db.spi.Plugin;
import ai.chat2db.spi.config.DBConfig; import ai.chat2db.spi.config.DBConfig;
import ai.chat2db.spi.util.FileUtils;
public class MongodbPlugin implements Plugin { public class MongodbPlugin implements Plugin {
@Override @Override
public DBConfig getDBConfig() { public DBConfig getDBConfig() {
return DBConfigBuilder.buildDBConfig(); return FileUtils.readJsonValue(this.getClass(),"mongodb.json", DBConfig.class);
} }
@Override @Override

View File

@ -1,20 +0,0 @@
package ai.chat2db.plugin.mongodb.builder;
import ai.chat2db.spi.config.DBConfig;
import ai.chat2db.spi.config.DriverConfig;
import com.google.common.collect.Lists;
public class DBConfigBuilder {
public static DBConfig buildDBConfig() {
DBConfig dbConfig = new DBConfig();
dbConfig.setName("Mongodb");
dbConfig.setDbType("MONGODB");
DriverConfig driverConfig = new DriverConfig();
driverConfig.setJdbcDriver("mongo-jdbc-standalone-1.18.jar");
driverConfig.setJdbcDriverClass("com.dbschema.MongoJdbcDriver");
driverConfig.setDownloadJdbcDriverUrls(Lists.newArrayList("https://oss.sqlgpt.cn/lib/mongo-jdbc-standalone-1.18.jar"));
dbConfig.setDefaultDriverConfig(driverConfig);
dbConfig.setDriverConfigList(Lists.newArrayList(driverConfig));
return dbConfig;
}
}

View File

@ -0,0 +1,16 @@
{
"dbType": "MONGODB",
"driverConfigList": [
{
"url": "jdbc:mongodb://localhost:27017",
"defaultDriver":true,
"custom": false,
"downloadJdbcDriverUrls": [
"https://oss.sqlgpt.cn/lib/mongo-jdbc-standalone-1.18.jar"
],
"jdbcDriver": "mongo-jdbc-standalone-1.18.jar",
"jdbcDriverClass": "com.dbschema.MongoJdbcDriver"
}
],
"name": "Mongodb"
}

View File

@ -18,4 +18,18 @@
<artifactId>chat2db-spi</artifactId> <artifactId>chat2db-spi</artifactId>
</dependency> </dependency>
</dependencies> </dependencies>
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<!--properties的配置文件会和编译后的class文件放在一起-->
<include>**/*.json</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
</build>
</project> </project>

View File

@ -1,16 +1,16 @@
package ai.chat2db.plugin.mysql; package ai.chat2db.plugin.mysql;
import ai.chat2db.plugin.mysql.builder.DBConfigBuilder;
import ai.chat2db.spi.DBManage; import ai.chat2db.spi.DBManage;
import ai.chat2db.spi.MetaData; import ai.chat2db.spi.MetaData;
import ai.chat2db.spi.Plugin; import ai.chat2db.spi.Plugin;
import ai.chat2db.spi.config.DBConfig; import ai.chat2db.spi.config.DBConfig;
import ai.chat2db.spi.util.FileUtils;
public class MysqlPlugin implements Plugin { public class MysqlPlugin implements Plugin {
@Override @Override
public DBConfig getDBConfig() { public DBConfig getDBConfig() {
return DBConfigBuilder.buildDBConfig(); return FileUtils.readJsonValue(this.getClass(),"mysql.json", DBConfig.class);
} }
@Override @Override

View File

@ -1,29 +0,0 @@
package ai.chat2db.plugin.mysql.builder;
import ai.chat2db.spi.config.DBConfig;
import ai.chat2db.spi.config.DriverConfig;
import com.google.common.collect.Lists;
public class DBConfigBuilder {
public static DBConfig buildDBConfig() {
DBConfig dbConfig = new DBConfig();
dbConfig.setName("Mysql");
dbConfig.setDbType("MYSQL");
DriverConfig driverConfig = new DriverConfig();
driverConfig.setJdbcDriver("mysql-connector-java-8.0.30.jar");
driverConfig.setJdbcDriverClass("com.mysql.cj.jdbc.Driver");
driverConfig.setDownloadJdbcDriverUrls(Lists.newArrayList("https://oss.sqlgpt.cn/lib/mysql-connector-java-8.0.30.jar"));
dbConfig.setDefaultDriverConfig(driverConfig);
DriverConfig driverConfig2 = new DriverConfig();
driverConfig2.setJdbcDriver("mysql-connector-java-5.1.47.jar");
driverConfig2.setJdbcDriverClass("com.mysql.jdbc.Driver");
driverConfig2.setDownloadJdbcDriverUrls(Lists.newArrayList("https://oss.sqlgpt.cn/lib/mysql-connector-java-5.1.47.jar"));
dbConfig.setDriverConfigList(Lists.newArrayList(driverConfig,driverConfig2));
return dbConfig;
}
}

View File

@ -0,0 +1,26 @@
{
"dbType": "MYSQL",
"driverConfigList": [
{
"url": "jdbc:mysql://localhost:3306/",
"defaultDriver": true,
"custom": false,
"downloadJdbcDriverUrls": [
"https://oss.sqlgpt.cn/lib/mysql-connector-java-8.0.30.jar"
],
"jdbcDriver": "mysql-connector-java-8.0.30.jar",
"jdbcDriverClass": "com.mysql.cj.jdbc.Driver"
},
{
"url": "jdbc:mysql://localhost:3306/",
"defaultDriver": false,
"custom": false,
"downloadJdbcDriverUrls": [
"https://oss.sqlgpt.cn/lib/mysql-connector-java-5.1.47.jar"
],
"jdbcDriver": "mysql-connector-java-5.1.47.jar",
"jdbcDriverClass": "com.mysql.jdbc.Driver"
}
],
"name": "Mysql"
}

View File

@ -18,5 +18,18 @@
</dependencies> </dependencies>
<artifactId>chat2db-oceanbase</artifactId> <artifactId>chat2db-oceanbase</artifactId>
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<!--properties的配置文件会和编译后的class文件放在一起-->
<include>**/*.json</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
</build>
</project> </project>

View File

@ -1,16 +1,15 @@
package ai.chat2db.plugin.oceanbase; package ai.chat2db.plugin.oceanbase;
import ai.chat2db.plugin.oceanbase.builder.DBConfigBuilder;
import ai.chat2db.spi.DBManage; import ai.chat2db.spi.DBManage;
import ai.chat2db.spi.MetaData; import ai.chat2db.spi.MetaData;
import ai.chat2db.spi.Plugin; import ai.chat2db.spi.Plugin;
import ai.chat2db.spi.config.DBConfig; import ai.chat2db.spi.config.DBConfig;
import ai.chat2db.spi.jdbc.DefaultMetaService; import ai.chat2db.spi.util.FileUtils;
public class OceanBasePlugin implements Plugin { public class OceanBasePlugin implements Plugin {
@Override @Override
public DBConfig getDBConfig() { public DBConfig getDBConfig() {
return DBConfigBuilder.buildDBConfig(); return FileUtils.readJsonValue(this.getClass(),"oceanbase.json", DBConfig.class);
} }
@Override @Override

View File

@ -1,20 +0,0 @@
package ai.chat2db.plugin.oceanbase.builder;
import ai.chat2db.spi.config.DBConfig;
import ai.chat2db.spi.config.DriverConfig;
import com.google.common.collect.Lists;
public class DBConfigBuilder {
public static DBConfig buildDBConfig() {
DBConfig dbConfig = new DBConfig();
dbConfig.setName("OceanBase");
dbConfig.setDbType("OCEANBASE");
DriverConfig driverConfig = new DriverConfig();
driverConfig.setJdbcDriver("oceanbase-client-2.4.2.jar");
driverConfig.setJdbcDriverClass("com.oceanbase.jdbc.Driver");
driverConfig.setDownloadJdbcDriverUrls(Lists.newArrayList("https://oss.sqlgpt.cn/lib/oceanbase-client-2.4.2.jar"));
dbConfig.setDefaultDriverConfig(driverConfig);
dbConfig.setDriverConfigList(Lists.newArrayList(driverConfig));
return dbConfig;
}
}

View File

@ -0,0 +1,16 @@
{
"dbType": "OCEANBASE",
"driverConfigList": [
{
"url": "jdbc:oceanbase://localhost:2883/",
"custom": false,
"defaultDriver": true,
"downloadJdbcDriverUrls": [
"https://oss.sqlgpt.cn/lib/oceanbase-client-2.4.2.jar"
],
"jdbcDriver": "oceanbase-client-2.4.2.jar",
"jdbcDriverClass": "com.oceanbase.jdbc.Driver"
}
],
"name": "OceanBase"
}

View File

@ -19,4 +19,18 @@
<artifactId>chat2db-spi</artifactId> <artifactId>chat2db-spi</artifactId>
</dependency> </dependency>
</dependencies> </dependencies>
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<!--properties的配置文件会和编译后的class文件放在一起-->
<include>**/*.json</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
</build>
</project> </project>

View File

@ -1,16 +1,17 @@
package ai.chat2db.plugin.oracle; package ai.chat2db.plugin.oracle;
import ai.chat2db.plugin.oracle.builder.DBConfigBuilder;
import ai.chat2db.spi.DBManage; import ai.chat2db.spi.DBManage;
import ai.chat2db.spi.MetaData; import ai.chat2db.spi.MetaData;
import ai.chat2db.spi.Plugin; import ai.chat2db.spi.Plugin;
import ai.chat2db.spi.config.DBConfig; import ai.chat2db.spi.config.DBConfig;
import ai.chat2db.spi.util.FileUtils;
public class OraclePlugin implements Plugin { public class OraclePlugin implements Plugin {
@Override @Override
public DBConfig getDBConfig() { public DBConfig getDBConfig() {
return DBConfigBuilder.buildDBConfig(); return FileUtils.readJsonValue(this.getClass(),"oracle.json", DBConfig.class);
} }
@Override @Override

View File

@ -1,23 +0,0 @@
package ai.chat2db.plugin.oracle.builder;
import ai.chat2db.spi.config.DBConfig;
import ai.chat2db.spi.config.DriverConfig;
import com.google.common.collect.Lists;
public class DBConfigBuilder {
public static DBConfig buildDBConfig() {
DBConfig dbConfig = new DBConfig();
dbConfig.setName("Oracle");
dbConfig.setDbType("ORACLE");
DriverConfig driverConfig = new DriverConfig();
driverConfig.setJdbcDriver("ojdbc8-19.3.0.0.jar,orai18n-19.3.0.0.jar");
driverConfig.setJdbcDriverClass("oracle.jdbc.driver.OracleDriver");
driverConfig.setDownloadJdbcDriverUrls(Lists.newArrayList("https://oss.sqlgpt.cn/lib/ojdbc8-19.3.0.0.jar", "https://oss.sqlgpt.cn/lib/orai18n-19.3.0.0.jar"));
dbConfig.setDefaultDriverConfig(driverConfig);
dbConfig.setDriverConfigList(Lists.newArrayList(driverConfig));
return dbConfig;
}
}

View File

@ -0,0 +1,17 @@
{
"dbType": "ORACLE",
"driverConfigList": [
{
"url": "jdbc:oracle:thin:@localhost:1521:XE",
"custom": false,
"defaultDriver": true,
"downloadJdbcDriverUrls": [
"https://oss.sqlgpt.cn/lib/ojdbc8-19.3.0.0.jar",
"https://oss.sqlgpt.cn/lib/orai18n-19.3.0.0.jar"
],
"jdbcDriver": "ojdbc8-19.3.0.0.jar,orai18n-19.3.0.0.jar",
"jdbcDriverClass": "oracle.jdbc.driver.OracleDriver"
}
],
"name": "Oracle"
}

View File

@ -19,5 +19,18 @@
<artifactId>chat2db-spi</artifactId> <artifactId>chat2db-spi</artifactId>
</dependency> </dependency>
</dependencies> </dependencies>
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<!--properties的配置文件会和编译后的class文件放在一起-->
<include>**/*.json</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
</build>
</project> </project>

View File

@ -1,15 +1,15 @@
package ai.chat2db.plugin.postgresql; package ai.chat2db.plugin.postgresql;
import ai.chat2db.plugin.postgresql.builder.DBConfigBuilder;
import ai.chat2db.spi.DBManage; import ai.chat2db.spi.DBManage;
import ai.chat2db.spi.MetaData; import ai.chat2db.spi.MetaData;
import ai.chat2db.spi.Plugin; import ai.chat2db.spi.Plugin;
import ai.chat2db.spi.config.DBConfig; import ai.chat2db.spi.config.DBConfig;
import ai.chat2db.spi.util.FileUtils;
public class PostgreSQLPlugin implements Plugin { public class PostgreSQLPlugin implements Plugin {
@Override @Override
public DBConfig getDBConfig() { public DBConfig getDBConfig() {
return DBConfigBuilder.buildDBConfig(); return FileUtils.readJsonValue(this.getClass(),"pg.json", DBConfig.class);
} }
@Override @Override

View File

@ -1,21 +0,0 @@
package ai.chat2db.plugin.postgresql.builder;
import ai.chat2db.spi.config.DBConfig;
import ai.chat2db.spi.config.DriverConfig;
import com.google.common.collect.Lists;
public class DBConfigBuilder {
public static DBConfig buildDBConfig() {
DBConfig dbConfig = new DBConfig();
dbConfig.setName("PostgreSQL");
dbConfig.setDbType("POSTGRESQL");
DriverConfig driverConfig = new DriverConfig();
driverConfig.setJdbcDriver("postgresql-42.5.1.jar");
driverConfig.setJdbcDriverClass("org.postgresql.Driver");
driverConfig.setDownloadJdbcDriverUrls(Lists.newArrayList("https://oss.sqlgpt.cn/lib/postgresql-42.5.1.jar"));
dbConfig.setDefaultDriverConfig(driverConfig);
dbConfig.setDriverConfigList(Lists.newArrayList(driverConfig));
return dbConfig;
}
}

View File

@ -0,0 +1,16 @@
{
"dbType": "POSTGRESQL",
"driverConfigList": [
{
"url": "jdbc:postgresql://localhost:5432/postgres",
"custom": false,
"defaultDriver": true,
"downloadJdbcDriverUrls": [
"https://oss.sqlgpt.cn/lib/postgresql-42.5.1.jar"
],
"jdbcDriver": "postgresql-42.5.1.jar",
"jdbcDriverClass": "org.postgresql.Driver"
}
],
"name": "PostgreSQL"
}

View File

@ -17,5 +17,18 @@
</dependencies> </dependencies>
<artifactId>chat2db-presto</artifactId> <artifactId>chat2db-presto</artifactId>
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<!--properties的配置文件会和编译后的class文件放在一起-->
<include>**/*.json</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
</build>
</project> </project>

View File

@ -1,16 +1,16 @@
package ai.chat2db.plugin.presto; package ai.chat2db.plugin.presto;
import ai.chat2db.plugin.presto.builder.DBConfigBuilder;
import ai.chat2db.spi.DBManage; import ai.chat2db.spi.DBManage;
import ai.chat2db.spi.MetaData; import ai.chat2db.spi.MetaData;
import ai.chat2db.spi.Plugin; import ai.chat2db.spi.Plugin;
import ai.chat2db.spi.config.DBConfig; import ai.chat2db.spi.config.DBConfig;
import ai.chat2db.spi.util.FileUtils;
public class PrestoPlugin implements Plugin { public class PrestoPlugin implements Plugin {
@Override @Override
public DBConfig getDBConfig() { public DBConfig getDBConfig() {
return DBConfigBuilder.buildDBConfig(); return FileUtils.readJsonValue(this.getClass(),"presto.json", DBConfig.class);
} }
@Override @Override

View File

@ -1,20 +0,0 @@
package ai.chat2db.plugin.presto.builder;
import ai.chat2db.spi.config.DBConfig;
import ai.chat2db.spi.config.DriverConfig;
import com.google.common.collect.Lists;
public class DBConfigBuilder {
public static DBConfig buildDBConfig() {
DBConfig dbConfig = new DBConfig();
dbConfig.setName("Presto");
dbConfig.setDbType("PRESTO");
DriverConfig driverConfig = new DriverConfig();
driverConfig.setJdbcDriver("presto-jdbc-0.245.1.jar");
driverConfig.setJdbcDriverClass("com.facebook.presto.jdbc.PrestoDriver");
driverConfig.setDownloadJdbcDriverUrls(Lists.newArrayList("https://oss.sqlgpt.cn/lib/presto-jdbc-0.245.1.jar"));
dbConfig.setDefaultDriverConfig(driverConfig);
dbConfig.setDriverConfigList(Lists.newArrayList(driverConfig));
return dbConfig;
}
}

View File

@ -0,0 +1,16 @@
{
"dbType": "PRESTO",
"driverConfigList": [
{
"url": "jdbc:presto://localhost:8080/",
"custom": false,
"defaultDriver": true,
"downloadJdbcDriverUrls": [
"https://oss.sqlgpt.cn/lib/presto-jdbc-0.245.1.jar"
],
"jdbcDriver": "presto-jdbc-0.245.1.jar",
"jdbcDriverClass": "com.facebook.presto.jdbc.PrestoDriver"
}
],
"name": "Presto"
}

View File

@ -17,5 +17,18 @@
</dependencies> </dependencies>
<artifactId>chat2db-redis</artifactId> <artifactId>chat2db-redis</artifactId>
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<!--properties的配置文件会和编译后的class文件放在一起-->
<include>**/*.json</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
</build>
</project> </project>

View File

@ -1,17 +1,18 @@
package ai.chat2db.plugin.redis; package ai.chat2db.plugin.redis;
import ai.chat2db.plugin.redis.builder.DBConfigBuilder;
import ai.chat2db.spi.DBManage; import ai.chat2db.spi.DBManage;
import ai.chat2db.spi.MetaData; import ai.chat2db.spi.MetaData;
import ai.chat2db.spi.Plugin; import ai.chat2db.spi.Plugin;
import ai.chat2db.spi.config.DBConfig; import ai.chat2db.spi.config.DBConfig;
import ai.chat2db.spi.util.FileUtils;
public class RedisPlugin implements Plugin { public class RedisPlugin implements Plugin {
@Override @Override
public DBConfig getDBConfig() { public DBConfig getDBConfig() {
return DBConfigBuilder.buildDBConfig(); return FileUtils.readJsonValue(this.getClass(),"redis.json", DBConfig.class);
} }
@Override @Override

View File

@ -1,20 +0,0 @@
package ai.chat2db.plugin.redis.builder;
import ai.chat2db.spi.config.DBConfig;
import ai.chat2db.spi.config.DriverConfig;
import com.google.common.collect.Lists;
public class DBConfigBuilder {
public static DBConfig buildDBConfig() {
DBConfig dbConfig = new DBConfig();
dbConfig.setName("Redis");
dbConfig.setDbType("REDIS");
DriverConfig driverConfig = new DriverConfig();
driverConfig.setJdbcDriver("redis-jdbc-driver-1.3.jar");
driverConfig.setJdbcDriverClass("jdbc.RedisDriver");
driverConfig.setDownloadJdbcDriverUrls(Lists.newArrayList("https://oss.sqlgpt.cn/lib/redis-jdbc-driver-1.3.jar"));
dbConfig.setDefaultDriverConfig(driverConfig);
dbConfig.setDriverConfigList(Lists.newArrayList(driverConfig));
return dbConfig;
}
}

View File

@ -0,0 +1,16 @@
{
"dbType": "REDIS",
"driverConfigList": [
{
"url": "jdbc:redis://127.0.0.1:6379/0",
"custom": false,
"defaultDriver": true,
"downloadJdbcDriverUrls": [
"https://oss.sqlgpt.cn/lib/redis-jdbc-driver-1.3.jar"
],
"jdbcDriver": "redis-jdbc-driver-1.3.jar",
"jdbcDriverClass": "jdbc.RedisDriver"
}
],
"name": "Redis"
}

View File

@ -16,4 +16,18 @@
<artifactId>chat2db-spi</artifactId> <artifactId>chat2db-spi</artifactId>
</dependency> </dependency>
</dependencies> </dependencies>
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<!--properties的配置文件会和编译后的class文件放在一起-->
<include>**/*.json</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
</build>
</project> </project>

View File

@ -1,15 +1,15 @@
package ai.chat2db.plugin.sqlite; package ai.chat2db.plugin.sqlite;
import ai.chat2db.plugin.sqlite.builder.DBConfigBuilder;
import ai.chat2db.spi.DBManage; import ai.chat2db.spi.DBManage;
import ai.chat2db.spi.MetaData; import ai.chat2db.spi.MetaData;
import ai.chat2db.spi.Plugin; import ai.chat2db.spi.Plugin;
import ai.chat2db.spi.config.DBConfig; import ai.chat2db.spi.config.DBConfig;
import ai.chat2db.spi.util.FileUtils;
public class SqlitePlugin implements Plugin { public class SqlitePlugin implements Plugin {
@Override @Override
public DBConfig getDBConfig() { public DBConfig getDBConfig() {
return DBConfigBuilder.buildDBConfig(); return FileUtils.readJsonValue(this.getClass(),"sqlite.json", DBConfig.class);
} }
@Override @Override

View File

@ -1,21 +0,0 @@
package ai.chat2db.plugin.sqlite.builder;
import ai.chat2db.spi.config.DBConfig;
import ai.chat2db.spi.config.DriverConfig;
import com.google.common.collect.Lists;
public class DBConfigBuilder {
public static DBConfig buildDBConfig() {
DBConfig dbConfig = new DBConfig();
dbConfig.setName("SQLite");
dbConfig.setDbType("SQLITE");
DriverConfig driverConfig = new DriverConfig();
driverConfig.setJdbcDriver("sqlite-jdbc-3.39.3.0.jar");
driverConfig.setJdbcDriverClass("org.sqlite.JDBC");
driverConfig.setDownloadJdbcDriverUrls(Lists.newArrayList("https://oss.sqlgpt.cn/lib/sqlite-jdbc-3.39.3.0.jar"));
dbConfig.setDefaultDriverConfig(driverConfig);
dbConfig.setDriverConfigList(Lists.newArrayList(driverConfig));
return dbConfig;
}
}

View File

@ -0,0 +1,16 @@
{
"dbType": "SQLITE",
"driverConfigList": [
{
"url": "jdbc:sqlite:identifier.sqlite",
"custom": false,
"defaultDriver": true,
"downloadJdbcDriverUrls": [
"https://oss.sqlgpt.cn/lib/sqlite-jdbc-3.39.3.0.jar"
],
"jdbcDriver": "sqlite-jdbc-3.39.3.0.jar",
"jdbcDriverClass": "org.sqlite.JDBC"
}
],
"name": "SQLite"
}

View File

@ -24,5 +24,18 @@
<!-- <scope>test</scope>--> <!-- <scope>test</scope>-->
<!-- </dependency>--> <!-- </dependency>-->
</dependencies> </dependencies>
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<!--properties的配置文件会和编译后的class文件放在一起-->
<include>**/*.json</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
</build>
</project> </project>

View File

@ -1,16 +1,16 @@
package ai.chat2db.plugin.sqlserver; package ai.chat2db.plugin.sqlserver;
import ai.chat2db.plugin.sqlserver.builder.SqlServerDBConfigBuilder;
import ai.chat2db.spi.DBManage; import ai.chat2db.spi.DBManage;
import ai.chat2db.spi.MetaData; import ai.chat2db.spi.MetaData;
import ai.chat2db.spi.Plugin; import ai.chat2db.spi.Plugin;
import ai.chat2db.spi.config.DBConfig; import ai.chat2db.spi.config.DBConfig;
import ai.chat2db.spi.util.FileUtils;
public class SqlServerPlugin implements Plugin { public class SqlServerPlugin implements Plugin {
@Override @Override
public DBConfig getDBConfig() { public DBConfig getDBConfig() {
return SqlServerDBConfigBuilder.buildDBConfig(); return FileUtils.readJsonValue(this.getClass(),"sqlserver.json", DBConfig.class);
} }
@Override @Override

View File

@ -1,21 +0,0 @@
package ai.chat2db.plugin.sqlserver.builder;
import ai.chat2db.spi.config.DBConfig;
import ai.chat2db.spi.config.DriverConfig;
import com.google.common.collect.Lists;
public class SqlServerDBConfigBuilder {
public static DBConfig buildDBConfig() {
DBConfig dbConfig = new DBConfig();
dbConfig.setName("SQLServer");
dbConfig.setDbType("SQLSERVER");
DriverConfig driverConfig = new DriverConfig();
driverConfig.setJdbcDriver("mssql-jdbc-11.2.1.jre17.jar");
driverConfig.setJdbcDriverClass("com.microsoft.sqlserver.jdbc.SQLServerDriver");
driverConfig.setDownloadJdbcDriverUrls(Lists.newArrayList("https://oss.sqlgpt.cn/lib/mssql-jdbc-11.2.1.jre17.jar"));
dbConfig.setDefaultDriverConfig(driverConfig);
dbConfig.setDriverConfigList(Lists.newArrayList(driverConfig));
return dbConfig;
}
}

View File

@ -0,0 +1,16 @@
{
"dbType": "SQLSERVER",
"driverConfigList": [
{
"url": "jdbc:sqlserver://localhost:1433;database=master",
"custom": false,
"defaultDriver": true,
"downloadJdbcDriverUrls": [
"https://oss.sqlgpt.cn/lib/mssql-jdbc-11.2.1.jre17.jar"
],
"jdbcDriver": "mssql-jdbc-11.2.1.jre17.jar",
"jdbcDriverClass": "com.microsoft.sqlserver.jdbc.SQLServerDriver"
}
],
"name": "SQLServer"
}

View File

@ -0,0 +1,13 @@
package ai.chat2db.server.domain.core.converter;
import ai.chat2db.server.domain.repository.entity.JdbcDriverDO;
import ai.chat2db.spi.config.DriverConfig;
import lombok.extern.slf4j.Slf4j;
import org.mapstruct.Mapper;
@Slf4j
@Mapper(componentModel = "spring")
public abstract class DriverConfigConverter {
public abstract DriverConfig do2Config(JdbcDriverDO driverDO);
}

View File

@ -89,10 +89,13 @@ public class DataSourceServiceImpl implements DataSourceService {
if (dataSourceKind == DataSourceKindEnum.SHARED && !ContextUtils.getLoginUser().getAdmin()) { if (dataSourceKind == DataSourceKindEnum.SHARED && !ContextUtils.getLoginUser().getAdmin()) {
throw new PermissionDeniedBusinessException(); throw new PermissionDeniedBusinessException();
} }
JdbcUtils.removePropertySameAsDefault(param.getDriverConfig());
DataSourceDO dataSourceDO = dataSourceConverter.param2do(param); DataSourceDO dataSourceDO = dataSourceConverter.param2do(param);
dataSourceDO.setGmtCreate(DateUtil.date()); dataSourceDO.setGmtCreate(DateUtil.date());
dataSourceDO.setGmtModified(DateUtil.date()); dataSourceDO.setGmtModified(DateUtil.date());
dataSourceDO.setUserId(ContextUtils.getUserId()); dataSourceDO.setUserId(ContextUtils.getUserId());
dataSourceDO.setExtendInfo(null);
dataSourceMapper.insert(dataSourceDO); dataSourceMapper.insert(dataSourceDO);
preWarmingData(dataSourceDO.getId()); preWarmingData(dataSourceDO.getId());
return DataResult.of(dataSourceDO.getId()); return DataResult.of(dataSourceDO.getId());
@ -125,6 +128,7 @@ public class DataSourceServiceImpl implements DataSourceService {
DataSource dataSource = queryExistent(param.getId(), null).getData(); DataSource dataSource = queryExistent(param.getId(), null).getData();
PermissionUtils.checkOperationPermission(dataSource.getUserId()); PermissionUtils.checkOperationPermission(dataSource.getUserId());
JdbcUtils.removePropertySameAsDefault(param.getDriverConfig());
DataSourceDO dataSourceDO = dataSourceConverter.param2do(param); DataSourceDO dataSourceDO = dataSourceConverter.param2do(param);
dataSourceDO.setGmtModified(DateUtil.date()); dataSourceDO.setGmtModified(DateUtil.date());
dataSourceMapper.updateById(dataSourceDO); dataSourceMapper.updateById(dataSourceDO);

View File

@ -1,12 +1,7 @@
package ai.chat2db.server.domain.core.impl; package ai.chat2db.server.domain.core.impl;
import java.io.File;
import java.io.IOException;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import ai.chat2db.server.domain.api.service.JdbcDriverService; import ai.chat2db.server.domain.api.service.JdbcDriverService;
import ai.chat2db.server.domain.core.converter.DriverConfigConverter;
import ai.chat2db.server.domain.repository.entity.JdbcDriverDO; import ai.chat2db.server.domain.repository.entity.JdbcDriverDO;
import ai.chat2db.server.domain.repository.mapper.JdbcDriverMapper; import ai.chat2db.server.domain.repository.mapper.JdbcDriverMapper;
import ai.chat2db.server.tools.base.wrapper.result.ActionResult; import ai.chat2db.server.tools.base.wrapper.result.ActionResult;
@ -22,6 +17,16 @@ import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.io.File;
import java.io.IOException;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import static ai.chat2db.spi.util.JdbcUtils.setDriverDefaultProperty;
@Slf4j @Slf4j
@Service @Service
public class JdbcDriverServiceImpl implements JdbcDriverService { public class JdbcDriverServiceImpl implements JdbcDriverService {
@ -29,50 +34,31 @@ public class JdbcDriverServiceImpl implements JdbcDriverService {
@Autowired @Autowired
private JdbcDriverMapper jdbcDriverMapper; private JdbcDriverMapper jdbcDriverMapper;
@Autowired
private DriverConfigConverter driverConfigConverter;
@Override @Override
public DataResult<DBConfig> getDrivers(String dbType) { public DataResult<DBConfig> getDrivers(String dbType) {
Map<String, DriverConfig> driverConfigMap = new LinkedHashMap<>(); Map<String, DriverConfig> driverConfigMap = new LinkedHashMap<>();
LambdaQueryWrapper<JdbcDriverDO> query = new LambdaQueryWrapper<JdbcDriverDO>(); LambdaQueryWrapper<JdbcDriverDO> query = new LambdaQueryWrapper<JdbcDriverDO>();
query.eq(JdbcDriverDO::getDbType, dbType); query.eq(JdbcDriverDO::getDbType, dbType);
List<JdbcDriverDO> driverDOS = jdbcDriverMapper.selectList(query); List<JdbcDriverDO> driverDOS = jdbcDriverMapper.selectList(query);
List<DriverConfig> driverConfigs = Lists.newArrayList();
if (!CollectionUtils.isEmpty(driverDOS)) { if (!CollectionUtils.isEmpty(driverDOS)) {
for (JdbcDriverDO driverConfig : driverDOS) { driverConfigs = driverDOS.stream().map(driverConfigConverter::do2Config).collect(Collectors.toList());
String[] jarPaths = driverConfig.getJdbcDriver().split(",");
boolean flag = true;
for (String jarPath : jarPaths) {
File file = new File(JdbcJarUtils.PATH + jarPath);
if (!file.exists()) {
flag = false;
break;
}
}
if (flag && driverConfigMap.get(driverConfig.getJdbcDriver()) == null) {
DriverConfig dc = new DriverConfig();
dc.setCustom(true);
dc.setDbType(driverConfig.getDbType());
dc.setJdbcDriver(driverConfig.getJdbcDriver());
dc.setJdbcDriverClass(driverConfig.getJdbcDriverClass());
driverConfigMap.put(driverConfig.getJdbcDriver(), dc);
} else {
log.warn("Driver file not found: {}", driverConfig.getJdbcDriver());
}
}
} }
DBConfig dbConfig = Chat2DBContext.PLUGIN_MAP.get(dbType).getDBConfig(); DBConfig dbConfig = Chat2DBContext.PLUGIN_MAP.get(dbType).getDBConfig();
List<DriverConfig> driverConfigList = dbConfig.getDriverConfigList(); List<DriverConfig> driverConfigList = dbConfig.getDriverConfigList();
for (DriverConfig driverConfig : driverConfigList) { if (CollectionUtils.isNotEmpty(driverConfigList)) {
String[] jarPaths = driverConfig.getJdbcDriver().split(","); driverConfigs.addAll(driverConfigList);
boolean flag = true; }
for (String jarPath : jarPaths) {
File file = new File(JdbcJarUtils.PATH + jarPath); for (DriverConfig driverConfig : driverConfigs) {
if (!file.exists()) { boolean flag = driverExists(driverConfig);
flag = false;
break;
}
}
if (flag && driverConfigMap.get(driverConfig.getJdbcDriver()) == null) { if (flag && driverConfigMap.get(driverConfig.getJdbcDriver()) == null) {
driverConfigMap.put(driverConfig.getJdbcDriver(), driverConfig); driverConfigMap.put(driverConfig.getJdbcDriver(), driverConfig);
setDriverDefaultProperty(driverConfig);
} else { } else {
log.warn("Driver file not found: {}", driverConfig.getJdbcDriver()); log.warn("Driver file not found: {}", driverConfig.getJdbcDriver());
} }
@ -81,6 +67,20 @@ public class JdbcDriverServiceImpl implements JdbcDriverService {
return DataResult.of(dbConfig); return DataResult.of(dbConfig);
} }
private boolean driverExists(DriverConfig driverConfig) {
boolean flag = true;
String[] jarPaths = driverConfig.getJdbcDriver().split(",");
for (String jarPath : jarPaths) {
File file = new File(JdbcJarUtils.PATH + jarPath);
if (!file.exists()) {
flag = false;
break;
}
}
return flag;
}
@Override @Override
public ActionResult upload(String dbType, String jdbcDriverClass, String localPath) { public ActionResult upload(String dbType, String jdbcDriverClass, String localPath) {
JdbcDriverDO driverDO = new JdbcDriverDO(); JdbcDriverDO driverDO = new JdbcDriverDO();

View File

@ -0,0 +1,15 @@
package ai.chat2db.server.test.temp;
import java.sql.Driver;
import java.sql.DriverPropertyInfo;
import java.sql.SQLException;
public class DriverTest {
public static void main(String[] args) throws SQLException {
Driver driver = new org.mariadb.jdbc.Driver();
DriverPropertyInfo[] driverPropertyInfos = driver.getPropertyInfo("jdbc:mariadb://localhost:3306", null);
System.out.println(driverPropertyInfos.length);
}
}

View File

@ -77,7 +77,7 @@
<dependency> <dependency>
<groupId>org.locationtech.jts</groupId> <groupId>org.locationtech.jts</groupId>
<artifactId>jts-core</artifactId> <artifactId>jts-core</artifactId>
<version>1.18.1</version> <!-- 确保使用最新的版本 --> <version>1.19.0</version> <!-- 确保使用最新的版本 -->
</dependency> </dependency>
</dependencies> </dependencies>
</project> </project>

View File

@ -1,7 +1,7 @@
package ai.chat2db.spi.config; package ai.chat2db.spi.config;
import lombok.Data; import org.apache.commons.collections4.CollectionUtils;
import java.util.List; import java.util.List;
@ -9,7 +9,6 @@ import java.util.List;
* @author jipengfei * @author jipengfei
* @version : DBConfig.java * @version : DBConfig.java
*/ */
@Data
public class DBConfig { public class DBConfig {
/** /**
@ -32,7 +31,6 @@ public class DBConfig {
*/ */
private List<DriverConfig> driverConfigList; private List<DriverConfig> driverConfigList;
/** /**
* 建表语句 * 建表语句
*/ */
@ -42,4 +40,73 @@ public class DBConfig {
* 修改表结构 * 修改表结构
*/ */
private String simpleAlterTable; private String simpleAlterTable;
public String getDbType() {
return dbType;
}
public void setDbType(String dbType) {
this.dbType = dbType;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public DriverConfig getDefaultDriverConfig() {
if (this.defaultDriverConfig != null) {
return this.defaultDriverConfig;
} else {
if (!CollectionUtils.isEmpty(driverConfigList)) {
for (DriverConfig driverConfig : driverConfigList) {
if (driverConfig.isDefaultDriver()) {
return driverConfig;
}
}
return driverConfigList.get(0);
}
}
return null;
}
public void setDefaultDriverConfig(DriverConfig defaultDriverConfig) {
this.defaultDriverConfig = defaultDriverConfig;
}
public List<DriverConfig> getDriverConfigList() {
return driverConfigList;
}
public void setDriverConfigList(List<DriverConfig> driverConfigList) {
this.driverConfigList = driverConfigList;
if (!CollectionUtils.isEmpty(driverConfigList)) {
for (DriverConfig driverConfig : driverConfigList) {
if (driverConfig.isDefaultDriver()) {
this.defaultDriverConfig = driverConfig;
break;
}
}
}
}
public String getSimpleCreateTable() {
return simpleCreateTable;
}
public void setSimpleCreateTable(String simpleCreateTable) {
this.simpleCreateTable = simpleCreateTable;
}
public String getSimpleAlterTable() {
return simpleAlterTable;
}
public void setSimpleAlterTable(String simpleAlterTable) {
this.simpleAlterTable = simpleAlterTable;
}
} }

View File

@ -3,6 +3,7 @@ package ai.chat2db.spi.config;
import java.util.List; import java.util.List;
import ai.chat2db.spi.model.KeyValue;
import lombok.Data; import lombok.Data;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
@ -12,6 +13,11 @@ import org.apache.commons.lang3.StringUtils;
*/ */
@Data @Data
public class DriverConfig { public class DriverConfig {
/**
* url
*/
private String url;
/** /**
* jdbcDriver * jdbcDriver
*/ */
@ -22,17 +28,14 @@ public class DriverConfig {
*/ */
private String jdbcDriverClass; private String jdbcDriverClass;
///**
// * name
// */
//private String name;
/** /**
* downloadJdbcDriverUrls * downloadJdbcDriverUrls
*/ */
private List<String> downloadJdbcDriverUrls; private List<String> downloadJdbcDriverUrls;
/**
* dbType
*/
private String dbType; private String dbType;
/** /**
@ -40,6 +43,13 @@ public class DriverConfig {
*/ */
private boolean custom; private boolean custom;
/**
* properties
*/
private List<KeyValue> extendInfo;
private boolean defaultDriver;
public boolean notEmpty() { public boolean notEmpty() {
return StringUtils.isNotBlank(getJdbcDriver()) && StringUtils.isNotBlank( return StringUtils.isNotBlank(getJdbcDriver()) && StringUtils.isNotBlank(

View File

@ -23,7 +23,17 @@ public class KeyValue implements Serializable {
/** /**
* 属性值 * 属性值
*/ */
private Object value; private String value;
/**
* 是否必填
*/
private boolean required;
/**
* 选项
*/
private List<String> choices;
public static Map<String, Object> toMap(List<KeyValue> keyValues) { public static Map<String, Object> toMap(List<KeyValue> keyValues) {
if (CollectionUtils.isEmpty(keyValues)) { if (CollectionUtils.isEmpty(keyValues)) {

View File

@ -7,6 +7,7 @@ import java.net.URL;
import java.net.URLClassLoader; import java.net.URLClassLoader;
import java.sql.Connection; import java.sql.Connection;
import java.sql.Driver; import java.sql.Driver;
import java.sql.DriverPropertyInfo;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.Map; import java.util.Map;
import java.util.Properties; import java.util.Properties;
@ -39,7 +40,7 @@ public class IDriverManager {
} }
public static Connection getConnection(String url, String user, String password, DriverConfig driver) public static Connection getConnection(String url, String user, String password, DriverConfig driver)
throws SQLException { throws SQLException {
Properties info = new Properties(); Properties info = new Properties();
if (user != null) { if (user != null) {
info.put("user", user); info.put("user", user);
@ -53,8 +54,8 @@ public class IDriverManager {
} }
public static Connection getConnection(String url, String user, String password, DriverConfig driver, public static Connection getConnection(String url, String user, String password, DriverConfig driver,
Map<String, Object> properties) Map<String, Object> properties)
throws SQLException { throws SQLException {
Properties info = new Properties(); Properties info = new Properties();
if (StringUtils.isNotEmpty(user)) { if (StringUtils.isNotEmpty(user)) {
info.put("user", user); info.put("user", user);
@ -74,7 +75,7 @@ public class IDriverManager {
} }
public static Connection getConnection(String url, Properties info, DriverConfig driver) public static Connection getConnection(String url, Properties info, DriverConfig driver)
throws SQLException { throws SQLException {
if (url == null) { if (url == null) {
throw new SQLException("The url cannot be null", "08001"); throw new SQLException("The url cannot be null", "08001");
} }
@ -84,8 +85,8 @@ public class IDriverManager {
} }
try { try {
Connection connection = driverEntry.getDriver().connect(url, info); Connection connection = driverEntry.getDriver().connect(url, info);
if(connection == null){ if (connection == null) {
throw new SQLException("driver.connect return null , No suitable driver found for url " +url ,"08001"); throw new SQLException("driver.connect return null , No suitable driver found for url " + url, "08001");
} }
return connection; return connection;
} catch (SQLException var7) { } catch (SQLException var7) {
@ -94,13 +95,31 @@ public class IDriverManager {
return con; return con;
} else { } else {
throw new SQLException("Cannot create connection (" + var7.getMessage() + ")", "08001", throw new SQLException("Cannot create connection (" + var7.getMessage() + ")", "08001",
var7); var7);
} }
} }
} }
public static DriverPropertyInfo[] getProperty(DriverConfig driver)
throws SQLException {
if (driver == null) {
return null;
}
DriverEntry driverEntry = DRIVER_ENTRY_MAP.get(driver.getJdbcDriver());
if (driverEntry == null) {
driverEntry = getJDBCDriver(driver);
}
try {
String url = driver.getUrl() == null ? "" : driver.getUrl();
return driverEntry.getDriver().getPropertyInfo(url, null);
} catch (Exception var7) {
return null;
}
}
private static Connection tryConnectionAgain(DriverEntry driverEntry, String url, private static Connection tryConnectionAgain(DriverEntry driverEntry, String url,
Properties info) throws SQLException { Properties info) throws SQLException {
if (url.contains("mysql")) { if (url.contains("mysql")) {
if (!info.containsKey("useSSL")) { if (!info.containsKey("useSSL")) {
info.put("useSSL", "false"); info.put("useSSL", "false");
@ -111,14 +130,14 @@ public class IDriverManager {
} }
private static DriverEntry getJDBCDriver(DriverConfig driver) private static DriverEntry getJDBCDriver(DriverConfig driver)
throws SQLException { throws SQLException {
synchronized (driver) { synchronized (driver) {
try { try {
if (DRIVER_ENTRY_MAP.containsKey(driver.getJdbcDriver())) { if (DRIVER_ENTRY_MAP.containsKey(driver.getJdbcDriver())) {
return DRIVER_ENTRY_MAP.get(driver.getJdbcDriver()); return DRIVER_ENTRY_MAP.get(driver.getJdbcDriver());
} }
ClassLoader cl = getClassLoader(driver); ClassLoader cl = getClassLoader(driver);
Driver d = (Driver)cl.loadClass(driver.getJdbcDriverClass()).newInstance(); Driver d = (Driver) cl.loadClass(driver.getJdbcDriverClass()).newInstance();
DriverEntry driverEntry = DriverEntry.builder().driverConfig(driver).driver(d).build(); DriverEntry driverEntry = DriverEntry.builder().driverConfig(driver).driver(d).build();
DRIVER_ENTRY_MAP.put(driver.getJdbcDriver(), driverEntry); DRIVER_ENTRY_MAP.put(driver.getJdbcDriver(), driverEntry);
return driverEntry; return driverEntry;

View File

@ -0,0 +1,21 @@
package ai.chat2db.spi.util;
import ai.chat2db.spi.config.DBConfig;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;
public class FileUtils {
public static <T> T readJsonValue(Class<?> loaderClass, String path, Class<T> clazz) {
ObjectMapper mapper = new ObjectMapper();
T value = null;
try {
value = mapper.readValue(loaderClass.getResourceAsStream(path), clazz);
// 使用obj中的数据
} catch (IOException e) {
return null;
}
return value;
}
}

View File

@ -1,11 +1,10 @@
package ai.chat2db.spi.util; package ai.chat2db.spi.util;
import java.sql.Connection; import java.sql.*;
import java.sql.ResultSet; import java.text.Collator;
import java.sql.SQLException; import java.util.*;
import java.sql.Types;
import java.util.Map;
import ai.chat2db.spi.model.KeyValue;
import com.alibaba.druid.DbType; import com.alibaba.druid.DbType;
import ai.chat2db.spi.config.DriverConfig; import ai.chat2db.spi.config.DriverConfig;
@ -14,8 +13,11 @@ import ai.chat2db.spi.model.DataSourceConnect;
import ai.chat2db.spi.model.SSHInfo; import ai.chat2db.spi.model.SSHInfo;
import ai.chat2db.spi.sql.IDriverManager; import ai.chat2db.spi.sql.IDriverManager;
import ai.chat2db.spi.ssh.SSHManager; import ai.chat2db.spi.ssh.SSHManager;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.jcraft.jsch.Session; import com.jcraft.jsch.Session;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.lang.Nullable; import org.springframework.lang.Nullable;
@ -138,11 +140,11 @@ public class JdbcUtils {
* @return * @return
*/ */
public static DataSourceConnect testConnect(String url, String host, String port, public static DataSourceConnect testConnect(String url, String host, String port,
String userName, String password, String dbType, String userName, String password, String dbType,
DriverConfig driverConfig, SSHInfo ssh, Map<String, Object> properties) { DriverConfig driverConfig, SSHInfo ssh, Map<String, Object> properties) {
DataSourceConnect dataSourceConnect = DataSourceConnect.builder() DataSourceConnect dataSourceConnect = DataSourceConnect.builder()
.success(Boolean.TRUE) .success(Boolean.TRUE)
.build(); .build();
Session session = null; Session session = null;
Connection connection = null; Connection connection = null;
// 加载驱动 // 加载驱动
@ -155,7 +157,7 @@ public class JdbcUtils {
} }
// 创建连接 // 创建连接
connection = IDriverManager.getConnection(url, userName, password, connection = IDriverManager.getConnection(url, userName, password,
driverConfig, properties); driverConfig, properties);
} catch (Exception e) { } catch (Exception e) {
log.error("connection fail:", e); log.error("connection fail:", e);
dataSourceConnect.setSuccess(Boolean.FALSE); dataSourceConnect.setSuccess(Boolean.FALSE);
@ -203,4 +205,96 @@ public class JdbcUtils {
} }
public static void setDriverDefaultProperty(DriverConfig driverConfig) {
if(driverConfig == null){
return;
}
List<KeyValue> defaultKeyValues = driverConfig.getExtendInfo();
Map<String, KeyValue> valueMap = Maps.newHashMap();
if (!CollectionUtils.isEmpty(defaultKeyValues)) {
for (KeyValue keyValue : defaultKeyValues) {
if (keyValue == null || StringUtils.isBlank(keyValue.getKey())) {
continue;
}
valueMap.put(keyValue.getKey(), keyValue);
}
}
try {
DriverPropertyInfo[] propertyInfos = IDriverManager.getProperty(driverConfig);
if (propertyInfos == null) {
return;
}
for (int i = 0; i < propertyInfos.length; i++) {
DriverPropertyInfo propertyInfo = propertyInfos[i];
if (propertyInfo == null) {
continue;
}
KeyValue keyValue = valueMap.get(propertyInfo.name);
if (keyValue != null) {
String[] choices = propertyInfo.choices;
if (CollectionUtils.isEmpty(keyValue.getChoices()) && choices != null && choices.length > 0) {
keyValue.setChoices(Lists.newArrayList(choices));
}
} else {
keyValue = new KeyValue();
keyValue.setKey(propertyInfo.name);
keyValue.setValue(propertyInfo.value);
keyValue.setRequired(propertyInfo.required);
String[] choices = propertyInfo.choices;
if (choices != null && choices.length > 0) {
keyValue.setChoices(Lists.newArrayList(choices));
}
valueMap.put(keyValue.getKey(), keyValue);
}
}
if (!valueMap.isEmpty()) {
Comparator comparator = Collator.getInstance(Locale.ENGLISH);
List<KeyValue> result = new ArrayList<>(valueMap.values());
Collections.sort(result, (o1, o2) -> comparator.compare(o1.getKey(), o2.getKey()));
driverConfig.setExtendInfo(result);
}
} catch (SQLException e) {
log.error("get property error:", e);
}
}
public static void removePropertySameAsDefault(DriverConfig driverConfig) {
if(driverConfig == null){
return;
}
List<KeyValue> customValue = driverConfig.getExtendInfo();
if (CollectionUtils.isEmpty(customValue)) {
return ;
}
Map<String, String> map = Maps.newHashMap();
List<KeyValue> result = new ArrayList<>();
try {
DriverPropertyInfo[] propertyInfos = IDriverManager.getProperty(driverConfig);
if (propertyInfos == null) {
return ;
}
for (int i = 0; i < propertyInfos.length; i++) {
DriverPropertyInfo propertyInfo = propertyInfos[i];
if (propertyInfo == null) {
continue;
}
map.put(propertyInfo.name, propertyInfo.value);
}
for (KeyValue keyValue : customValue) {
if (keyValue == null || StringUtils.isBlank(keyValue.getKey())) {
continue;
}
String value = map.get(keyValue.getKey());
if (!StringUtils.equals(value, keyValue.getValue())) {
result.add(keyValue);
}
}
Comparator comparator = Collator.getInstance(Locale.ENGLISH);
Collections.sort(result, (o1, o2) -> comparator.compare(o1.getKey(), o2.getKey()));
driverConfig.setExtendInfo(result);
} catch (SQLException e) {
}
}
} }