mirror of
https://github.com/CodePhiliaX/Chat2DB.git
synced 2025-07-31 11:42:41 +08:00
Merge remote-tracking branch 'origin/team' into team
This commit is contained in:
@ -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();
|
||||
}
|
||||
}
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -25,3 +25,4 @@ sqlResult.rowNumber=行号
|
||||
sqlResult.success=执行成功
|
||||
|
||||
user.canNotOperateSystemAccount=不能操作系统账号
|
||||
execute.exportCsv=更多数据请点击导出csv
|
||||
|
@ -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();
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除我的保存
|
||||
*
|
||||
|
@ -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;
|
||||
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
Reference in New Issue
Block a user