Support for custom drivers

This commit is contained in:
jipengfei-jpf
2023-06-22 20:30:26 +08:00
parent e67d3dae54
commit a25fae6cfc
112 changed files with 4399 additions and 279 deletions

View File

@ -30,9 +30,18 @@
<groupId>ai.chat2db</groupId>
<artifactId>chat2db-server-tools-common</artifactId>
</dependency>
<!-- <dependency>-->
<!-- <groupId>ai.chat2db</groupId>-->
<!-- <artifactId>chat2db-server-domain-support</artifactId>-->
<!-- </dependency>-->
<dependency>
<groupId>ai.chat2db</groupId>
<artifactId>chat2db-server-domain-support</artifactId>
<artifactId>chat2db-spi</artifactId>
</dependency>
<dependency>
<groupId>ai.chat2db</groupId>
<artifactId>chat2b-mysql</artifactId>
<version>${revision}</version>
</dependency>
</dependencies>
</project>

View File

@ -148,12 +148,12 @@ public abstract class DataSourceConverter {
@Mapping(target = "password", expression = "java(decryptString(dataSourceDO))")
@Mapping(target = "ssh",
expression = "java(com.alibaba.fastjson2.JSON.parseObject(dataSourceDO.getSsh(),ai.chat2db.server"
+ ".domain.support.model.SSHInfo.class))")
expression = "java(com.alibaba.fastjson2.JSON.parseObject(dataSourceDO.getSsh(),ai.chat2db.spi"
+ ".model.SSHInfo.class))")
@Mapping(target = "ssl",
expression =
"java(com.alibaba.fastjson2.JSON.parseObject(dataSourceDO.getSsl(),ai.chat2db.server.domain"
+ ".support.model.SSLInfo"
"java(com.alibaba.fastjson2.JSON.parseObject(dataSourceDO.getSsl(),ai.chat2db.spi"
+ ".model.SSLInfo"
+ ".class))")
@Mapping(target = "extendInfo",
expression = "java(com.alibaba.fastjson2.JSON.parseArray(dataSourceDO.getExtendInfo(),KeyValue.class))")

View File

@ -3,7 +3,8 @@ package ai.chat2db.server.domain.core.impl;
import ai.chat2db.server.domain.api.param.ConsoleConnectParam;
import ai.chat2db.server.domain.api.service.ConsoleService;
import ai.chat2db.server.domain.api.param.ConsoleCloseParam;
import ai.chat2db.server.domain.support.sql.SQLExecutor;
import ai.chat2db.spi.sql.Chat2DBContext;
import ai.chat2db.spi.sql.SQLExecutor;
import ai.chat2db.server.tools.base.wrapper.result.ActionResult;
import org.springframework.stereotype.Service;
@ -17,7 +18,7 @@ import org.springframework.stereotype.Service;
public class ConsoleServiceImpl implements ConsoleService {
@Override
public ActionResult createConsole(ConsoleConnectParam param) {
SQLExecutor.getInstance().connectDatabase(param.getDatabaseName());
Chat2DBContext.getDBManage().connectDatabase(param.getDatabaseName());
return ActionResult.isSuccess();
}

View File

@ -16,19 +16,19 @@ import ai.chat2db.server.domain.api.service.DataSourceService;
import ai.chat2db.server.domain.core.converter.DataSourceConverter;
import ai.chat2db.server.domain.repository.entity.DataSourceDO;
import ai.chat2db.server.domain.repository.mapper.DataSourceMapper;
import ai.chat2db.server.domain.support.enums.DbTypeEnum;
import ai.chat2db.server.domain.support.model.DataSourceConnect;
import ai.chat2db.server.domain.support.model.Database;
import ai.chat2db.server.domain.support.model.KeyValue;
import ai.chat2db.server.domain.support.sql.DbhubContext;
import ai.chat2db.server.domain.support.sql.SQLExecutor;
import ai.chat2db.server.domain.support.util.JdbcUtils;
import ai.chat2db.spi.config.DriverConfig;
import ai.chat2db.spi.model.DataSourceConnect;
import ai.chat2db.spi.model.Database;
import ai.chat2db.spi.model.KeyValue;
import ai.chat2db.server.tools.base.wrapper.result.ActionResult;
import ai.chat2db.server.tools.base.wrapper.result.DataResult;
import ai.chat2db.server.tools.base.wrapper.result.ListResult;
import ai.chat2db.server.tools.base.wrapper.result.PageResult;
import ai.chat2db.server.tools.common.util.EasyCollectionUtils;
import ai.chat2db.spi.sql.Chat2DBContext;
import ai.chat2db.spi.sql.SQLExecutor;
import ai.chat2db.spi.util.JdbcUtils;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@ -117,10 +117,15 @@ public class DataSourceServiceImpl implements DataSourceService {
public ActionResult preConnect(DataSourcePreConnectParam param) {
DataSourceTestParam testParam
= dataSourceConverter.param2param(param);
DriverConfig driverConfig = new DriverConfig();
driverConfig.setJdbcDriver(param.getDriver());
driverConfig.setJdbcDriverClass(param.getDriver());//todo
DataSourceConnect dataSourceConnect = JdbcUtils.testConnect(testParam.getUrl(), testParam.getHost(),
testParam.getPort(),
testParam.getUsername(), testParam.getPassword(), DbTypeEnum.getByName(testParam.getDbType()),
param.getJdbc(), param.getSsh(), KeyValue.toMap(param.getExtendInfo()));
testParam.getUsername(), testParam.getPassword(),testParam.getDbType(),
driverConfig, param.getSsh(), KeyValue.toMap(param.getExtendInfo()));
if (BooleanUtils.isNotTrue(dataSourceConnect.getSuccess())) {
return ActionResult.fail(dataSourceConnect.getMessage(), dataSourceConnect.getDescription());
}
@ -131,7 +136,7 @@ public class DataSourceServiceImpl implements DataSourceService {
public ListResult<Database> connect(Long id) {
DatabaseQueryAllParam queryAllParam = new DatabaseQueryAllParam();
queryAllParam.setDataSourceId(id);
List<String> databases = DbhubContext.getMetaSchema().databases();
List<String> databases = Chat2DBContext.getMetaData().databases();
return ListResult.of(EasyCollectionUtils.toList(databases, name -> Database.builder().name(name).build()));
}

View File

@ -5,15 +5,15 @@ import java.util.List;
import ai.chat2db.server.domain.api.param.DatabaseOperationParam;
import ai.chat2db.server.domain.api.param.SchemaOperationParam;
import ai.chat2db.server.domain.api.service.DatabaseService;
import ai.chat2db.server.domain.support.model.Database;
import ai.chat2db.server.domain.support.model.Schema;
import ai.chat2db.spi.model.Database;
import ai.chat2db.spi.model.Schema;
import ai.chat2db.server.domain.api.param.DatabaseQueryAllParam;
import ai.chat2db.server.domain.api.param.SchemaQueryParam;
import ai.chat2db.server.domain.support.sql.DbhubContext;
import ai.chat2db.server.tools.base.wrapper.result.ActionResult;
import ai.chat2db.server.tools.base.wrapper.result.ListResult;
import ai.chat2db.server.tools.common.util.EasyCollectionUtils;
import ai.chat2db.spi.sql.Chat2DBContext;
import org.springframework.stereotype.Service;
/**
@ -26,49 +26,49 @@ public class DatabaseServiceImpl implements DatabaseService {
@Override
public ListResult<Database> queryAll(DatabaseQueryAllParam param) {
List<String> databases = DbhubContext.getMetaSchema().databases();
List<String> databases = Chat2DBContext.getMetaData().databases();
return ListResult.of(EasyCollectionUtils.toList(databases, name -> Database.builder().name(name).build()));
}
@Override
public ListResult<Schema> querySchema(SchemaQueryParam param) {
List<String> databases = DbhubContext.getMetaSchema().schemas(param.getDataBaseName());
List<String> databases = Chat2DBContext.getMetaData().schemas(param.getDataBaseName());
return ListResult.of(EasyCollectionUtils.toList(databases, name -> Schema.builder().name(name).build()));
}
@Override
public ActionResult deleteDatabase(DatabaseOperationParam param) {
DbhubContext.getMetaSchema().dropDatabase(param.getDatabaseName());
Chat2DBContext.getDBManage().dropDatabase(param.getDatabaseName());
return ActionResult.isSuccess();
}
@Override
public ActionResult createDatabase(DatabaseOperationParam param) {
DbhubContext.getMetaSchema().createDatabase(param.getDatabaseName());
Chat2DBContext.getDBManage().createDatabase(param.getDatabaseName());
return ActionResult.isSuccess();
}
@Override
public ActionResult modifyDatabase(DatabaseOperationParam param) {
DbhubContext.getMetaSchema().modifyDatabase(param.getDatabaseName(),param.getNewDatabaseName());
Chat2DBContext.getDBManage().modifyDatabase(param.getDatabaseName(),param.getNewDatabaseName());
return ActionResult.isSuccess();
}
@Override
public ActionResult deleteSchema(SchemaOperationParam param) {
DbhubContext.getMetaSchema().dropSchema(param.getDatabaseName(),param.getSchemaName());
Chat2DBContext.getDBManage().dropSchema(param.getDatabaseName(),param.getSchemaName());
return ActionResult.isSuccess();
}
@Override
public ActionResult createSchema(SchemaOperationParam param) {
DbhubContext.getMetaSchema().createSchema(param.getDatabaseName(),param.getSchemaName());
Chat2DBContext.getDBManage().createSchema(param.getDatabaseName(),param.getSchemaName());
return ActionResult.isSuccess();
}
@Override
public ActionResult modifySchema(SchemaOperationParam param) {
DbhubContext.getMetaSchema().modifySchema(param.getDatabaseName(),param.getSchemaName(),
Chat2DBContext.getDBManage().modifySchema(param.getDatabaseName(),param.getSchemaName(),
param.getNewSchemaName());
return ActionResult.isSuccess();
}

View File

@ -4,17 +4,17 @@ import ai.chat2db.server.domain.api.param.DlCountParam;
import ai.chat2db.server.domain.api.param.DlExecuteParam;
import ai.chat2db.server.domain.api.param.SqlAnalyseParam;
import ai.chat2db.server.domain.api.service.DlTemplateService;
import ai.chat2db.server.domain.support.enums.SqlTypeEnum;
import ai.chat2db.server.domain.support.model.ExecuteResult;
import ai.chat2db.server.domain.support.sql.DbhubContext;
import ai.chat2db.server.domain.support.sql.SQLExecutor;
import ai.chat2db.server.domain.support.util.JdbcUtils;
import ai.chat2db.server.tools.base.constant.EasyToolsConstant;
import ai.chat2db.server.tools.base.excption.BusinessException;
import ai.chat2db.server.tools.base.excption.DatasourceErrorEnum;
import ai.chat2db.server.tools.base.wrapper.result.DataResult;
import ai.chat2db.server.tools.base.wrapper.result.ListResult;
import ai.chat2db.server.tools.common.util.EasyCollectionUtils;
import ai.chat2db.spi.enums.SqlTypeEnum;
import ai.chat2db.spi.model.ExecuteResult;
import ai.chat2db.spi.sql.Chat2DBContext;
import ai.chat2db.spi.sql.SQLExecutor;
import ai.chat2db.spi.util.JdbcUtils;
import com.alibaba.druid.DbType;
import com.alibaba.druid.sql.PagerUtils;
import com.alibaba.druid.sql.SQLUtils;
@ -52,7 +52,7 @@ public class DlTemplateServiceImpl implements DlTemplateService {
sqlAnalyseParam.setDataSourceId(param.getDataSourceId());
sqlAnalyseParam.setSql(param.getSql());
DbType dbType =
JdbcUtils.parse2DruidDbType(DbhubContext.getConnectInfo().getDbType());
JdbcUtils.parse2DruidDbType(Chat2DBContext.getConnectInfo().getDbType());
List<String> sqlList = SQLParserUtils.splitAndRemoveComment(param.getSql(), dbType);
if (CollectionUtils.isEmpty(sqlList)) {
throw new BusinessException(DatasourceErrorEnum.SQL_ANALYSIS_ERROR);
@ -112,7 +112,7 @@ public class DlTemplateServiceImpl implements DlTemplateService {
return DataResult.of(0L);
}
DbType dbType =
JdbcUtils.parse2DruidDbType(DbhubContext.getConnectInfo().getDbType());
JdbcUtils.parse2DruidDbType(Chat2DBContext.getConnectInfo().getDbType());
String sql = param.getSql();
// 解析sql分页
SQLStatement sqlStatement = SQLUtils.parseSingleStatement(sql, dbType);

View File

@ -3,25 +3,25 @@ package ai.chat2db.server.domain.core.impl;
import java.util.List;
import ai.chat2db.server.domain.api.service.TableService;
import ai.chat2db.server.domain.support.dialect.MetaSchema;
import ai.chat2db.server.domain.support.enums.DbTypeEnum;
import ai.chat2db.server.domain.support.model.Sql;
import ai.chat2db.server.domain.support.model.Table;
import ai.chat2db.server.domain.support.model.TableColumn;
import ai.chat2db.server.domain.support.model.TableIndex;
import ai.chat2db.spi.DBManage;
import ai.chat2db.spi.MetaData;
import ai.chat2db.spi.model.Sql;
import ai.chat2db.spi.model.Table;
import ai.chat2db.spi.model.TableColumn;
import ai.chat2db.spi.model.TableIndex;
import ai.chat2db.server.domain.api.param.DropParam;
import ai.chat2db.server.domain.api.param.ShowCreateTableParam;
import ai.chat2db.server.domain.api.param.TablePageQueryParam;
import ai.chat2db.server.domain.api.param.TableQueryParam;
import ai.chat2db.server.domain.api.param.TableSelector;
import ai.chat2db.server.domain.support.sql.DbhubContext;
import ai.chat2db.server.domain.support.util.SqlUtils;
import ai.chat2db.server.tools.base.wrapper.result.ActionResult;
import ai.chat2db.server.tools.base.wrapper.result.DataResult;
import ai.chat2db.server.tools.base.wrapper.result.ListResult;
import ai.chat2db.server.tools.base.wrapper.result.PageResult;
import ai.chat2db.server.tools.common.util.EasyEnumUtils;
import ai.chat2db.spi.sql.Chat2DBContext;
import ai.chat2db.spi.util.SqlUtils;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.stereotype.Service;
@ -35,40 +35,40 @@ public class TableServiceImpl implements TableService {
@Override
public DataResult<String> showCreateTable(ShowCreateTableParam param) {
MetaSchema metaSchema = DbhubContext.getConnectInfo().getDbType().metaSchema();
MetaData metaSchema = Chat2DBContext.getMetaData();
String ddl = metaSchema.tableDDL(param.getDatabaseName(), param.getSchemaName(), param.getTableName());
return DataResult.of(ddl);
}
@Override
public ActionResult drop(DropParam param) {
MetaSchema metaSchema = DbhubContext.getConnectInfo().getDbType().metaSchema();
DBManage metaSchema = Chat2DBContext.getDBManage();
metaSchema.dropTable(param.getDatabaseName(), param.getTableSchema(), param.getTableName());
return ActionResult.isSuccess();
}
@Override
public DataResult<String> createTableExample(String dbType) {
DbTypeEnum dbTypeEnum = EasyEnumUtils.getEnum(DbTypeEnum.class, dbType);
return DataResult.of(dbTypeEnum.example().getCreateTable());
String sql = Chat2DBContext.getDBConfig().getSimpleCreateTable();
return DataResult.of(sql);
}
@Override
public DataResult<String> alterTableExample(String dbType) {
DbTypeEnum dbTypeEnum = EasyEnumUtils.getEnum(DbTypeEnum.class, dbType);
return DataResult.of(dbTypeEnum.example().getAlterTable());
String sql = Chat2DBContext.getDBConfig().getSimpleAlterTable();
return DataResult.of(sql);
}
@Override
public DataResult<Table> query(TableQueryParam param, TableSelector selector) {
MetaSchema metaSchema = DbhubContext.getConnectInfo().getDbType().metaSchema();
MetaData metaSchema = Chat2DBContext.getMetaData();
List<Table> tables = metaSchema.tables(param.getDatabaseName(), param.getSchemaName(), param.getTableName());
if (!CollectionUtils.isEmpty(tables)) {
Table table = tables.get(0);
table.setIndexList(
metaSchema.indexes(param.getDatabaseName(), param.getSchemaName(), param.getTableName()));
metaSchema.indexes(param.getDatabaseName(), param.getSchemaName(), param.getTableName()));
table.setColumnList(
metaSchema.columns(param.getDatabaseName(), param.getSchemaName(), param.getTableName()));
metaSchema.columns(param.getDatabaseName(), param.getSchemaName(), param.getTableName()));
return DataResult.of(table);
}
return DataResult.of(null);
@ -81,7 +81,7 @@ public class TableServiceImpl implements TableService {
@Override
public PageResult<Table> pageQuery(TablePageQueryParam param, TableSelector selector) {
MetaSchema metaSchema = DbhubContext.getMetaSchema();
MetaData metaSchema = Chat2DBContext.getMetaData();
List<Table> list = metaSchema.tables(param.getDatabaseName(), param.getSchemaName(), param.getTableName());
if (CollectionUtils.isEmpty(list)) {
return PageResult.of(list, 0L, param);
@ -91,13 +91,13 @@ public class TableServiceImpl implements TableService {
@Override
public List<TableColumn> queryColumns(TableQueryParam param) {
MetaSchema metaSchema = DbhubContext.getMetaSchema();
return metaSchema.columns(param.getDatabaseName(), param.getSchemaName(), param.getTableName(),null);
MetaData metaSchema = Chat2DBContext.getMetaData();
return metaSchema.columns(param.getDatabaseName(), param.getSchemaName(), param.getTableName(), null);
}
@Override
public List<TableIndex> queryIndexes(TableQueryParam param) {
MetaSchema metaSchema = DbhubContext.getMetaSchema();
MetaData metaSchema = Chat2DBContext.getMetaData();
return metaSchema.indexes(param.getDatabaseName(), param.getSchemaName(), param.getTableName());
}