mirror of
https://github.com/CodePhiliaX/Chat2DB.git
synced 2025-07-30 19:22:58 +08:00
support select result data update
This commit is contained in:
@ -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);
|
||||
}
|
||||
|
@ -25,6 +25,15 @@ public interface DlTemplateService {
|
||||
*/
|
||||
ListResult<ExecuteResult> execute(DlExecuteParam param);
|
||||
|
||||
|
||||
/**
|
||||
* 数据源执行update
|
||||
*
|
||||
* @param param
|
||||
* @return
|
||||
*/
|
||||
DataResult<ExecuteResult> executeUpdate(DlExecuteParam param);
|
||||
|
||||
/**
|
||||
* 执行统计sql
|
||||
*
|
||||
|
@ -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();
|
||||
}
|
||||
|
||||
|
@ -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) {
|
||||
|
@ -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);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
@ -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)) {
|
||||
|
Reference in New Issue
Block a user