fix columnType error

This commit is contained in:
SwallowGG
2024-07-11 13:56:32 +08:00
parent 3961610e50
commit 493f934a2c
23 changed files with 119 additions and 78 deletions

View File

@ -4,6 +4,7 @@ import ai.chat2db.spi.ColumnBuilder;
import ai.chat2db.spi.enums.EditStatus; import ai.chat2db.spi.enums.EditStatus;
import ai.chat2db.spi.model.ColumnType; import ai.chat2db.spi.model.ColumnType;
import ai.chat2db.spi.model.TableColumn; import ai.chat2db.spi.model.TableColumn;
import ai.chat2db.spi.util.SqlUtils;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
@ -67,7 +68,7 @@ public enum ClickHouseColumnTypeEnum implements ColumnBuilder {
} }
public static ClickHouseColumnTypeEnum getByType(String dataType) { public static ClickHouseColumnTypeEnum getByType(String dataType) {
return COLUMN_TYPE_MAP.get(dataType); return COLUMN_TYPE_MAP.get(SqlUtils.removeDigits(dataType.toUpperCase()));
} }
public static List<ColumnType> getTypes() { public static List<ColumnType> getTypes() {

View File

@ -4,6 +4,7 @@ import ai.chat2db.spi.ColumnBuilder;
import ai.chat2db.spi.enums.EditStatus; import ai.chat2db.spi.enums.EditStatus;
import ai.chat2db.spi.model.ColumnType; import ai.chat2db.spi.model.ColumnType;
import ai.chat2db.spi.model.TableColumn; import ai.chat2db.spi.model.TableColumn;
import ai.chat2db.spi.util.SqlUtils;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
@ -133,7 +134,7 @@ public enum DB2ColumnTypeEnum implements ColumnBuilder {
private ColumnType columnType; private ColumnType columnType;
public static DB2ColumnTypeEnum getByType(String dataType) { public static DB2ColumnTypeEnum getByType(String dataType) {
return COLUMN_TYPE_MAP.get(dataType.toUpperCase()); return COLUMN_TYPE_MAP.get(SqlUtils.removeDigits(dataType.toUpperCase()));
} }
private static Map<String, DB2ColumnTypeEnum> COLUMN_TYPE_MAP = Maps.newHashMap(); private static Map<String, DB2ColumnTypeEnum> COLUMN_TYPE_MAP = Maps.newHashMap();

View File

@ -4,6 +4,7 @@ import ai.chat2db.spi.ColumnBuilder;
import ai.chat2db.spi.enums.EditStatus; import ai.chat2db.spi.enums.EditStatus;
import ai.chat2db.spi.model.ColumnType; import ai.chat2db.spi.model.ColumnType;
import ai.chat2db.spi.model.TableColumn; import ai.chat2db.spi.model.TableColumn;
import ai.chat2db.spi.util.SqlUtils;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
@ -123,11 +124,13 @@ public enum DMColumnTypeEnum implements ColumnBuilder {
VARCHAR2("VARCHAR2", true, false, true, false, false, false, true, true, false, true), VARCHAR2("VARCHAR2", true, false, true, false, false, false, true, true, false, true),
DATETIME("DATETIME", false, false, true, false, false, false, true, true, false, false),
; ;
private ColumnType columnType; private ColumnType columnType;
public static DMColumnTypeEnum getByType(String dataType) { public static DMColumnTypeEnum getByType(String dataType) {
return COLUMN_TYPE_MAP.get(dataType.toUpperCase()); String type = SqlUtils.removeDigits(dataType.toUpperCase());
return COLUMN_TYPE_MAP.get(type);
} }
private static Map<String, DMColumnTypeEnum> COLUMN_TYPE_MAP = Maps.newHashMap(); private static Map<String, DMColumnTypeEnum> COLUMN_TYPE_MAP = Maps.newHashMap();

View File

@ -4,6 +4,7 @@ import ai.chat2db.spi.ColumnBuilder;
import ai.chat2db.spi.enums.EditStatus; import ai.chat2db.spi.enums.EditStatus;
import ai.chat2db.spi.model.ColumnType; import ai.chat2db.spi.model.ColumnType;
import ai.chat2db.spi.model.TableColumn; import ai.chat2db.spi.model.TableColumn;
import ai.chat2db.spi.util.SqlUtils;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
@ -71,7 +72,7 @@ public enum HiveColumnTypeEnum implements ColumnBuilder {
private ColumnType columnType; private ColumnType columnType;
public static HiveColumnTypeEnum getByType(String dataType) { public static HiveColumnTypeEnum getByType(String dataType) {
return COLUMN_TYPE_MAP.get(dataType.toUpperCase()); return COLUMN_TYPE_MAP.get(SqlUtils.removeDigits(dataType.toUpperCase()));
} }
public ColumnType getColumnType() { public ColumnType getColumnType() {

View File

@ -4,6 +4,7 @@ import ai.chat2db.spi.ColumnBuilder;
import ai.chat2db.spi.enums.EditStatus; import ai.chat2db.spi.enums.EditStatus;
import ai.chat2db.spi.model.ColumnType; import ai.chat2db.spi.model.ColumnType;
import ai.chat2db.spi.model.TableColumn; import ai.chat2db.spi.model.TableColumn;
import ai.chat2db.spi.util.SqlUtils;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
@ -87,7 +88,7 @@ public enum KingBaseColumnTypeEnum implements ColumnBuilder {
} }
public static KingBaseColumnTypeEnum getByType(String dataType) { public static KingBaseColumnTypeEnum getByType(String dataType) {
return COLUMN_TYPE_MAP.get(dataType.toUpperCase()); return COLUMN_TYPE_MAP.get(SqlUtils.removeDigits(dataType.toUpperCase()));
} }
public static List<ColumnType> getTypes() { public static List<ColumnType> getTypes() {

View File

@ -4,6 +4,7 @@ import ai.chat2db.spi.ColumnBuilder;
import ai.chat2db.spi.enums.EditStatus; import ai.chat2db.spi.enums.EditStatus;
import ai.chat2db.spi.model.ColumnType; import ai.chat2db.spi.model.ColumnType;
import ai.chat2db.spi.model.TableColumn; import ai.chat2db.spi.model.TableColumn;
import ai.chat2db.spi.util.SqlUtils;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
@ -116,7 +117,7 @@ public enum MysqlColumnTypeEnum implements ColumnBuilder {
private ColumnType columnType; private ColumnType columnType;
public static MysqlColumnTypeEnum getByType(String dataType) { public static MysqlColumnTypeEnum getByType(String dataType) {
return COLUMN_TYPE_MAP.get(dataType.toUpperCase()); return COLUMN_TYPE_MAP.get(SqlUtils.removeDigits(dataType.toUpperCase()));
} }
public ColumnType getColumnType() { public ColumnType getColumnType() {

View File

@ -42,7 +42,7 @@ public class MysqlValueProcessor extends DefaultValueProcessor {
@Override @Override
public String getJdbcValueString(JDBCDataValue dataValue) { public String getJdbcSqlValueString(JDBCDataValue dataValue) {
Object value = dataValue.getObject(); Object value = dataValue.getObject();
if (Objects.isNull(value)) { if (Objects.isNull(value)) {
// mysql -> example: [date]->0000-00-00 // mysql -> example: [date]->0000-00-00

View File

@ -36,7 +36,7 @@ public class OracleValueProcessor extends DefaultValueProcessor {
@Override @Override
public String getJdbcValueString(JDBCDataValue dataValue) { public String getJdbcSqlValueString(JDBCDataValue dataValue) {
if (OracleColumnTypeEnum.LONG_RAW.getColumnType().getTypeName().equalsIgnoreCase(dataValue.getType())) { if (OracleColumnTypeEnum.LONG_RAW.getColumnType().getTypeName().equalsIgnoreCase(dataValue.getType())) {
return convertJDBCValueStrByType(dataValue); return convertJDBCValueStrByType(dataValue);
} }

View File

@ -4,6 +4,7 @@ import ai.chat2db.spi.ColumnBuilder;
import ai.chat2db.spi.enums.EditStatus; import ai.chat2db.spi.enums.EditStatus;
import ai.chat2db.spi.model.ColumnType; import ai.chat2db.spi.model.ColumnType;
import ai.chat2db.spi.model.TableColumn; import ai.chat2db.spi.model.TableColumn;
import ai.chat2db.spi.util.SqlUtils;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
@ -76,7 +77,7 @@ public enum PostgreSQLColumnTypeEnum implements ColumnBuilder {
} }
public static PostgreSQLColumnTypeEnum getByType(String dataType) { public static PostgreSQLColumnTypeEnum getByType(String dataType) {
return COLUMN_TYPE_MAP.get(dataType.toUpperCase()); return COLUMN_TYPE_MAP.get(SqlUtils.removeDigits(dataType.toUpperCase()));
} }
public static List<ColumnType> getTypes() { public static List<ColumnType> getTypes() {

View File

@ -4,6 +4,7 @@ import ai.chat2db.spi.ColumnBuilder;
import ai.chat2db.spi.enums.EditStatus; import ai.chat2db.spi.enums.EditStatus;
import ai.chat2db.spi.model.ColumnType; import ai.chat2db.spi.model.ColumnType;
import ai.chat2db.spi.model.TableColumn; import ai.chat2db.spi.model.TableColumn;
import ai.chat2db.spi.util.SqlUtils;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
@ -27,7 +28,7 @@ public enum SqliteColumnTypeEnum implements ColumnBuilder {
private ColumnType columnType; private ColumnType columnType;
public static SqliteColumnTypeEnum getByType(String dataType) { public static SqliteColumnTypeEnum getByType(String dataType) {
return COLUMN_TYPE_MAP.get(dataType.toUpperCase()); return COLUMN_TYPE_MAP.get(SqlUtils.removeDigits(dataType.toUpperCase()));
} }
public ColumnType getColumnType() { public ColumnType getColumnType() {

View File

@ -16,7 +16,6 @@ import java.sql.ResultSetMetaData;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Objects;
public class SqlServerDBManage extends DefaultDBManage implements DBManage { public class SqlServerDBManage extends DefaultDBManage implements DBManage {
private String tableDDLFunction private String tableDDLFunction
@ -108,7 +107,7 @@ public class SqlServerDBManage extends DefaultDBManage implements DBManage {
for (int i = 1; i <= metaData.getColumnCount(); i++) { for (int i = 1; i <= metaData.getColumnCount(); i++) {
ValueProcessor valueProcessor = Chat2DBContext.getMetaData().getValueProcessor(); ValueProcessor valueProcessor = Chat2DBContext.getMetaData().getValueProcessor();
JDBCDataValue jdbcDataValue = new JDBCDataValue(resultSet, metaData, i, false); JDBCDataValue jdbcDataValue = new JDBCDataValue(resultSet, metaData, i, false);
String valueString = valueProcessor.getJdbcValueString(jdbcDataValue); String valueString = valueProcessor.getJdbcSqlValueString(jdbcDataValue);
valueList.add(valueString); valueList.add(valueString);
} }
String insertSql = sqlBuilder.buildSingleInsertSql(databaseName, schemaName, tableName, columnList, valueList); String insertSql = sqlBuilder.buildSingleInsertSql(databaseName, schemaName, tableName, columnList, valueList);

View File

@ -17,6 +17,7 @@ import ai.chat2db.spi.jdbc.DefaultMetaService;
import ai.chat2db.spi.model.*; import ai.chat2db.spi.model.*;
import ai.chat2db.spi.sql.SQLExecutor; import ai.chat2db.spi.sql.SQLExecutor;
import ai.chat2db.spi.util.SortUtils; import ai.chat2db.spi.util.SortUtils;
import ai.chat2db.spi.util.SqlUtils;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotEmpty;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
@ -131,7 +132,9 @@ public class SqlServerMetaData extends DefaultMetaService implements MetaData {
column.setOldName(resultSet.getString("COLUMN_NAME")); column.setOldName(resultSet.getString("COLUMN_NAME"));
column.setName(resultSet.getString("COLUMN_NAME")); column.setName(resultSet.getString("COLUMN_NAME"));
//column.setColumnType(resultSet.getString("COLUMN_TYPE")); //column.setColumnType(resultSet.getString("COLUMN_TYPE"));
column.setColumnType(resultSet.getString("DATA_TYPE").toUpperCase()); String dataType = resultSet.getString("DATA_TYPE").toUpperCase();
column.setColumnType(SqlUtils.removeDigits(dataType));
//column.setDataType(resultSet.getInt("DATA_TYPE")); //column.setDataType(resultSet.getInt("DATA_TYPE"));
column.setDefaultValue(resultSet.getString("COLUMN_DEFAULT")); column.setDefaultValue(resultSet.getString("COLUMN_DEFAULT"));
//column.setAutoIncrement(resultSet.getString("EXTRA").contains("auto_increment")); //column.setAutoIncrement(resultSet.getString("EXTRA").contains("auto_increment"));

View File

@ -4,6 +4,7 @@ import ai.chat2db.spi.ColumnBuilder;
import ai.chat2db.spi.enums.EditStatus; import ai.chat2db.spi.enums.EditStatus;
import ai.chat2db.spi.model.ColumnType; import ai.chat2db.spi.model.ColumnType;
import ai.chat2db.spi.model.TableColumn; import ai.chat2db.spi.model.TableColumn;
import ai.chat2db.spi.util.SqlUtils;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
@ -103,7 +104,7 @@ public enum SqlServerColumnTypeEnum implements ColumnBuilder {
private ColumnType columnType; private ColumnType columnType;
public static SqlServerColumnTypeEnum getByType(String dataType) { public static SqlServerColumnTypeEnum getByType(String dataType) {
SqlServerColumnTypeEnum typeEnum = COLUMN_TYPE_MAP.get(dataType.toUpperCase()); SqlServerColumnTypeEnum typeEnum = COLUMN_TYPE_MAP.get(SqlUtils.removeDigits(dataType.toUpperCase()));
if (typeEnum == null) { if (typeEnum == null) {
return OTHER; return OTHER;
} }

View File

@ -7,6 +7,8 @@ import java.nio.charset.StandardCharsets;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.List; import java.util.List;
import ai.chat2db.spi.SqlBuilder;
import ai.chat2db.spi.ValueProcessor;
import com.alibaba.druid.DbType; import com.alibaba.druid.DbType;
import com.alibaba.druid.sql.SQLUtils; import com.alibaba.druid.sql.SQLUtils;
import com.alibaba.druid.sql.SQLUtils.FormatOption; import com.alibaba.druid.sql.SQLUtils.FormatOption;
@ -103,9 +105,9 @@ public class RdbDmlExportController {
response.setCharacterEncoding("utf-8"); response.setCharacterEncoding("utf-8");
String fileName = URLEncoder.encode( String fileName = URLEncoder.encode(
tableName + "_" + LocalDateTime.now().format(DatePattern.PURE_DATETIME_FORMATTER), tableName + "_" + LocalDateTime.now().format(DatePattern.PURE_DATETIME_FORMATTER),
StandardCharsets.UTF_8) StandardCharsets.UTF_8)
.replaceAll("\\+", "%20"); .replaceAll("\\+", "%20");
if (exportType == ExportTypeEnum.CSV) { if (exportType == ExportTypeEnum.CSV) {
doExportCsv(sql, response, fileName); doExportCsv(sql, response, fileName);
@ -115,26 +117,27 @@ public class RdbDmlExportController {
} }
private void doExportCsv(String sql, HttpServletResponse response, String fileName) private void doExportCsv(String sql, HttpServletResponse response, String fileName)
throws IOException { throws IOException {
response.setContentType("text/csv"); response.setContentType("text/csv");
response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".csv"); response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".csv");
ExcelWrapper excelWrapper = new ExcelWrapper(); ExcelWrapper excelWrapper = new ExcelWrapper();
try { try {
ValueProcessor valueProcessor = Chat2DBContext.getMetaData().getValueProcessor();
ExcelWriterBuilder excelWriterBuilder = EasyExcel.write(response.getOutputStream()) ExcelWriterBuilder excelWriterBuilder = EasyExcel.write(response.getOutputStream())
.charset(StandardCharsets.UTF_8) .charset(StandardCharsets.UTF_8)
.excelType(ExcelTypeEnum.CSV); .excelType(ExcelTypeEnum.CSV);
excelWrapper.setExcelWriterBuilder(excelWriterBuilder); excelWrapper.setExcelWriterBuilder(excelWriterBuilder);
SQLExecutor.getInstance().execute(Chat2DBContext.getConnection(), sql, headerList -> { SQLExecutor.getInstance().execute(Chat2DBContext.getConnection(), sql, headerList -> {
excelWriterBuilder.head( excelWriterBuilder.head(
EasyCollectionUtils.toList(headerList, header -> Lists.newArrayList(header.getName()))); EasyCollectionUtils.toList(headerList, header -> Lists.newArrayList(header.getName())));
excelWrapper.setExcelWriter(excelWriterBuilder.build()); excelWrapper.setExcelWriter(excelWriterBuilder.build());
excelWrapper.setWriteSheet(EasyExcel.writerSheet(0).build()); excelWrapper.setWriteSheet(EasyExcel.writerSheet(0).build());
}, dataList -> { }, dataList -> {
List<List<String>> writeDataList = Lists.newArrayList(); List<List<String>> writeDataList = Lists.newArrayList();
writeDataList.add(dataList); writeDataList.add(dataList);
excelWrapper.getExcelWriter().write(writeDataList, excelWrapper.getWriteSheet()); excelWrapper.getExcelWriter().write(writeDataList, excelWrapper.getWriteSheet());
}, false); }, jdbcDataValue -> valueProcessor.getJdbcValue(jdbcDataValue), false);
} finally { } finally {
if (excelWrapper.getExcelWriter() != null) { if (excelWrapper.getExcelWriter() != null) {
excelWrapper.getExcelWriter().finish(); excelWrapper.getExcelWriter().finish();
@ -143,29 +146,32 @@ public class RdbDmlExportController {
} }
private void doExportInsert(String sql, HttpServletResponse response, String fileName, DbType dbType, private void doExportInsert(String sql, HttpServletResponse response, String fileName, DbType dbType,
String tableName) String tableName)
throws IOException { throws IOException {
response.setContentType("text/sql"); response.setContentType("text/sql");
response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".sql"); response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".sql");
ValueProcessor valueProcessor = Chat2DBContext.getMetaData().getValueProcessor();
SqlBuilder sqlBuilder = Chat2DBContext.getMetaData().getSqlBuilder();
try (PrintWriter printWriter = response.getWriter()) { try (PrintWriter printWriter = response.getWriter()) {
List<String> headerColumns = Lists.newArrayList();
InsertWrapper insertWrapper = new InsertWrapper(); InsertWrapper insertWrapper = new InsertWrapper();
SQLExecutor.getInstance().execute(Chat2DBContext.getConnection(), sql, SQLExecutor.getInstance().execute(Chat2DBContext.getConnection(), sql,
headerList -> insertWrapper.setHeaderList( headerList -> {
EasyCollectionUtils.toList(headerList, header -> new SQLIdentifierExpr(header.getName()))) headerList.forEach(sqlIdentifierExpr -> headerColumns.add(sqlIdentifierExpr.getName()));
, dataList -> {
SQLInsertStatement sqlInsertStatement = new SQLInsertStatement();
sqlInsertStatement.setDbType(dbType);
sqlInsertStatement.setTableSource(new SQLExprTableSource(tableName));
sqlInsertStatement.getColumns().addAll(insertWrapper.getHeaderList());
ValuesClause valuesClause = new ValuesClause();
for (String s : dataList) {
valuesClause.addValue(s);
} }
sqlInsertStatement.setValues(valuesClause); , dataList -> {
SQLInsertStatement sqlInsertStatement = new SQLInsertStatement();
printWriter.println(SQLUtils.toSQLString(sqlInsertStatement, dbType, INSERT_FORMAT_OPTION) + ";"); sqlInsertStatement.setDbType(dbType);
}, false); sqlInsertStatement.setTableSource(new SQLExprTableSource(tableName));
sqlInsertStatement.getColumns().addAll(insertWrapper.getHeaderList());
ValuesClause valuesClause = new ValuesClause();
for (String s : dataList) {
valuesClause.addValue(s);
}
sqlInsertStatement.setValues(valuesClause);
String sqls = sqlBuilder.buildSingleInsertSql(null, null, tableName, headerColumns, dataList);
printWriter.println(sqls + ";");
}, jdbcDataValue -> valueProcessor.getJdbcSqlValueString(jdbcDataValue), false);
} }
} }

View File

@ -146,7 +146,7 @@ public class SqlDataExporter extends BaseDataExporter {
List<String> rowData = new ArrayList<>(metaData.getColumnCount()); List<String> rowData = new ArrayList<>(metaData.getColumnCount());
for (int i = 1; i <= metaData.getColumnCount(); i++) { for (int i = 1; i <= metaData.getColumnCount(); i++) {
JDBCDataValue jdbcDataValue = new JDBCDataValue(resultSet, metaData, i, false); JDBCDataValue jdbcDataValue = new JDBCDataValue(resultSet, metaData, i, false);
rowData.add(valueProcessor.getJdbcValueString(jdbcDataValue)); rowData.add(valueProcessor.getJdbcSqlValueString(jdbcDataValue));
} }
return rowData; return rowData;
} }
@ -158,7 +158,7 @@ public class SqlDataExporter extends BaseDataExporter {
for (int i = 1; i <= metaData.getColumnCount(); i++) { for (int i = 1; i <= metaData.getColumnCount(); i++) {
JDBCDataValue jdbcDataValue = new JDBCDataValue(resultSet, metaData, i, false); JDBCDataValue jdbcDataValue = new JDBCDataValue(resultSet, metaData, i, false);
String columnName = metaData.getColumnName(i); String columnName = metaData.getColumnName(i);
String jdbcValueString = valueProcessor.getJdbcValueString(jdbcDataValue); String jdbcValueString = valueProcessor.getJdbcSqlValueString(jdbcDataValue);
if (primaryKeyMap.containsKey(columnName)) { if (primaryKeyMap.containsKey(columnName)) {
primaryKeyMap.put(columnName, jdbcValueString); primaryKeyMap.put(columnName, jdbcValueString);
} else { } else {

View File

@ -19,6 +19,8 @@ import ai.chat2db.server.web.api.controller.rdb.doc.conf.ExportOptions;
import ai.chat2db.server.web.api.controller.rdb.factory.ExportServiceFactory; import ai.chat2db.server.web.api.controller.rdb.factory.ExportServiceFactory;
import ai.chat2db.server.web.api.controller.rdb.request.DataExportRequest; import ai.chat2db.server.web.api.controller.rdb.request.DataExportRequest;
import ai.chat2db.server.web.api.controller.rdb.vo.TableVO; import ai.chat2db.server.web.api.controller.rdb.vo.TableVO;
import ai.chat2db.spi.SqlBuilder;
import ai.chat2db.spi.ValueProcessor;
import ai.chat2db.spi.model.Table; import ai.chat2db.spi.model.Table;
import ai.chat2db.spi.sql.Chat2DBContext; import ai.chat2db.spi.sql.Chat2DBContext;
import ai.chat2db.spi.sql.ConnectInfo; import ai.chat2db.spi.sql.ConnectInfo;
@ -32,8 +34,6 @@ import com.alibaba.druid.DbType;
import com.alibaba.druid.sql.SQLUtils; import com.alibaba.druid.sql.SQLUtils;
import com.alibaba.druid.sql.ast.SQLStatement; import com.alibaba.druid.sql.ast.SQLStatement;
import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr;
import com.alibaba.druid.sql.ast.statement.SQLExprTableSource;
import com.alibaba.druid.sql.ast.statement.SQLInsertStatement;
import com.alibaba.druid.sql.ast.statement.SQLSelectStatement; import com.alibaba.druid.sql.ast.statement.SQLSelectStatement;
import com.alibaba.druid.sql.visitor.VisitorFeature; import com.alibaba.druid.sql.visitor.VisitorFeature;
import com.alibaba.excel.EasyExcel; import com.alibaba.excel.EasyExcel;
@ -250,6 +250,7 @@ public class TaskBizService {
.charset(StandardCharsets.UTF_8) .charset(StandardCharsets.UTF_8)
.excelType(ExcelTypeEnum.CSV); .excelType(ExcelTypeEnum.CSV);
excelWrapper.setExcelWriterBuilder(excelWriterBuilder); excelWrapper.setExcelWriterBuilder(excelWriterBuilder);
ValueProcessor valueProcessor = Chat2DBContext.getMetaData().getValueProcessor();
SQLExecutor.getInstance().execute(Chat2DBContext.getConnection(), sql, headerList -> { SQLExecutor.getInstance().execute(Chat2DBContext.getConnection(), sql, headerList -> {
excelWriterBuilder.head( excelWriterBuilder.head(
EasyCollectionUtils.toList(headerList, header -> Lists.newArrayList(header.getName()))); EasyCollectionUtils.toList(headerList, header -> Lists.newArrayList(header.getName())));
@ -259,7 +260,7 @@ public class TaskBizService {
List<List<String>> writeDataList = Lists.newArrayList(); List<List<String>> writeDataList = Lists.newArrayList();
writeDataList.add(dataList); writeDataList.add(dataList);
excelWrapper.getExcelWriter().write(writeDataList, excelWrapper.getWriteSheet()); excelWrapper.getExcelWriter().write(writeDataList, excelWrapper.getWriteSheet());
}, false); }, jdbcDataValue -> valueProcessor.getJdbcValue(jdbcDataValue),false);
} finally { } finally {
if (excelWrapper.getExcelWriter() != null) { if (excelWrapper.getExcelWriter() != null) {
excelWrapper.getExcelWriter().finish(); excelWrapper.getExcelWriter().finish();
@ -272,22 +273,19 @@ public class TaskBizService {
throws IOException { throws IOException {
try (PrintWriter printWriter = new PrintWriter(file, StandardCharsets.UTF_8.name())) { try (PrintWriter printWriter = new PrintWriter(file, StandardCharsets.UTF_8.name())) {
RdbDmlExportController.InsertWrapper insertWrapper = new RdbDmlExportController.InsertWrapper(); RdbDmlExportController.InsertWrapper insertWrapper = new RdbDmlExportController.InsertWrapper();
ValueProcessor valueProcessor = Chat2DBContext.getMetaData().getValueProcessor();
SqlBuilder sqlBuilder = Chat2DBContext.getSqlBuilder();
String databaseName = Chat2DBContext.getConnectInfo().getDatabaseName();
String schemaName = Chat2DBContext.getConnectInfo().getSchemaName();
List<String> headerColumns = Lists.newArrayList();
SQLExecutor.getInstance().execute(Chat2DBContext.getConnection(), sql, SQLExecutor.getInstance().execute(Chat2DBContext.getConnection(), sql,
headerList -> insertWrapper.setHeaderList( headerList -> {
EasyCollectionUtils.toList(headerList, header -> new SQLIdentifierExpr(header.getName()))) headerList.forEach(header -> headerColumns.add(header.getName()));
}
, dataList -> { , dataList -> {
SQLInsertStatement sqlInsertStatement = new SQLInsertStatement(); String insertSql = sqlBuilder.buildSingleInsertSql(databaseName, schemaName, tableName, headerColumns, dataList);
sqlInsertStatement.setDbType(dbType); printWriter.println(insertSql + ";");
sqlInsertStatement.setTableSource(new SQLExprTableSource(tableName)); }, jdbcDataValue -> valueProcessor.getJdbcSqlValueString(jdbcDataValue), false);
sqlInsertStatement.getColumns().addAll(insertWrapper.getHeaderList());
SQLInsertStatement.ValuesClause valuesClause = new SQLInsertStatement.ValuesClause();
for (String s : dataList) {
valuesClause.addValue(s);
}
sqlInsertStatement.setValues(valuesClause);
printWriter.println(SQLUtils.toSQLString(sqlInsertStatement, dbType, INSERT_FORMAT_OPTION) + ";");
}, false);
} }
} }

View File

@ -36,5 +36,5 @@ public interface ValueProcessor {
* *
* @return 一个格式化后的字符串可以直接用于DML语句中确保数据的正确插入或更新。 * @return 一个格式化后的字符串可以直接用于DML语句中确保数据的正确插入或更新。
*/ */
String getJdbcValueString(JDBCDataValue dataValue); String getJdbcSqlValueString(JDBCDataValue dataValue);
} }

View File

@ -219,7 +219,7 @@ public class DefaultDBManage implements DBManage {
for (int i = 1; i <= metaData.getColumnCount(); i++) { for (int i = 1; i <= metaData.getColumnCount(); i++) {
ValueProcessor valueProcessor = Chat2DBContext.getMetaData().getValueProcessor(); ValueProcessor valueProcessor = Chat2DBContext.getMetaData().getValueProcessor();
JDBCDataValue jdbcDataValue = new JDBCDataValue(resultSet, metaData, i, false); JDBCDataValue jdbcDataValue = new JDBCDataValue(resultSet, metaData, i, false);
String valueString = valueProcessor.getJdbcValueString(jdbcDataValue); String valueString = valueProcessor.getJdbcSqlValueString(jdbcDataValue);
valueList.add(valueString); valueList.add(valueString);
} }
String insertSql = sqlBuilder.buildSingleInsertSql(null, null, tableName, columnList, valueList); String insertSql = sqlBuilder.buildSingleInsertSql(null, null, tableName, columnList, valueList);

View File

@ -4,6 +4,7 @@ import ai.chat2db.server.tools.base.wrapper.result.PageResult;
import ai.chat2db.spi.*; import ai.chat2db.spi.*;
import ai.chat2db.spi.model.*; import ai.chat2db.spi.model.*;
import ai.chat2db.spi.sql.SQLExecutor; import ai.chat2db.spi.sql.SQLExecutor;
import ai.chat2db.spi.util.SqlUtils;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
@ -110,7 +111,14 @@ public class DefaultMetaService implements MetaData {
@Override @Override
public List<TableColumn> columns(Connection connection, String databaseName, String schemaName, String tableName) { public List<TableColumn> columns(Connection connection, String databaseName, String schemaName, String tableName) {
return SQLExecutor.getInstance().columns(connection, StringUtils.isEmpty(databaseName) ? null : databaseName, StringUtils.isEmpty(schemaName) ? null : schemaName, tableName, null); List<TableColumn> columns = SQLExecutor.getInstance().columns(connection, StringUtils.isEmpty(databaseName) ? null : databaseName, StringUtils.isEmpty(schemaName) ? null : schemaName, tableName, null);
if (CollectionUtils.isNotEmpty(columns)) {
for (TableColumn column : columns) {
String columnType = SqlUtils.removeDigits(column.getColumnType());
column.setColumnType(columnType);
}
}
return columns;
} }
@Override @Override

View File

@ -3,6 +3,7 @@ package ai.chat2db.spi.jdbc;
import ai.chat2db.server.tools.common.util.EasyStringUtils; import ai.chat2db.server.tools.common.util.EasyStringUtils;
import ai.chat2db.spi.MetaData; import ai.chat2db.spi.MetaData;
import ai.chat2db.spi.SqlBuilder; import ai.chat2db.spi.SqlBuilder;
import ai.chat2db.spi.ValueProcessor;
import ai.chat2db.spi.enums.DmlType; import ai.chat2db.spi.enums.DmlType;
import ai.chat2db.spi.model.*; import ai.chat2db.spi.model.*;
import ai.chat2db.spi.sql.Chat2DBContext; import ai.chat2db.spi.sql.Chat2DBContext;
@ -371,6 +372,8 @@ public class DefaultSqlBuilder implements SqlBuilder<Table> {
StringBuilder script = new StringBuilder(); StringBuilder script = new StringBuilder();
script.append("INSERT INTO ").append(tableName) script.append("INSERT INTO ").append(tableName)
.append(" ("); .append(" (");
ValueProcessor valueProcessor = metaSchema.getValueProcessor();
for (int i = 1; i < row.size(); i++) { for (int i = 1; i < row.size(); i++) {
Header header = headerList.get(i); Header header = headerList.get(i);
//String newValue = row.get(i); //String newValue = row.get(i);
@ -385,7 +388,9 @@ public class DefaultSqlBuilder implements SqlBuilder<Table> {
String newValue = row.get(i); String newValue = row.get(i);
//if (newValue != null) { //if (newValue != null) {
Header header = headerList.get(i); Header header = headerList.get(i);
script.append(SqlUtils.getSqlValue(newValue, header.getDataType())) SQLDataValue sqlDataValue = new SQLDataValue();
String value = valueProcessor.getSqlValueString(sqlDataValue);
script.append(value)
.append(","); .append(",");
//} //}
} }

View File

@ -41,7 +41,7 @@ public class DefaultValueProcessor implements ValueProcessor {
@Override @Override
public String getJdbcValueString(JDBCDataValue dataValue) { public String getJdbcSqlValueString(JDBCDataValue dataValue) {
// Object value = dataValue.getObject(); // Object value = dataValue.getObject();
// if (Objects.isNull(value)) { // if (Objects.isNull(value)) {
// return "NULL"; // return "NULL";

View File

@ -60,4 +60,9 @@ public class Command implements Serializable {
* Only available for select statements * Only available for select statements
*/ */
private Boolean pageSizeAll; private Boolean pageSizeAll;
/**
* single SQL
*/
private boolean single;
} }

View File

@ -61,7 +61,7 @@ public class SQLExecutor implements CommandExecutor {
} }
} }
} catch (Exception e) { } catch (Exception e) {
log.error("execute:{}", sql,e); log.error("execute:{}", sql, e);
throw new RuntimeException(e); throw new RuntimeException(e);
} }
return null; return null;
@ -77,7 +77,7 @@ public class SQLExecutor implements CommandExecutor {
} }
} }
} catch (Exception e) { } catch (Exception e) {
log.error("execute:{}", sql,e); log.error("execute:{}", sql, e);
throw new RuntimeException(e); throw new RuntimeException(e);
} }
} }
@ -87,11 +87,14 @@ public class SQLExecutor implements CommandExecutor {
// execute(connection, sql, headerConsumer, rowConsumer, true, valueHandler); // execute(connection, sql, headerConsumer, rowConsumer, true, valueHandler);
// } // }
public void execute(Connection connection, String sql, Consumer<List<Header>> headerConsumer, public void execute(
Consumer<List<String>> rowConsumer, boolean limitSize) { Connection connection, String sql,
Consumer<List<Header>> headerConsumer,
Consumer<List<String>> rowConsumer,
java.util.function.Function<JDBCDataValue,
String> valueFunction,
boolean limitSize) {
Assert.notNull(sql, "SQL must not be null"); Assert.notNull(sql, "SQL must not be null");
ValueProcessor valueProcessor = Chat2DBContext.getMetaData().getValueProcessor();
try (Statement stmt = connection.createStatement();) { try (Statement stmt = connection.createStatement();) {
boolean query = stmt.execute(sql); boolean query = stmt.execute(sql);
// Represents the query // Represents the query
@ -110,7 +113,8 @@ public class SQLExecutor implements CommandExecutor {
while (rs.next()) { while (rs.next()) {
List<String> row = Lists.newArrayListWithExpectedSize(col); List<String> row = Lists.newArrayListWithExpectedSize(col);
for (int i = 1; i <= col; i++) { for (int i = 1; i <= col; i++) {
row.add(valueProcessor.getJdbcValue(new JDBCDataValue(rs, resultSetMetaData, i, limitSize))); JDBCDataValue jdbcDataValue = new JDBCDataValue(rs, resultSetMetaData, i, limitSize);
row.add(valueFunction.apply(jdbcDataValue));
} }
rowConsumer.accept(row); rowConsumer.accept(row);
} }
@ -119,7 +123,7 @@ public class SQLExecutor implements CommandExecutor {
} }
} }
} catch (SQLException e) { } catch (SQLException e) {
log.error("execute:{}", sql,e); log.error("execute:{}", sql, e);
throw new RuntimeException(e); throw new RuntimeException(e);
} }
} }
@ -381,7 +385,7 @@ public class SQLExecutor implements CommandExecutor {
tableName, tableName,
String columnName) { String columnName) {
try (ResultSet resultSet = connection.getMetaData().getColumns(databaseName, schemaName, tableName, try (ResultSet resultSet = connection.getMetaData().getColumns(databaseName, schemaName, tableName,
columnName)) { columnName)) {
return ResultSetUtils.toObjectList(resultSet, TableColumn.class); return ResultSetUtils.toObjectList(resultSet, TableColumn.class);
} catch (Exception e) { } catch (Exception e) {
throw new RuntimeException(e); throw new RuntimeException(e);
@ -400,8 +404,8 @@ public class SQLExecutor implements CommandExecutor {
public List<TableIndex> indexes(Connection connection, String databaseName, String schemaName, String tableName) { public List<TableIndex> indexes(Connection connection, String databaseName, String schemaName, String tableName) {
List<TableIndex> tableIndices = Lists.newArrayList(); List<TableIndex> tableIndices = Lists.newArrayList();
try (ResultSet resultSet = connection.getMetaData().getIndexInfo(databaseName, schemaName, tableName, try (ResultSet resultSet = connection.getMetaData().getIndexInfo(databaseName, schemaName, tableName,
false, false,
false)) { false)) {
List<TableIndexColumn> tableIndexColumns = ResultSetUtils.toObjectList(resultSet, TableIndexColumn.class); List<TableIndexColumn> tableIndexColumns = ResultSetUtils.toObjectList(resultSet, TableIndexColumn.class);
tableIndexColumns.stream().filter(c -> c.getIndexName() != null).collect( tableIndexColumns.stream().filter(c -> c.getIndexName() != null).collect(
Collectors.groupingBy(TableIndexColumn::getIndexName)).entrySet() Collectors.groupingBy(TableIndexColumn::getIndexName)).entrySet()
@ -493,8 +497,10 @@ public class SQLExecutor implements CommandExecutor {
// parse sql // parse sql
String type = Chat2DBContext.getConnectInfo().getDbType(); String type = Chat2DBContext.getConnectInfo().getDbType();
DbType dbType = JdbcUtils.parse2DruidDbType(type); DbType dbType = JdbcUtils.parse2DruidDbType(type);
List<String> sqlList = SqlUtils.parse(command.getScript(), dbType,true); List<String> sqlList = Lists.newArrayList(command.getScript());
if(!command.isSingle()) {
sqlList = SqlUtils.parse(command.getScript(), dbType, true);
}
if (CollectionUtils.isEmpty(sqlList)) { if (CollectionUtils.isEmpty(sqlList)) {
throw new BusinessException("dataSource.sqlAnalysisError"); throw new BusinessException("dataSource.sqlAnalysisError");
} }
@ -577,7 +583,7 @@ public class SQLExecutor implements CommandExecutor {
Header rowNumberHeader = Header.builder() Header rowNumberHeader = Header.builder()
.name(I18nUtils.getMessage("sqlResult.rowNumber")) .name(I18nUtils.getMessage("sqlResult.rowNumber"))
.dataType(DataTypeEnum.CHAT2DB_ROW_NUMBER .dataType(DataTypeEnum.CHAT2DB_ROW_NUMBER
.getCode()).build(); .getCode()).build();
executeResult.setHeaderList(EasyCollectionUtils.union(Arrays.asList(rowNumberHeader), headers)); executeResult.setHeaderList(EasyCollectionUtils.union(Arrays.asList(rowNumberHeader), headers));
// Add row number // Add row number
@ -632,7 +638,7 @@ public class SQLExecutor implements CommandExecutor {
} }
} }
} catch (Exception e) { } catch (Exception e) {
log.error("execute error:{}", sql,e); log.error("execute error:{}", sql, e);
throw new RuntimeException(e); throw new RuntimeException(e);
} }
} }