提交 06228613 authored 作者: mry's avatar mry

feat(web): 添加了执行器中运行sql部分

上级 91b5bc97
...@@ -298,6 +298,37 @@ public class SqlExpActuator implements Actuator { ...@@ -298,6 +298,37 @@ public class SqlExpActuator implements Actuator {
return resultMap; return resultMap;
} }
/**
* 递归的运行一段SQL语句,可以解析出其中的环境变量(#{id}),动态变量(${id})
*
* @param projectId 用于确定寻找哪些动态变量的id
* @param envId 用于确定使用的环境变量池的id,如果envId = null,则代表无需替换环境变量
* @return 运行SQL后取完数值的结果, 是一张数据表, 以LIST<MAP>的形式呈现
*/
@SuppressWarnings("DuplicatedCode")
public List<Map<String, Object>> runActuatorSqlRec(String sqlExp, Long projectId, Long envId) {
// 替换环境表达式
if (envId!=null && envId > 0){
sqlExp = envActuator.replaceEnvVar(sqlExp, envId);
}
List<SqlRegularObject> dynamicVarList = findDynamicVarList(sqlExp);
// 解析SQL表达式,判断是可以直接执行的SQL还是需要再递归解析动态变量
if (!isEmpty(dynamicVarList)) {
// 如果还存在动态变量,则继续递归解析
for (SqlRegularObject sqlRegular : dynamicVarList) {
DynamicVariable recVar = varService.getByName(sqlRegular.getVarName(), projectId)
.map(DynamicVariable::parseSqlDetail)
.orElseThrow(() -> new GlobalException(
String.format("没有找到项目id = %d 下,name = %s的变量", projectId, sqlRegular.getVarName())));
String calculatedValue = parseVar(envId, sqlRegular.getIndex(), projectId, recVar);
LogQueueRuntime.addNewLog(this.getClass(), SQL_ACTUATOR, String.format("正在进行SQL变量计算 变量名: %s 计算后的替换值: %s", sqlRegular.getVarName(), calculatedValue));
sqlExp = sqlExp.replaceAll(String.format(REPLACE_VAR_EXP, sqlRegular.getVarName()), calculatedValue);
}
}
List<Map<String, Object>> resultMap = jdbcTemplate.queryForList(sqlExp);
return resultMap;
}
/** /**
* 直接执行一段SQL,该SQL表达式必须要是可以直接执行的语句 * 直接执行一段SQL,该SQL表达式必须要是可以直接执行的语句
* *
......
...@@ -9,12 +9,14 @@ import org.matrix.autotest.entity.GrammarTable; ...@@ -9,12 +9,14 @@ import org.matrix.autotest.entity.GrammarTable;
import org.matrix.autotest.entity.runSqlQuery; import org.matrix.autotest.entity.runSqlQuery;
import org.matrix.database.service.IConnectService; import org.matrix.database.service.IConnectService;
import org.matrix.exception.GlobalException; import org.matrix.exception.GlobalException;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import java.util.*; import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
/** /**
* SqlController. * SqlController.
...@@ -29,18 +31,6 @@ import java.util.*; ...@@ -29,18 +31,6 @@ import java.util.*;
@RequestMapping("/db") @RequestMapping("/db")
public class SqlController { public class SqlController {
@Value("${spring.datasource.dynamic.datasource.master.driverClassName}")
private String driver;
@Value("${spring.datasource.dynamic.datasource.master.url}")
private String url;
@Value("${spring.datasource.dynamic.datasource.master.username}")
private String username;
@Value("${spring.datasource.dynamic.datasource.master.password}")
private String password;
private final JdbcTemplate jdbcTemplate; private final JdbcTemplate jdbcTemplate;
private final IDataSourceService dataSourceService; private final IDataSourceService dataSourceService;
private final SqlExpActuator sqlActuator; private final SqlExpActuator sqlActuator;
...@@ -68,6 +58,13 @@ public class SqlController { ...@@ -68,6 +58,13 @@ public class SqlController {
return ResponseEntity.ok(results); return ResponseEntity.ok(results);
} }
@PostMapping("/actuatorRunSql")
@ApiOperation("递归地运行执行器中的sql")
public ResponseEntity<List<Map<String, Object>>> runActuatorSql(@RequestBody runSqlQuery sqlQuery) {
List<Map<String, Object>> results = sqlActuator.runActuatorSqlRec(sqlQuery.getSql(), sqlQuery.getProjectId(), sqlQuery.getEnvId());
return ResponseEntity.ok(results);
}
/** /**
* 运行一段SQL,要确定可以连接的数据源(用于连接的数据源)环境(用于寻找环境变量)项目id(用于确定需要递归解析的动态变量) * 运行一段SQL,要确定可以连接的数据源(用于连接的数据源)环境(用于寻找环境变量)项目id(用于确定需要递归解析的动态变量)
* *
...@@ -119,16 +116,7 @@ public class SqlController { ...@@ -119,16 +116,7 @@ public class SqlController {
@ApiOperation("获得用例表kt_test_case的语法提示") @ApiOperation("获得用例表kt_test_case的语法提示")
public ResponseEntity<List<GrammarTable>> getDBActuator() { public ResponseEntity<List<GrammarTable>> getDBActuator() {
String tableSql = "SELECT a.table_name tableName,a.table_comment tableDes,b.COLUMN_NAME fieldName,b.column_comment fieldDes,b.column_type fieldType FROM information_schema. TABLES a LEFT JOIN information_schema. COLUMNS b ON a.table_name = b.TABLE_NAME WHERE a.table_name = 'kt_test_case' AND a.table_schema = 'key_stone' ORDER BY a.table_name"; String tableSql = "SELECT a.table_name tableName,a.table_comment tableDes,b.COLUMN_NAME fieldName,b.column_comment fieldDes,b.column_type fieldType FROM information_schema. TABLES a LEFT JOIN information_schema. COLUMNS b ON a.table_name = b.TABLE_NAME WHERE a.table_name = 'kt_test_case' AND a.table_schema = 'key_stone' ORDER BY a.table_name";
DataSourceDTO dataSourceDTO = new DataSourceDTO();
dataSourceDTO.setPoolName("key_stone");
dataSourceDTO.setUsername(username);
dataSourceDTO.setPassword(password);
dataSourceDTO.setUrl(url);
dataSourceDTO.setDriverClassName(driver);
Set<String> dataSources = dataSourceService.switchDataSource(dataSourceDTO);
log.info("当前使用的的数据源 {}", dataSourceService.peek());
List<GrammarTable> grammarTables = new GrammarTable().trans2Table(jdbcTemplate.queryForList(tableSql)); List<GrammarTable> grammarTables = new GrammarTable().trans2Table(jdbcTemplate.queryForList(tableSql));
dataSourceService.switchMainDataSource();
return ResponseEntity.ok(grammarTables); return ResponseEntity.ok(grammarTables);
} }
} }
...@@ -10,9 +10,9 @@ spring: ...@@ -10,9 +10,9 @@ spring:
datasource: datasource:
master: #增加默认数据源 master: #增加默认数据源
driverClassName: com.mysql.cj.jdbc.Driver driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.100.248:3306/key_stone?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC url: jdbc:mysql://192.168.100.247:3306/key_stone?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC
username: root username: root
password: root password: 123456
zentao: zentao:
driverClassName: com.mysql.cj.jdbc.Driver driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.100.247:3306/zentao?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC&&zeroDateTimeBehavior=convertToNull url: jdbc:mysql://192.168.100.247:3306/zentao?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC&&zeroDateTimeBehavior=convertToNull
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论