Merge branch 'developing' of https://github.com/chat2db/Chat2DB into developing

This commit is contained in:
JiaJu Zhuang
2023-07-23 18:14:24 +08:00
20 changed files with 528 additions and 306 deletions

View File

@ -8,6 +8,15 @@ public class CacheKey {
return "schemas_datasourceId_" + dataSourceId;
}
public static String getDataBasesKey(Long dataSourceId) {
return "databases_datasourceId_" + dataSourceId;
}
public static String getSchemasKey(Long dataSourceId, String databaseName) {
return "databases_datasourceId_" + dataSourceId + "_databaseName_" + databaseName;
}
public static String getTableKey(Long dataSourceId, String databaseName, String schemaName) {
StringBuffer stringBuffer = new StringBuffer("tables_dataSourceId" + dataSourceId);
if (!StringUtils.isEmpty(databaseName)) {

View File

@ -18,7 +18,7 @@ import org.springframework.util.StringUtils;
public class CacheManage {
private static final String PATH = System.getProperty("user.home") + File.separator + ".chat2db"
+ File.separator
+ "cache" + File.separator + "chat2db-ehcache-data";
+ "cache" + File.separator + "chat2db-ehcache-data_" +System.getProperty("spring.profiles.active");
private static final String CACHE = "meta_cache";
private static CacheManager cacheManager;
@ -51,7 +51,6 @@ public class CacheManage {
return null;
}
public static <T> T get(String key, Class<T> clazz, Function<Object, Boolean> refresh,
Function<Object, T> function) {
T t;
@ -68,7 +67,6 @@ public class CacheManage {
return t;
}
public static <T> List<T> getList(String key, Class<T> clazz, Function<Object, Boolean> refresh,
Function<Object, List<T>> function) {
List<T> t;
@ -94,5 +92,4 @@ public class CacheManage {
cacheManager.close();
}
}

View File

@ -1,5 +1,7 @@
package ai.chat2db.server.domain.core.impl;
import java.sql.Connection;
import java.sql.SQLException;
import java.time.LocalDateTime;
import java.util.List;
@ -13,6 +15,7 @@ import ai.chat2db.server.domain.api.param.DataSourceTestParam;
import ai.chat2db.server.domain.api.param.DataSourceUpdateParam;
import ai.chat2db.server.domain.api.param.DatabaseQueryAllParam;
import ai.chat2db.server.domain.api.service.DataSourceService;
import ai.chat2db.server.domain.api.service.DatabaseService;
import ai.chat2db.server.domain.core.converter.DataSourceConverter;
import ai.chat2db.server.domain.repository.entity.DataSourceDO;
import ai.chat2db.server.domain.repository.mapper.DataSourceMapper;
@ -25,11 +28,13 @@ import ai.chat2db.spi.model.DataSourceConnect;
import ai.chat2db.spi.model.Database;
import ai.chat2db.spi.model.KeyValue;
import ai.chat2db.spi.sql.Chat2DBContext;
import ai.chat2db.spi.sql.IDriverManager;
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;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.BooleanUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
@ -40,6 +45,7 @@ import org.springframework.stereotype.Service;
* @version DataSourceCoreServiceImpl.java, v 0.1 2022年09月23日 15:51 moji Exp $
* @date 2022/09/23
*/
@Slf4j
@Service
public class DataSourceServiceImpl implements DataSourceService {
@ -49,15 +55,37 @@ public class DataSourceServiceImpl implements DataSourceService {
@Autowired
private DataSourceConverter dataSourceConverter;
@Autowired
private DatabaseService databaseService;
@Override
public DataResult<Long> create(DataSourceCreateParam param) {
DataSourceDO dataSourceDO = dataSourceConverter.param2do(param);
dataSourceDO.setGmtCreate(LocalDateTime.now());
dataSourceDO.setGmtModified(LocalDateTime.now());
dataSourceMapper.insert(dataSourceDO);
preWarmingData(dataSourceDO.getId());
return DataResult.of(dataSourceDO.getId());
}
private void preWarmingData(Long dataSourceId) {
DataResult<DataSource> dataResult = queryById(dataSourceId);
if (dataResult.success() && dataResult.getData() != null) {
DataSource dataSource = dataResult.getData();
try (Connection connection = IDriverManager.getConnection(dataSource.getUrl(), dataSource.getUserName(),
dataSource.getPassword(), dataSource.getDriverConfig(), dataSource.getExtendMap())) {
DatabaseQueryAllParam databaseQueryAllParam = new DatabaseQueryAllParam();
databaseQueryAllParam.setDataSourceId(dataSourceId);
databaseQueryAllParam.setConnection(connection);
databaseQueryAllParam.setDbType(dataSource.getType());
databaseQueryAllParam.setRefresh(true);
databaseService.queryAll(databaseQueryAllParam);
} catch (SQLException e) {
log.error("preWarmingData error", e);
}
}
}
@Override
public ActionResult update(DataSourceUpdateParam param) {
DataSourceDO dataSourceDO = dataSourceConverter.param2do(param);

View File

@ -24,7 +24,9 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import static ai.chat2db.server.domain.core.cache.CacheKey.getDataBasesKey;
import static ai.chat2db.server.domain.core.cache.CacheKey.getDataSourceKey;
import static ai.chat2db.server.domain.core.cache.CacheKey.getSchemasKey;
/**
* @author moji
@ -37,23 +39,37 @@ public class DatabaseServiceImpl implements DatabaseService {
@Override
public ListResult<Database> queryAll(DatabaseQueryAllParam param) {
return ListResult.of(Chat2DBContext.getMetaData().databases(Chat2DBContext.getConnection()));
List<Database> databases = CacheManage.getList(getDataBasesKey(param.getDataSourceId()), Database.class,
(key) -> param.isRefresh(), (key) -> {
Connection connection = param.getConnection() == null ? Chat2DBContext.getConnection()
: param.getConnection();
MetaData metaData = Chat2DBContext.getMetaData(param.getDbType());
return metaData.databases(connection);
});
return ListResult.of(databases);
}
@Override
public ListResult<Schema> querySchema(SchemaQueryParam param) {
return ListResult.of(
Chat2DBContext.getMetaData().schemas(Chat2DBContext.getConnection(), param.getDataBaseName()));
List<Schema> schemas = CacheManage.getList(getSchemasKey(param.getDataSourceId(), param.getDataBaseName()),
Schema.class,
(key) -> param.isRefresh(), (key) -> {
Connection connection = param.getConnection() == null ? Chat2DBContext.getConnection()
: param.getConnection();
MetaData metaData = Chat2DBContext.getMetaData();
return metaData.schemas(connection, param.getDataBaseName());
});
return ListResult.of(schemas);
}
@Override
public DataResult<MetaSchema> queryDatabaseSchema(MetaDataQueryParam param) {
MetaSchema metaSchema = new MetaSchema();
MetaData metaData = Chat2DBContext.getMetaData();
Connection connection = Chat2DBContext.getConnection();
MetaSchema ms = CacheManage.get(getDataSourceKey(param.getDataSourceId()), MetaSchema.class,
(key) -> param.isRefresh(), (key) -> {
List<Database> databases = metaData.databases(Chat2DBContext.getConnection());
Connection connection = Chat2DBContext.getConnection();
List<Database> databases = metaData.databases(connection);
if (!CollectionUtils.isEmpty(databases)) {
CountDownLatch countDownLatch = ThreadUtil.newCountDownLatch(databases.size());
for (Database database : databases) {
@ -74,7 +90,7 @@ public class DatabaseServiceImpl implements DatabaseService {
metaSchema.setDatabases(databases);
} else {
List<Schema> schemas = metaData.schemas(Chat2DBContext.getConnection(), null);
List<Schema> schemas = metaData.schemas(connection, null);
metaSchema.setSchemas(schemas);
}
return metaSchema;
@ -85,37 +101,41 @@ public class DatabaseServiceImpl implements DatabaseService {
@Override
public ActionResult deleteDatabase(DatabaseOperationParam param) {
Chat2DBContext.getDBManage().dropDatabase(Chat2DBContext.getConnection(),param.getDatabaseName());
Chat2DBContext.getDBManage().dropDatabase(Chat2DBContext.getConnection(), param.getDatabaseName());
return ActionResult.isSuccess();
}
@Override
public ActionResult createDatabase(DatabaseOperationParam param) {
Chat2DBContext.getDBManage().createDatabase(Chat2DBContext.getConnection(),param.getDatabaseName());
Chat2DBContext.getDBManage().createDatabase(Chat2DBContext.getConnection(), param.getDatabaseName());
return ActionResult.isSuccess();
}
@Override
public ActionResult modifyDatabase(DatabaseOperationParam param) {
Chat2DBContext.getDBManage().modifyDatabase(Chat2DBContext.getConnection(),param.getDatabaseName(), param.getNewDatabaseName());
Chat2DBContext.getDBManage().modifyDatabase(Chat2DBContext.getConnection(), param.getDatabaseName(),
param.getNewDatabaseName());
return ActionResult.isSuccess();
}
@Override
public ActionResult deleteSchema(SchemaOperationParam param) {
Chat2DBContext.getDBManage().dropSchema(Chat2DBContext.getConnection(),param.getDatabaseName(), param.getSchemaName());
Chat2DBContext.getDBManage().dropSchema(Chat2DBContext.getConnection(), param.getDatabaseName(),
param.getSchemaName());
return ActionResult.isSuccess();
}
@Override
public ActionResult createSchema(SchemaOperationParam param) {
Chat2DBContext.getDBManage().createSchema(Chat2DBContext.getConnection(),param.getDatabaseName(), param.getSchemaName());
Chat2DBContext.getDBManage().createSchema(Chat2DBContext.getConnection(), param.getDatabaseName(),
param.getSchemaName());
return ActionResult.isSuccess();
}
@Override
public ActionResult modifySchema(SchemaOperationParam param) {
Chat2DBContext.getDBManage().modifySchema(Chat2DBContext.getConnection(),param.getDatabaseName(), param.getSchemaName(),
Chat2DBContext.getDBManage().modifySchema(Chat2DBContext.getConnection(), param.getDatabaseName(),
param.getSchemaName(),
param.getNewSchemaName());
return ActionResult.isSuccess();
}