support select result data update

This commit is contained in:
SwallowGG
2023-10-11 15:34:04 +08:00
parent 35f15835f1
commit 283073b0e9
6 changed files with 135 additions and 35 deletions

View File

@ -112,9 +112,9 @@ public class SqlServerMetaData extends DefaultMetaService implements MetaData {
column.setNullable(resultSet.getInt("IS_NULLABLE"));
column.setOrdinalPosition(resultSet.getInt("ORDINAL_POSITION"));
column.setDecimalDigits(resultSet.getInt("NUMERIC_SCALE"));
column.setCharSetName(resultSet.getString("CHARACTER_SET_NAME"));
// column.setCharSetName(resultSet.getString("CHARACTER_SET_NAME"));
column.setCollationName(resultSet.getString("COLLATION_NAME"));
column.setColumnSize(resultSet.getInt("CHARACTER_MAXIMUM_LENGTH"));
column.setColumnSize(resultSet.getInt("COLUMN_SIZE"));
//setColumnSize(column, resultSet.getString("COLUMN_TYPE"));
tableColumns.add(column);
}

View File

@ -25,6 +25,15 @@ public interface DlTemplateService {
*/
ListResult<ExecuteResult> execute(DlExecuteParam param);
/**
* 数据源执行update
*
* @param param
* @return
*/
DataResult<ExecuteResult> executeUpdate(DlExecuteParam param);
/**
* 执行统计sql
*

View File

@ -1,5 +1,6 @@
package ai.chat2db.server.domain.core.impl;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collections;
@ -76,6 +77,35 @@ public class DlTemplateServiceImpl implements DlTemplateService {
return listResult;
}
@Override
public DataResult<ExecuteResult> executeUpdate(DlExecuteParam param) {
DataResult<ExecuteResult> dataResult = new DataResult<>();
RemoveSpecialGO(param);
DbType dbType =
JdbcUtils.parse2DruidDbType(Chat2DBContext.getConnectInfo().getDbType());
List<String> sqlList = SqlUtils.parse(param.getSql(), dbType);
Connection connection = Chat2DBContext.getConnection();
try {
connection.setAutoCommit(false);
for (String originalSql : sqlList) {
ExecuteResult executeResult = SQLExecutor.getInstance().executeUpdate(originalSql, connection, 1);
if (!executeResult.getSuccess()) {
dataResult.setSuccess(false);
dataResult.errorCode(executeResult.getDescription());
dataResult.setErrorMessage(executeResult.getMessage());
connection.rollback();
return dataResult;
}
}
connection.commit();
}catch (Exception e){
dataResult.setSuccess(false);
dataResult.setErrorCode("connection error");
dataResult.setErrorMessage(e.getMessage());
}
return dataResult;
}
private void RemoveSpecialGO(DlExecuteParam param) {
String sql = param.getSql();
if (StringUtils.isBlank(sql)) {
@ -221,15 +251,35 @@ public class DlTemplateServiceImpl implements DlTemplateService {
private String getDeleteSql(UpdateSelectResultParam param, List<String> row, MetaData metaSchema) {
StringBuilder script = new StringBuilder();
script.append("DELETE FROM ").append(metaSchema.getMetaDataName(param.getDatabaseName(), param.getSchemaName(), param.getTableName()))
.append(" where ");
.append("");
script.append(buildWhere(param.getHeaderList(), row, metaSchema));
return script.toString();
}
private String buildWhere(List<Header> headerList, List<String> row, MetaData metaSchema) {
StringBuilder script = new StringBuilder();
script.append(" where ");
for (int i = 1; i < row.size(); i++) {
String newValue = row.get(i);
Header header = param.getHeaderList().get(i);
String oldValue = row.get(i);
if (oldValue == null) {
continue;
}
Header header = headerList.get(i);
String value = SqlUtils.getSqlValue(oldValue, header.getDataType());
if (value == null) {
script.append(metaSchema.getMetaDataName(header.getName()))
.append(" is null and ");
} else {
script.append(metaSchema.getMetaDataName(header.getName()))
.append(" = ")
.append(SqlUtils.getSqlValue(newValue, header.getDataType()))
.append(value)
.append(" and ");
}
}
script.delete(script.length() - 4, script.length());
return script.toString();
}
@ -276,20 +326,7 @@ public class DlTemplateServiceImpl implements DlTemplateService {
.append(",");
}
script.deleteCharAt(script.length() - 1);
script.append(" where ");
for (int i = 1; i < odlRow.size(); i++) {
String oldValue = odlRow.get(i);
if (oldValue == null) {
continue;
}
Header header = param.getHeaderList().get(i);
script.append(metaSchema.getMetaDataName(header.getName()))
.append(" = ")
.append(SqlUtils.getSqlValue(oldValue, header.getDataType()))
.append(" and ");
}
script.delete(script.length() - 4, script.length());
script.append(buildWhere(param.getHeaderList(), odlRow, metaSchema));
return script.toString();
}

View File

@ -35,7 +35,7 @@ public class MybatisGeneratorTest extends BaseTest {
//doGenerator(Lists.newArrayList("operation_saved"));
//doGenerator(Lists.newArrayList("environment","data_source","team","team_dbhub_user","data_source_access",
// "dbhub_user"));
doGenerator(Lists.newArrayList("environment"));
doGenerator(Lists.newArrayList("table_cache_version","table_cache"));
}
private void doGenerator(List<String> tableList) {

View File

@ -63,10 +63,46 @@ public class RdbDmlController {
* @return
*/
@RequestMapping(value = "/execute_update", method = {RequestMethod.POST, RequestMethod.PUT})
public DataResult<String> executeUpdate(@RequestBody SelectResultUpdateRequest request) {
public DataResult<ExecuteResultVO> executeSelectResultUpdate(@RequestBody DmlRequest request) {
DlExecuteParam param = rdbWebConverter.request2param(request);
Connection connection = Chat2DBContext.getConnection();
if (connection != null) {
try {
boolean flag = true;
ExecuteResultVO executeResult = null;
connection.setAutoCommit(false);
ListResult<ExecuteResult> resultDTOListResult = dlTemplateService.execute(param);
List<ExecuteResultVO> resultVOS = rdbWebConverter.dto2vo(resultDTOListResult.getData());
if (!CollectionUtils.isEmpty(resultVOS)) {
for (ExecuteResultVO resultVO : resultVOS) {
if (!resultVO.getSuccess()) {
flag = false;
executeResult = resultVO;
break;
}
}
}
if (flag) {
connection.commit();
return DataResult.of(resultVOS.get(0));
}else {
connection.rollback();
return DataResult.of(executeResult);
}
} catch (Exception e) {
throw new RuntimeException(e);
}
} else {
return DataResult.error("connection error", "");
}
}
@RequestMapping(value = "/get_update_sql", method = {RequestMethod.POST, RequestMethod.PUT})
public DataResult<String> getUpdateSelectResultSql(SelectResultUpdateRequest request) {
UpdateSelectResultParam param = rdbWebConverter.request2param(request);
return dlTemplateService.updateSelectResult(param);
}

View File

@ -148,6 +148,23 @@ public class SQLExecutor {
return execute(sql, connection, true, null, null);
}
public ExecuteResult executeUpdate(final String sql, Connection connection, int n)
throws SQLException {
Assert.notNull(sql, "SQL must not be null");
log.info("execute:{}", sql);
// connection.setAutoCommit(false);
ExecuteResult executeResult = ExecuteResult.builder().sql(sql).success(Boolean.TRUE).build();
try (Statement stmt = connection.createStatement()) {
int affectedRows = stmt.executeUpdate(sql);
if (affectedRows != n) {
executeResult.setSuccess(false);
executeResult.setMessage("Update error "+ sql +" update affectedRows = " + affectedRows + ", Each SQL statement should update no more than one record. Please use a unique key for updates.");
connection.rollback();
}
}
return executeResult;
}
/**
* 执行sql
*
@ -316,7 +333,8 @@ public class SQLExecutor {
* @param columnName
* @return
*/
public List<TableColumn> columns(Connection connection, String databaseName, String schemaName, String tableName,
public List<TableColumn> columns(Connection connection, String databaseName, String schemaName, String
tableName,
String columnName) {
try (ResultSet resultSet = connection.getMetaData().getColumns(databaseName, schemaName, tableName,
columnName)) {