Skip to content

Commit 8f6f6e2

Browse files
committed
merge
2 parents 4f1dddb + 134f316 commit 8f6f6e2

15 files changed

Lines changed: 279 additions & 57 deletions

File tree

Lines changed: 59 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,64 +1,82 @@
1-
import React from 'react';
1+
import React, { useEffect, useState } from 'react';
22
import { Modal, Upload, Button, message } from 'antd';
33
import { UploadOutlined } from '@ant-design/icons';
44

5-
interface FileUploadModalProps {
5+
const uploadFileType = {
6+
ncx: {
7+
accept: '.ncx',
8+
uploadUrl: '/api/converter/ncx/upload',
9+
},
10+
dbp: {
11+
accept: '.dbp',
12+
uploadUrl: '/api/converter/dbp/upload',
13+
},
14+
};
15+
interface IImportConnectionProps {
616
open: boolean;
717
onClose: () => void;
8-
onUploaded?: (file: File) => void;
918
onConfirm?: () => void;
1019
}
1120

12-
const FileUploadModal: React.FC<FileUploadModalProps> = ({ open, onClose, onUploaded, onConfirm }) => {
13-
const beforeUpload = (file: File) => {
14-
const fileName = file.name.toLowerCase();
15-
if (fileName.includes('navicat')) {
16-
message.success('Navicat file detected');
17-
onUploaded && onUploaded(file);
18-
} else if (fileName.includes('dbeaver')) {
19-
message.success('DBeaver file detected');
20-
onUploaded && onUploaded(file);
21-
} else if (fileName.includes('datagrip')) {
22-
message.success('DataGrip file detected');
23-
onUploaded && onUploaded(file);
24-
} else {
25-
message.error('File type not recognized');
26-
return false;
21+
const ImportConnection: React.FC<IImportConnectionProps> = ({ open, onClose, onConfirm }) => {
22+
const [selectedFile, setSelectedFile] = useState<File | null>(null);
23+
const [uploading, setUploading] = useState(false);
24+
25+
useEffect(() => {
26+
if (open) {
27+
setSelectedFile(null);
2728
}
28-
return false; // Prevent auto-upload for the sake of this demo
29+
}, [open]);
30+
31+
const handleBeforeUpload = (file: File) => {
32+
setSelectedFile(file);
33+
return false; // 停止自动上传
2934
};
3035

31-
const renderSelect = () => {
32-
// 下拉框 选择Navciat、dbever、datagrip
36+
const handleConfirmUpload = async () => {
37+
if (!selectedFile) return;
38+
39+
const formData = new FormData();
40+
formData.append('file', selectedFile);
41+
42+
const fileExtension = selectedFile.name.split('.').pop() || '';
43+
console.log('fileExtension', fileExtension);
44+
45+
const { uploadUrl } = uploadFileType[fileExtension] || {};
46+
47+
try {
48+
setUploading(true);
49+
50+
const response = await fetch(uploadUrl, {
51+
method: 'POST',
52+
body: formData,
53+
});
54+
if (response.ok) {
55+
message.success(`${selectedFile.name} 导入数据源成功`);
56+
onConfirm && onConfirm();
57+
} else {
58+
message.error(`${selectedFile.name} 导入数据源是吧`);
59+
}
60+
} catch (error) {
61+
message.error(`Error: ${error}`);
62+
} finally {
63+
setUploading(false);
64+
}
3365
};
66+
3467
return (
3568
<Modal
36-
title="Upload your file"
69+
title="导入文件, .ncx(navicat) 或 .dbp(dbever)"
3770
open={open}
3871
onCancel={onClose}
39-
onOk={onConfirm}
40-
footer={[
41-
<Button key="back" onClick={onClose}>
42-
Cancel
43-
</Button>,
44-
<Button key="submit" type="primary" onClick={onConfirm}>
45-
Confirm
46-
</Button>,
47-
]}
72+
onOk={handleConfirmUpload}
73+
confirmLoading={uploading}
4874
>
49-
<Upload
50-
action="/api/converter/ncx/upload"
51-
name="file"
52-
accept=".ncx"
53-
beforeUpload={beforeUpload}
54-
onChange={(info) => {
55-
console.log(info);
56-
}}
57-
>
75+
<Upload name="file" accept=".ncx,.dbp" beforeUpload={handleBeforeUpload} maxCount={1}>
5876
<Button icon={<UploadOutlined />}>Select File</Button>
5977
</Upload>
6078
</Modal>
6179
);
6280
};
6381

64-
export default FileUploadModal;
82+
export default ImportConnection;

chat2db-client/src/pages/main/connection/index.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -308,6 +308,10 @@ function Connections(props: IProps) {
308308
onClose={() => {
309309
setIsFileUploadModalOpen(false);
310310
}}
311+
onConfirm={() => {
312+
setIsFileUploadModalOpen(false);
313+
handleEnvRefresh(ConnectionKind.Private);
314+
}}
311315
/>
312316
</>
313317
);

chat2db-client/src/service/connection.ts

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,14 @@ const remove = createRequest<{ id: number }, void>('/api/connection/datasource/:
4242

4343
const clone = createRequest<{ id: number }, void>('/api/connection/datasource/clone', { method: 'post' });
4444

45-
const getDBList = createRequest<{ dataSourceId: number, refresh?: boolean }, any>('/api/rdb/database/list', { method: 'get' });
45+
const getDBList = createRequest<{ dataSourceId: number; refresh?: boolean }, any>('/api/rdb/database/list', {
46+
method: 'get',
47+
});
4648

47-
const getSchemaList = createRequest<{ dataSourceId: number, databaseName: string; refresh?: boolean }, any>('/api/rdb/schema/list', { method: 'get' });
49+
const getSchemaList = createRequest<{ dataSourceId: number; databaseName: string; refresh?: boolean }, any>(
50+
'/api/rdb/schema/list',
51+
{ method: 'get' },
52+
);
4853

4954
export interface IDriverResponse {
5055
driverConfigList: {
@@ -77,7 +82,17 @@ const downloadDriver = createRequest<{ dbType: string }, void>('/api/jdbc/driver
7782

7883
const saveDriver = createRequest<IUploadDriver, void>('/api/jdbc/driver/save', { errorLevel: false, method: 'post' });
7984

80-
const getEnvList = createRequest<void, IConnectionEnv[]>('/api/common/environment/list_all', { errorLevel: false});
85+
const getEnvList = createRequest<void, IConnectionEnv[]>('/api/common/environment/list_all', { errorLevel: false });
86+
87+
/** 导入Navicat链接 */
88+
// const importNavicatConnection = createRequest<
89+
// {
90+
// formData: FormData;
91+
// },
92+
// void
93+
// >('/api/converter/ncx/upload', {
94+
// method: 'post',
95+
// });
8196

8297
export default {
8398
getEnvList,
@@ -95,4 +110,5 @@ export default {
95110
getDriverList,
96111
downloadDriver,
97112
saveDriver,
113+
// importNavicatConnection,
98114
};

chat2db-server/chat2db-server-domain/chat2db-server-domain-api/src/main/java/ai/chat2db/server/domain/api/model/OperationLog.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,4 +54,31 @@ public class OperationLog {
5454
* ddl内容
5555
*/
5656
private String ddl;
57+
58+
59+
60+
/**
61+
* 状态
62+
*/
63+
private String status;
64+
65+
/**
66+
* 操作行数
67+
*/
68+
private Long operationRows;
69+
70+
/**
71+
* 使用时长
72+
*/
73+
private Long useTime;
74+
75+
/**
76+
* 扩展信息
77+
*/
78+
private String extendInfo;
79+
80+
/**
81+
* schema名称
82+
*/
83+
private String schemaName;
5784
}

chat2db-server/chat2db-server-domain/chat2db-server-domain-api/src/main/java/ai/chat2db/server/domain/api/param/operation/OperationLogCreateParam.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,4 +34,30 @@ public class OperationLogCreateParam {
3434
* ddl内容
3535
*/
3636
private String ddl;
37+
38+
39+
/**
40+
* 状态
41+
*/
42+
private String status;
43+
44+
/**
45+
* 操作行数
46+
*/
47+
private Long operationRows;
48+
49+
/**
50+
* 使用时长
51+
*/
52+
private Long useTime;
53+
54+
/**
55+
* 扩展信息
56+
*/
57+
private String extendInfo;
58+
59+
/**
60+
* schema名称
61+
*/
62+
private String schemaName;
3763
}

chat2db-server/chat2db-server-domain/chat2db-server-domain-api/src/main/java/ai/chat2db/server/domain/api/param/operation/OperationLogPageQueryParam.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,19 @@ public class OperationLogPageQueryParam extends PageQueryParam {
2121
* 搜索关键词
2222
*/
2323
private String searchKey;
24+
25+
/**
26+
* 数据源id
27+
*/
28+
private Long dataSourceId;
29+
30+
/**
31+
* 数据库名称
32+
*/
33+
private String databaseName;
34+
35+
/**
36+
* schema名称
37+
*/
38+
private String schemaName;
2439
}

chat2db-server/chat2db-server-domain/chat2db-server-domain-core/src/main/java/ai/chat2db/server/domain/core/impl/DlTemplateServiceImpl.java

Lines changed: 45 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,10 @@
88
import java.util.Optional;
99

1010
import ai.chat2db.server.domain.api.param.*;
11+
import ai.chat2db.server.domain.api.param.operation.OperationLogCreateParam;
12+
import ai.chat2db.server.domain.api.service.OperationLogService;
1113
import ai.chat2db.spi.MetaData;
14+
import ai.chat2db.spi.sql.ConnectInfo;
1215
import com.alibaba.druid.DbType;
1316
import com.alibaba.druid.sql.PagerUtils;
1417
import com.alibaba.druid.sql.SQLUtils;
@@ -35,6 +38,7 @@
3538
import lombok.extern.slf4j.Slf4j;
3639
import org.apache.commons.collections4.CollectionUtils;
3740
import org.apache.commons.lang3.StringUtils;
41+
import org.springframework.beans.factory.annotation.Autowired;
3842
import org.springframework.stereotype.Service;
3943

4044
/**
@@ -46,15 +50,21 @@
4650
@Service
4751
public class DlTemplateServiceImpl implements DlTemplateService {
4852

53+
@Autowired
54+
private OperationLogService operationLogService;
55+
4956
@Override
5057
public ListResult<ExecuteResult> execute(DlExecuteParam param) {
5158
if (StringUtils.isBlank(param.getSql())) {
5259
return ListResult.empty();
5360
}
5461
// 解析sql
55-
RemoveSpecialGO(param);
56-
DbType dbType =
57-
JdbcUtils.parse2DruidDbType(Chat2DBContext.getConnectInfo().getDbType());
62+
String type = Chat2DBContext.getConnectInfo().getDbType();
63+
DbType dbType = JdbcUtils.parse2DruidDbType(type);
64+
if ("SQLSERVER".equalsIgnoreCase(type)) {
65+
RemoveSpecialGO(param);
66+
}
67+
5868
List<String> sqlList = SqlUtils.parse(param.getSql(), dbType);
5969

6070

@@ -73,6 +83,7 @@ public ListResult<ExecuteResult> execute(DlExecuteParam param) {
7383
listResult.errorCode(executeResult.getDescription());
7484
listResult.setErrorMessage(executeResult.getMessage());
7585
}
86+
addOperationLog(executeResult);
7687
}
7788
return listResult;
7889
}
@@ -90,11 +101,12 @@ public DataResult<ExecuteResult> executeUpdate(DlExecuteParam param) {
90101
connection.setAutoCommit(false);
91102
for (String originalSql : sqlList) {
92103
ExecuteResult executeResult = SQLExecutor.getInstance().executeUpdate(originalSql, connection, 1);
93-
dataResult.setData(executeResult);
104+
dataResult.setData(executeResult);
105+
addOperationLog(executeResult);
94106
}
95107
connection.commit();
96-
}catch (Exception e){
97-
log.error("executeUpdate error",e);
108+
} catch (Exception e) {
109+
log.error("executeUpdate error", e);
98110
dataResult.setSuccess(false);
99111
dataResult.setErrorCode("connection error");
100112
dataResult.setErrorMessage(e.getMessage());
@@ -107,7 +119,7 @@ private void RemoveSpecialGO(DlExecuteParam param) {
107119
if (StringUtils.isBlank(sql)) {
108120
return;
109121
}
110-
sql = sql.replaceAll("(?i)\\s*go\\s*", ";");
122+
sql = sql.replaceAll("(?mi)^[ \\t]*go[ \\t]*$", ";");
111123
param.setSql(sql);
112124
}
113125

@@ -276,6 +288,9 @@ private String buildWhere(List<Header> headerList, List<String> row, MetaData me
276288
}
277289

278290
private String getInsertSql(UpdateSelectResultParam param, List<String> row, MetaData metaSchema) {
291+
if (CollectionUtils.isEmpty(row)) {
292+
return "";
293+
}
279294
StringBuilder script = new StringBuilder();
280295
script.append("INSERT INTO ").append(metaSchema.getMetaDataName(param.getDatabaseName(), param.getSchemaName(), param.getTableName()))
281296
.append(" (");
@@ -301,6 +316,9 @@ private String getInsertSql(UpdateSelectResultParam param, List<String> row, Met
301316

302317
private String getUpdateSql(UpdateSelectResultParam param, List<String> row, List<String> odlRow, MetaData metaSchema) {
303318
StringBuilder script = new StringBuilder();
319+
if (CollectionUtils.isEmpty(row) || CollectionUtils.isEmpty(odlRow)) {
320+
return "";
321+
}
304322
script.append("UPDATE ").append(metaSchema.getMetaDataName(param.getDatabaseName(), param.getSchemaName(), param.getTableName()))
305323
.append(" set ");
306324
for (int i = 1; i < row.size(); i++) {
@@ -336,4 +354,24 @@ private ExecuteResult execute(String sql, Integer offset, Integer count) {
336354
return executeResult;
337355
}
338356

357+
private void addOperationLog(ExecuteResult executeResult) {
358+
if (executeResult == null) {
359+
return;
360+
}
361+
try {
362+
ConnectInfo connectInfo = Chat2DBContext.getConnectInfo();
363+
OperationLogCreateParam createParam = new OperationLogCreateParam();
364+
createParam.setDdl(executeResult.getSql());
365+
createParam.setStatus(executeResult.getSuccess() ? "success" : "fail");
366+
createParam.setDatabaseName(connectInfo.getDatabaseName());
367+
createParam.setDataSourceId(connectInfo.getDataSourceId());
368+
createParam.setSchemaName(connectInfo.getSchemaName());
369+
createParam.setUseTime(executeResult.getDuration());
370+
createParam.setType(connectInfo.getDbType());
371+
createParam.setOperationRows(executeResult.getUpdateCount() != null ? Long.valueOf(executeResult.getUpdateCount()):null);
372+
operationLogService.create(createParam);
373+
} catch (Exception e) {
374+
log.error("addOperationLog error:", e);
375+
}
376+
}
339377
}

chat2db-server/chat2db-server-domain/chat2db-server-domain-core/src/main/java/ai/chat2db/server/domain/core/impl/OperationLogServiceImpl.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,10 @@ public DataResult<Long> create(OperationLogCreateParam param) {
5858
public PageResult<OperationLog> queryPage(OperationLogPageQueryParam param) {
5959
EasyLambdaQueryWrapper<OperationLogDO> queryWrapper = new EasyLambdaQueryWrapper<>();
6060
queryWrapper.likeWhenPresent(OperationLogDO::getDdl, EasySqlUtils.buildLikeRightFuzzy(param.getSearchKey()))
61-
.eqWhenPresent(OperationLogDO::getUserId, param.getUserId())
61+
.eqWhenPresent(OperationLogDO::getUserId, param.getUserId())
62+
.eqWhenPresent(OperationLogDO::getDataSourceId, param.getDataSourceId())
63+
.eqWhenPresent(OperationLogDO::getDatabaseName, param.getDatabaseName())
64+
.eqWhenPresent(OperationLogDO::getSchemaName, param.getSchemaName())
6265
;
6366
Integer start = param.getPageNo();
6467
Integer offset = param.getPageSize();

0 commit comments

Comments
 (0)