Merge remote-tracking branch 'origin/team' into team

This commit is contained in:
JiaJu Zhuang
2023-08-23 15:10:12 +08:00
68 changed files with 10818 additions and 494 deletions

View File

@ -0,0 +1,19 @@
package ai.chat2db.server.start.config.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.zalando.logbook.BodyFilter;
/**
* log config
*
* @author Jiaju Zhuang
*/
@Configuration
public class WebLogConfiguration {
@Bean
public BodyFilter bodyFilter() {
return BodyFilter.none();
}
}

View File

@ -27,4 +27,5 @@ connection.driver.load.error=Failed to load driver class, please check the drive
sqlResult.rowNumber=Row Number
sqlResult.success=Execution successful
user.canNotOperateSystemAccount=System accounts cannot be operated
user.canNotOperateSystemAccount=System accounts cannot be operated
execute.exportCsv=For more data, please click on Export CSV

View File

@ -25,4 +25,5 @@ connection.driver.load.error=Failed to load driver class, please check the drive
sqlResult.rowNumber=Row Number
sqlResult.success=Execution successful
user.canNotOperateSystemAccount=System accounts cannot be operated
user.canNotOperateSystemAccount=System accounts cannot be operated
execute.exportCsv=For more data, please click on Export CSV

View File

@ -25,3 +25,4 @@ sqlResult.rowNumber=行号
sqlResult.success=执行成功
user.canNotOperateSystemAccount=不能操作系统账号
execute.exportCsv=更多数据请点击导出csv

View File

@ -12,11 +12,12 @@ import ai.chat2db.server.tools.base.wrapper.result.DataResult;
import ai.chat2db.server.tools.base.wrapper.result.PageResult;
import ai.chat2db.server.tools.base.wrapper.result.web.WebPageResult;
import ai.chat2db.server.web.api.controller.operation.saved.converter.OperationWebConverter;
import ai.chat2db.server.web.api.controller.operation.saved.request.BatchTabCloseRequest;
import ai.chat2db.server.web.api.controller.operation.saved.request.OperationCreateRequest;
import ai.chat2db.server.web.api.controller.operation.saved.request.OperationQueryRequest;
import ai.chat2db.server.web.api.controller.operation.saved.request.OperationUpdateRequest;
import ai.chat2db.server.web.api.controller.operation.saved.vo.OperationVO;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
@ -95,6 +96,26 @@ public class OperationSavedController {
return operationService.update(param);
}
/**
* 批量关闭标签
*
* @param request
* @return
*/
@RequestMapping(value = "/batch_tab_close", method = {RequestMethod.POST, RequestMethod.PUT})
public ActionResult batchTabClose(@RequestBody BatchTabCloseRequest request) {
if (CollectionUtils.isEmpty(request.getIdList())) {
return ActionResult.isSuccess();
}
request.getIdList().forEach(id -> {
OperationUpdateParam param = new OperationUpdateParam();
param.setId(id);
param.setTabOpened("n");
operationService.update(param);
});
return ActionResult.isSuccess();
}
/**
* 删除我的保存
*

View File

@ -0,0 +1,21 @@
package ai.chat2db.server.web.api.controller.operation.saved.request;
import java.util.List;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
/**
* close tab
* @author Jiaju Zhuang
*/
@Data
public class BatchTabCloseRequest {
/**
* 主键
*/
@NotNull
private List<Long> idList;
}

View File

@ -107,7 +107,7 @@ public class RdbDmlExportController {
} else {
doExportInsert(sql, response, fileName, dbType, tableName);
}
String SS= ConfigUtils.APP_PATH;
String SS = ConfigUtils.APP_PATH;
}
private void doExportCsv(String sql, HttpServletResponse response, String fileName)
@ -130,7 +130,7 @@ public class RdbDmlExportController {
List<List<String>> writeDataList = Lists.newArrayList();
writeDataList.add(dataList);
excelWrapper.getExcelWriter().write(writeDataList, excelWrapper.getWriteSheet());
});
}, false);
} finally {
if (excelWrapper.getExcelWriter() != null) {
excelWrapper.getExcelWriter().finish();
@ -161,7 +161,7 @@ public class RdbDmlExportController {
sqlInsertStatement.setValues(valuesClause);
printWriter.println(SQLUtils.toSQLString(sqlInsertStatement, dbType, INSERT_FORMAT_OPTION) + ";");
});
}, false);
}
}

View File

@ -112,6 +112,11 @@ public class SQLExecutor {
public void executeSql(Connection connection, String sql, Consumer<List<Header>> headerConsumer,
Consumer<List<String>> rowConsumer) {
executeSql(connection, sql, headerConsumer, rowConsumer, true);
}
public void executeSql(Connection connection, String sql, Consumer<List<Header>> headerConsumer,
Consumer<List<String>> rowConsumer, boolean limitSize) {
Assert.notNull(sql, "SQL must not be null");
log.info("execute:{}", sql);
try (Statement stmt = connection.createStatement();) {
@ -139,7 +144,7 @@ public class SQLExecutor {
while (rs.next()) {
List<String> row = Lists.newArrayListWithExpectedSize(col);
for (int i = 1; i <= col; i++) {
row.add(ai.chat2db.spi.util.JdbcUtils.getResultSetValue(rs, i));
row.add(ai.chat2db.spi.util.JdbcUtils.getResultSetValue(rs, i, limitSize));
}
rowConsumer.accept(row);
}
@ -160,6 +165,17 @@ public class SQLExecutor {
* @throws SQLException
*/
public ExecuteResult execute(final String sql, Connection connection) throws SQLException {
return execute(sql, connection, true);
}
/**
* 执行sql
*
* @param sql
* @return
* @throws SQLException
*/
public ExecuteResult execute(final String sql, Connection connection, boolean limitSize) throws SQLException {
Assert.notNull(sql, "SQL must not be null");
log.info("execute:{}", sql);
@ -199,7 +215,7 @@ public class SQLExecutor {
List<String> row = Lists.newArrayListWithExpectedSize(col);
dataList.add(row);
for (int i = 1; i <= col; i++) {
row.add(ai.chat2db.spi.util.JdbcUtils.getResultSetValue(rs, i));
row.add(ai.chat2db.spi.util.JdbcUtils.getResultSetValue(rs, i, limitSize));
}
}
executeResult.setDuration(timeInterval.interval());
@ -224,7 +240,7 @@ public class SQLExecutor {
* @throws SQLException
*/
public ExecuteResult execute(Connection connection, String sql) throws SQLException {
return execute(sql, connection);
return execute(sql, connection, true);
}
/**

View File

@ -1,27 +1,23 @@
package ai.chat2db.spi.util;
import java.math.BigDecimal;
import java.sql.Blob;
import java.sql.Clob;
import java.sql.Connection;
import java.sql.Date;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.sql.Types;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Map;
import java.util.Objects;
import com.alibaba.druid.DbType;
import ai.chat2db.server.tools.common.util.I18nUtils;
import ai.chat2db.spi.config.DriverConfig;
import ai.chat2db.spi.enums.DataTypeEnum;
import ai.chat2db.spi.model.DataSourceConnect;
import ai.chat2db.spi.model.SSHInfo;
import ai.chat2db.spi.sql.IDriverManager;
import ai.chat2db.spi.ssh.SSHManager;
import cn.hutool.core.io.unit.DataSizeUtil;
import com.jcraft.jsch.Session;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
@ -34,6 +30,8 @@ import org.apache.commons.lang3.StringUtils;
@Slf4j
public class JdbcUtils {
private static final long MAX_RESULT_SIZE = 256 * 1024;
/**
* 获取德鲁伊的的数据库类型
*
@ -141,59 +139,40 @@ public class JdbcUtils {
* @return
* @throws SQLException
*/
public static String getResultSetValue(ResultSet rs, int index) throws SQLException {
public static String getResultSetValue(ResultSet rs, int index, boolean limitSize) throws SQLException {
Object obj = rs.getObject(index);
if (obj == null) {
return null;
}
if (obj instanceof Blob blob) {
return rs.getString(index);
}
if (obj instanceof Clob clob) {
return clob.getSubString(1, Math.toIntExact(clob.length()));
}
if (obj instanceof Timestamp timestamp) {
return Objects.toString(timestamp);
}
String className = obj.getClass().getName();
if ("oracle.sql.TIMESTAMP".equals(className) || "oracle.sql.TIMESTAMPTZ".equals(className)) {
return Objects.toString(rs.getTimestamp(index));
}
if (className.startsWith("oracle.sql.DATE")) {
String metaDataClassName = rs.getMetaData().getColumnClassName(index);
if ("java.sql.Timestamp".equals(metaDataClassName) || "oracle.sql.TIMESTAMP".equals(metaDataClassName)) {
return Objects.toString(rs.getTimestamp(index));
} else {
return Objects.toString(rs.getDate(index));
}
}
if (obj instanceof Date date) {
if ("java.sql.Timestamp".equals(rs.getMetaData().getColumnClassName(index))) {
return Objects.toString(rs.getDate(index));
}
return Objects.toString(date);
}
if (obj instanceof LocalDateTime localDateTime) {
return Objects.toString(localDateTime);
}
if (obj instanceof LocalDate localDate) {
return Objects.toString(localDate);
}
if (obj instanceof BigDecimal bigDecimal) {
return bigDecimal.toPlainString();
}
if (obj instanceof Double d) {
} else if (obj instanceof Double d) {
return BigDecimal.valueOf(d).toPlainString();
}
if (obj instanceof Float f) {
} else if (obj instanceof Float f) {
return BigDecimal.valueOf(f).toPlainString();
} else if (obj instanceof Clob) {
return largeString(rs, index, limitSize);
} else if (obj instanceof byte[]) {
return largeString(rs, index, limitSize);
}
if (obj instanceof Number num) {
return Objects.toString(num);
return rs.getString(index);
}
private static String largeString(ResultSet rs, int index, boolean limitSize) throws SQLException {
String result = rs.getString(index);
if (result == null) {
return null;
}
return Objects.toString(obj);
if (!limitSize) {
return result;
}
if (result.length() > MAX_RESULT_SIZE) {
return "[ " + DataSizeUtil.format(MAX_RESULT_SIZE) + " of " + DataSizeUtil.format(result.length()) + " ,"
+ I18nUtils.getMessage("execute.exportCsv") + " ] " + result.substring(0,
Math.toIntExact(MAX_RESULT_SIZE));
}
return result;
}
/**