mirror of
https://github.com/CodePhiliaX/Chat2DB.git
synced 2025-07-31 19:52:54 +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.setNullable(resultSet.getInt("IS_NULLABLE"));
|
||||||
column.setOrdinalPosition(resultSet.getInt("ORDINAL_POSITION"));
|
column.setOrdinalPosition(resultSet.getInt("ORDINAL_POSITION"));
|
||||||
column.setDecimalDigits(resultSet.getInt("NUMERIC_SCALE"));
|
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.setCollationName(resultSet.getString("COLLATION_NAME"));
|
||||||
column.setColumnSize(resultSet.getInt("CHARACTER_MAXIMUM_LENGTH"));
|
column.setColumnSize(resultSet.getInt("COLUMN_SIZE"));
|
||||||
//setColumnSize(column, resultSet.getString("COLUMN_TYPE"));
|
//setColumnSize(column, resultSet.getString("COLUMN_TYPE"));
|
||||||
tableColumns.add(column);
|
tableColumns.add(column);
|
||||||
}
|
}
|
||||||
|
@ -25,6 +25,15 @@ public interface DlTemplateService {
|
|||||||
*/
|
*/
|
||||||
ListResult<ExecuteResult> execute(DlExecuteParam param);
|
ListResult<ExecuteResult> execute(DlExecuteParam param);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 数据源执行update
|
||||||
|
*
|
||||||
|
* @param param
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
DataResult<ExecuteResult> executeUpdate(DlExecuteParam param);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 执行统计sql
|
* 执行统计sql
|
||||||
*
|
*
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package ai.chat2db.server.domain.core.impl;
|
package ai.chat2db.server.domain.core.impl;
|
||||||
|
|
||||||
|
import java.sql.Connection;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
@ -76,6 +77,35 @@ public class DlTemplateServiceImpl implements DlTemplateService {
|
|||||||
return listResult;
|
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) {
|
private void RemoveSpecialGO(DlExecuteParam param) {
|
||||||
String sql = param.getSql();
|
String sql = param.getSql();
|
||||||
if (StringUtils.isBlank(sql)) {
|
if (StringUtils.isBlank(sql)) {
|
||||||
@ -221,15 +251,35 @@ public class DlTemplateServiceImpl implements DlTemplateService {
|
|||||||
private String getDeleteSql(UpdateSelectResultParam param, List<String> row, MetaData metaSchema) {
|
private String getDeleteSql(UpdateSelectResultParam param, List<String> row, MetaData metaSchema) {
|
||||||
StringBuilder script = new StringBuilder();
|
StringBuilder script = new StringBuilder();
|
||||||
script.append("DELETE FROM ").append(metaSchema.getMetaDataName(param.getDatabaseName(), param.getSchemaName(), param.getTableName()))
|
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++) {
|
for (int i = 1; i < row.size(); i++) {
|
||||||
String newValue = row.get(i);
|
String oldValue = row.get(i);
|
||||||
Header header = param.getHeaderList().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()))
|
script.append(metaSchema.getMetaDataName(header.getName()))
|
||||||
.append(" = ")
|
.append(" = ")
|
||||||
.append(SqlUtils.getSqlValue(newValue, header.getDataType()))
|
.append(value)
|
||||||
.append(" and ");
|
.append(" and ");
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
script.delete(script.length() - 4, script.length());
|
script.delete(script.length() - 4, script.length());
|
||||||
return script.toString();
|
return script.toString();
|
||||||
}
|
}
|
||||||
@ -276,20 +326,7 @@ public class DlTemplateServiceImpl implements DlTemplateService {
|
|||||||
.append(",");
|
.append(",");
|
||||||
}
|
}
|
||||||
script.deleteCharAt(script.length() - 1);
|
script.deleteCharAt(script.length() - 1);
|
||||||
script.append(" where ");
|
script.append(buildWhere(param.getHeaderList(), odlRow, metaSchema));
|
||||||
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());
|
|
||||||
return script.toString();
|
return script.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -35,7 +35,7 @@ public class MybatisGeneratorTest extends BaseTest {
|
|||||||
//doGenerator(Lists.newArrayList("operation_saved"));
|
//doGenerator(Lists.newArrayList("operation_saved"));
|
||||||
//doGenerator(Lists.newArrayList("environment","data_source","team","team_dbhub_user","data_source_access",
|
//doGenerator(Lists.newArrayList("environment","data_source","team","team_dbhub_user","data_source_access",
|
||||||
// "dbhub_user"));
|
// "dbhub_user"));
|
||||||
doGenerator(Lists.newArrayList("environment"));
|
doGenerator(Lists.newArrayList("table_cache_version","table_cache"));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void doGenerator(List<String> tableList) {
|
private void doGenerator(List<String> tableList) {
|
||||||
|
@ -63,10 +63,46 @@ public class RdbDmlController {
|
|||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
@RequestMapping(value = "/execute_update", method = {RequestMethod.POST, RequestMethod.PUT})
|
@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);
|
UpdateSelectResultParam param = rdbWebConverter.request2param(request);
|
||||||
return dlTemplateService.updateSelectResult(param);
|
return dlTemplateService.updateSelectResult(param);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -148,6 +148,23 @@ public class SQLExecutor {
|
|||||||
return execute(sql, connection, true, null, null);
|
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
|
* 执行sql
|
||||||
*
|
*
|
||||||
@ -316,7 +333,8 @@ public class SQLExecutor {
|
|||||||
* @param columnName
|
* @param columnName
|
||||||
* @return
|
* @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) {
|
String columnName) {
|
||||||
try (ResultSet resultSet = connection.getMetaData().getColumns(databaseName, schemaName, tableName,
|
try (ResultSet resultSet = connection.getMetaData().getColumns(databaseName, schemaName, tableName,
|
||||||
columnName)) {
|
columnName)) {
|
||||||
|
Reference in New Issue
Block a user