Commit efc7844d by inrgihc

增加脚本日志可展示

parent 87537983
package org.dromara.sqlrest.common.service;
public interface DisplayRecord {
String getDisplayText();
}
......@@ -18,12 +18,13 @@ import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.apache.ibatis.reflection.ArrayUtil;
import org.dromara.sqlrest.common.service.DisplayRecord;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ExecuteSqlRecord {
public class ExecuteSqlRecord implements DisplayRecord {
private String sql;
......@@ -56,6 +57,7 @@ public class ExecuteSqlRecord {
return value.toString();
}
@Override
public String getDisplayText() {
return "==> Preparing: " + sql.trim() + "\n"
+ "==> Parameters: " + getParameterValueString() + "\n"
......
// Copyright tang. All rights reserved.
// https://gitee.com/inrgihc/sqlrest
//
// Use of this source code is governed by a BSD-style license
//
// Author: tang (inrgihc@126.com)
// Date : 2024/3/31
// Location: beijing , china
/////////////////////////////////////////////////////////////
package org.dromara.sqlrest.core.dto;
import org.dromara.sqlrest.common.service.DisplayRecord;
public class ScripDebugRecord implements DisplayRecord {
private String text;
public ScripDebugRecord(String text) {
this.text = text;
}
@Override
public String getDisplayText() {
return text;
}
}
......@@ -26,8 +26,10 @@ import org.dromara.sqlrest.core.exec.annotation.Module;
import org.dromara.sqlrest.core.exec.engine.AbstractExecutorEngine;
import org.dromara.sqlrest.core.exec.module.CacheVarModule;
import org.dromara.sqlrest.core.exec.module.DbVarModule;
import org.dromara.sqlrest.core.exec.module.LogVarModule;
import org.dromara.sqlrest.core.exec.module.DsVarModule;
import org.dromara.sqlrest.core.exec.module.EnvVarModule;
import org.dromara.sqlrest.core.exec.module.HttpModule;
import org.dromara.sqlrest.core.exec.module.ReqVarModule;
import org.dromara.sqlrest.persistence.entity.ApiContextEntity;
......@@ -36,6 +38,8 @@ public class ScriptExecutorService extends AbstractExecutorEngine {
public static List<ScriptEditorCompletion> syntax = new ArrayList<>();
public static List<Class> modules = Arrays.asList(
EnvVarModule.class,
HttpModule.class,
LogVarModule.class,
DbVarModule.class,
DsVarModule.class,
ReqVarModule.class,
......
......@@ -12,25 +12,34 @@ package org.dromara.sqlrest.core.exec.logger;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.dromara.sqlrest.common.service.DisplayRecord;
import org.dromara.sqlrest.core.dto.ExecuteSqlRecord;
import org.dromara.sqlrest.core.dto.ScripDebugRecord;
public final class SqlExecuteLogger {
public final class DebugExecuteLogger {
private static final ThreadLocal<List<ExecuteSqlRecord>> threadLocal = new ThreadLocal<>();
private static final ThreadLocal<List<DisplayRecord>> threadLocal = new ThreadLocal<>();
public static void init() {
threadLocal.set(new ArrayList<>());
}
public static void add(String sql, List parameters, Long costs) {
List<ExecuteSqlRecord> list = threadLocal.get();
List<DisplayRecord> list = threadLocal.get();
if (null != list) {
list.add(new ExecuteSqlRecord(sql, parameters, costs));
}
}
public static List<ExecuteSqlRecord> get() {
List<ExecuteSqlRecord> list = threadLocal.get();
public static void add(String text) {
List<DisplayRecord> list = threadLocal.get();
if (null != list) {
list.add(new ScripDebugRecord(text));
}
}
public static List<DisplayRecord> get() {
List<DisplayRecord> list = threadLocal.get();
if (null == list) {
return Collections.emptyList();
}
......
......@@ -27,7 +27,7 @@ import org.dromara.sqlrest.common.enums.ProductTypeEnum;
import org.dromara.sqlrest.common.service.VarModuleInterface;
import org.dromara.sqlrest.core.exec.annotation.Comment;
import org.dromara.sqlrest.core.exec.annotation.Module;
import org.dromara.sqlrest.core.exec.logger.SqlExecuteLogger;
import org.dromara.sqlrest.core.exec.logger.DebugExecuteLogger;
import org.dromara.sqlrest.core.util.ConvertUtils;
import org.dromara.sqlrest.core.util.PageSizeUtils;
import org.dromara.sqlrest.core.util.PageSqlUtils;
......@@ -102,7 +102,7 @@ public class DbVarModule implements VarModuleInterface {
try {
return build(jdbcTemplate.queryForList(sqlMeta.getSql(), sqlMeta.getParameter().toArray()));
} finally {
SqlExecuteLogger.add(sqlMeta.getSql(), sqlMeta.getParameter(), System.currentTimeMillis() - start);
DebugExecuteLogger.add(sqlMeta.getSql(), sqlMeta.getParameter(), System.currentTimeMillis() - start);
}
}
......@@ -118,7 +118,7 @@ public class DbVarModule implements VarModuleInterface {
try {
return jdbcTemplate.queryForObject(countSql, Integer.class, sqlMeta.getParameter().toArray());
} finally {
SqlExecuteLogger.add(countSql, sqlMeta.getParameter(), System.currentTimeMillis() - start);
DebugExecuteLogger.add(countSql, sqlMeta.getParameter(), System.currentTimeMillis() - start);
}
}
......@@ -145,7 +145,7 @@ public class DbVarModule implements VarModuleInterface {
},
sqlMeta.getParameter().toArray()));
} finally {
SqlExecuteLogger.add(sqlMeta.getSql(), sqlMeta.getParameter(), System.currentTimeMillis() - start);
DebugExecuteLogger.add(sqlMeta.getSql(), sqlMeta.getParameter(), System.currentTimeMillis() - start);
}
}
......@@ -166,7 +166,7 @@ public class DbVarModule implements VarModuleInterface {
try {
return build(jdbcTemplate.queryForList(pageSql, parameters.toArray()));
} finally {
SqlExecuteLogger.add(pageSql, parameters, System.currentTimeMillis() - start);
DebugExecuteLogger.add(pageSql, parameters, System.currentTimeMillis() - start);
}
}
......@@ -190,7 +190,7 @@ public class DbVarModule implements VarModuleInterface {
keyHolder);
return build(keyHolder.getKeys());
} finally {
SqlExecuteLogger.add(sqlMeta.getSql(), parameters, System.currentTimeMillis() - start);
DebugExecuteLogger.add(sqlMeta.getSql(), parameters, System.currentTimeMillis() - start);
}
}
......@@ -206,7 +206,7 @@ public class DbVarModule implements VarModuleInterface {
try {
return jdbcTemplate.update(sqlMeta.getSql(), parameters.toArray());
} finally {
SqlExecuteLogger.add(sqlMeta.getSql(), parameters, System.currentTimeMillis() - start);
DebugExecuteLogger.add(sqlMeta.getSql(), parameters, System.currentTimeMillis() - start);
}
}
......@@ -219,7 +219,7 @@ public class DbVarModule implements VarModuleInterface {
try {
return Arrays.stream(jdbcTemplate.batchUpdate(sqlList.toArray(new String[0]))).sum();
} finally {
SqlExecuteLogger.add(sqlList.stream().collect(Collectors.joining(";")),
DebugExecuteLogger.add(sqlList.stream().collect(Collectors.joining(";")),
Collections.emptyList(), System.currentTimeMillis() - start);
}
}
......@@ -236,7 +236,7 @@ public class DbVarModule implements VarModuleInterface {
try {
return jdbcTemplate.update(sqlMeta.getSql(), parameters.toArray());
} finally {
SqlExecuteLogger.add(sqlMeta.getSql(), parameters, System.currentTimeMillis() - start);
DebugExecuteLogger.add(sqlMeta.getSql(), parameters, System.currentTimeMillis() - start);
}
}
}
......
// Copyright tang. All rights reserved.
// https://gitee.com/inrgihc/sqlrest
//
// Use of this source code is governed by a BSD-style license
//
// Author: tang (inrgihc@126.com)
// Date : 2024/3/31
// Location: beijing , china
/////////////////////////////////////////////////////////////
package org.dromara.sqlrest.core.exec.module;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
import lombok.NoArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.dromara.sqlrest.common.service.VarModuleInterface;
import org.dromara.sqlrest.core.exec.annotation.Comment;
import org.dromara.sqlrest.core.exec.annotation.Module;
import org.dromara.sqlrest.core.executor.AlarmHttpRequestFactory;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;
@Service
@NoArgsConstructor
@Module(HttpModule.VAR_NAME)
public class HttpModule implements VarModuleInterface {
protected static final String VAR_NAME = "http";
protected static final RestTemplate template = new RestTemplate(new AlarmHttpRequestFactory());
private HttpHeaders httpHeaders = new HttpHeaders();
private Class<?> responseType = Object.class;
private MultiValueMap<String, Object> params = new LinkedMultiValueMap<>();
private MultiValueMap<String, Object> data = new LinkedMultiValueMap<>();
private Map<String, ?> variables = new HashMap<>();
private String url;
private HttpMethod method = HttpMethod.GET;
private HttpEntity<Object> entity = null;
private Object requestBody;
public HttpModule(String url) {
this.url = url;
}
@Override
public String getVarModuleName() {
return VAR_NAME;
}
@Comment("创建连接")
public HttpModule connect(@Comment("目标URL") String url) {
return new HttpModule(url);
}
@Comment("设置URL参数")
public HttpModule param(@Comment("参数名") String key, @Comment("参数值") Object... values) {
if (values != null) {
for (Object value : values) {
this.params.add(key, value);
}
}
return this;
}
@Comment("批量设置URL参数")
public HttpModule param(@Comment("参数值") Map<String, Object> values) {
values.forEach((key, value) -> param(key, Objects.toString(value, "")));
return this;
}
@Comment("设置form参数")
public HttpModule data(@Comment("参数名") String key, @Comment("参数值") Object... values) {
if (values != null) {
for (Object value : values) {
this.data.add(key, value);
}
}
return this;
}
@Comment("批量设置form参数")
public HttpModule data(@Comment("参数值") Map<String, Object> values) {
values.forEach((key, value) -> data(key, Objects.toString(value, "")));
return this;
}
@Comment("设置header")
public HttpModule header(@Comment("header键") String key, @Comment("header值") String value) {
httpHeaders.add(key, value);
return this;
}
@Comment("批量设置header")
public HttpModule header(@Comment("header值") Map<String, Object> values) {
values.entrySet()
.stream()
.filter(it -> it.getValue() != null)
.forEach(entry -> header(entry.getKey(), entry.getValue().toString()));
return this;
}
@Comment("设置请求方法,默认GET")
public HttpModule method(@Comment("请求方法") HttpMethod method) {
this.method = method;
return this;
}
@Comment("设置`RequestBody`")
public HttpModule body(@Comment("body值") Object requestBody) {
this.requestBody = requestBody;
this.contentType(MediaType.APPLICATION_JSON);
return this;
}
@Comment("设置`ContentType`")
public HttpModule contentType(@Comment("Content-Type值") String contentType) {
return contentType(MediaType.parseMediaType(contentType));
}
@Comment("设置`ContentType`")
public HttpModule contentType(@Comment("Content-Type值") MediaType mediaType) {
this.httpHeaders.setContentType(mediaType);
return this;
}
@Comment("设置返回值为`byte[]`")
public HttpModule expectBytes() {
this.responseType = byte[].class;
return this;
}
@Comment("设置返回值为`String`")
public HttpModule expectString() {
this.responseType = String.class;
return this;
}
@Comment("发送`GET`请求")
public ResponseEntity<?> get() {
this.method(HttpMethod.GET);
return this.execute();
}
@Comment("发送`POST`请求")
public ResponseEntity<?> post() {
this.method(HttpMethod.POST);
return this.execute();
}
@Comment("发送`PUT`请求")
public ResponseEntity<?> put() {
this.method(HttpMethod.PUT);
return this.execute();
}
@Comment("发送`DELETE`请求")
public ResponseEntity<?> delete() {
this.method(HttpMethod.DELETE);
return this.execute();
}
@Comment("执行请求")
public ResponseEntity<?> execute() {
if (!this.params.isEmpty()) {
String queryString = this.params.entrySet().stream()
.map(it -> it.getValue().stream()
.map(value -> it.getKey() + "=" + value)
.collect(Collectors.joining("&"))
).collect(Collectors.joining("&"));
if (StringUtils.isNotBlank(queryString)) {
this.url += (this.url.contains("?") ? "&" : "?") + queryString;
}
}
if (!this.data.isEmpty()) {
this.entity = new HttpEntity<>(this.data, this.httpHeaders);
} else if (this.entity == null && this.requestBody != null) {
this.entity = new HttpEntity<>(this.requestBody, this.httpHeaders);
} else {
this.entity = new HttpEntity<>(null, this.httpHeaders);
}
return template.exchange(url, this.method, entity, responseType, variables);
}
}
\ No newline at end of file
// Copyright tang. All rights reserved.
// https://gitee.com/inrgihc/sqlrest
//
// Use of this source code is governed by a BSD-style license
//
// Author: tang (inrgihc@126.com)
// Date : 2024/3/31
// Location: beijing , china
/////////////////////////////////////////////////////////////
package org.dromara.sqlrest.core.exec.module;
import java.text.MessageFormat;
import lombok.NoArgsConstructor;
import org.dromara.sqlrest.common.service.VarModuleInterface;
import org.dromara.sqlrest.core.exec.annotation.Comment;
import org.dromara.sqlrest.core.exec.annotation.Module;
import org.dromara.sqlrest.core.exec.logger.DebugExecuteLogger;
import org.springframework.stereotype.Service;
@Service
@NoArgsConstructor
@Module(LogVarModule.VAR_NAME)
public class LogVarModule implements VarModuleInterface {
protected static final String VAR_NAME = "log";
@Override
public String getVarModuleName() {
return VAR_NAME;
}
@Comment("打印调试日志信息")
public void print(@Comment("message") String message, Object... arguments) {
DebugExecuteLogger.add(MessageFormat.format(message, arguments));
}
}
......@@ -25,6 +25,7 @@ import org.dromara.sqlrest.common.enums.ParamLocationEnum;
import org.dromara.sqlrest.common.enums.ParamTypeEnum;
import org.dromara.sqlrest.common.exception.CommonException;
import org.dromara.sqlrest.common.exception.ResponseErrorCode;
import org.dromara.sqlrest.common.service.DisplayRecord;
import org.dromara.sqlrest.core.driver.DriverLoadService;
import org.dromara.sqlrest.core.dto.ApiAssignmentBaseResponse;
import org.dromara.sqlrest.core.dto.ApiAssignmentDetailResponse;
......@@ -32,10 +33,9 @@ import org.dromara.sqlrest.core.dto.ApiAssignmentSaveRequest;
import org.dromara.sqlrest.core.dto.ApiDebugExecuteRequest;
import org.dromara.sqlrest.core.dto.AssignmentSearchRequest;
import org.dromara.sqlrest.core.dto.DataTypeFormatMapValue;
import org.dromara.sqlrest.core.dto.ExecuteSqlRecord;
import org.dromara.sqlrest.core.dto.ScriptEditorCompletion;
import org.dromara.sqlrest.core.dto.SqlParamParseResponse;
import org.dromara.sqlrest.core.exec.logger.SqlExecuteLogger;
import org.dromara.sqlrest.core.exec.logger.DebugExecuteLogger;
import org.dromara.sqlrest.core.exec.annotation.Comment;
import org.dromara.sqlrest.core.exec.engine.ApiExecutorEngineFactory;
import org.dromara.sqlrest.core.exec.engine.impl.ScriptExecutorService;
......@@ -321,15 +321,15 @@ public class ApiAssignmentService {
ResultEntity entity;
try {
SqlExecuteLogger.init();
DebugExecuteLogger.init();
HikariDataSource dataSource = DataSourceUtils.getHikariDataSource(dataSourceEntity, driverPath.getAbsolutePath());
List<Object> results = ApiExecutorEngineFactory
.getExecutor(request.getEngine(), dataSource, dataSourceEntity.getType(), true)
.execute(scripts, params, request.getNamingStrategy());
Object answer = results.size() > 1 ? results : (1 == results.size()) ? results.get(0) : null;
List<OutParam> types = JacksonUtils.parseFiledTypesAndFillNullAsString(results);
String logs = Optional.ofNullable(SqlExecuteLogger.get())
.orElseGet(ArrayList::new).stream().map(ExecuteSqlRecord::getDisplayText)
String logs = Optional.ofNullable(DebugExecuteLogger.get())
.orElseGet(ArrayList::new).stream().map(DisplayRecord::getDisplayText)
.collect(Collectors.toList()).stream().collect(Collectors.joining("\n\n"));
Map<String, Object> respMap = new HashMap<>(4);
respMap.put("answer", answer);
......@@ -340,7 +340,7 @@ public class ApiAssignmentService {
log.warn("Failed to debug for error:{}", e.getMessage(), e);
entity = ResultEntity.failed(ExceptionUtil.getMessage(e));
} finally {
SqlExecuteLogger.clear();
DebugExecuteLogger.clear();
}
response.setStatus(HttpServletResponse.SC_OK);
......
......@@ -25,7 +25,7 @@ import lombok.extern.slf4j.Slf4j;
import org.dromara.sqlrest.common.enums.NamingStrategyEnum;
import org.dromara.sqlrest.common.enums.ProductTypeEnum;
import org.dromara.sqlrest.common.util.LambdaUtils;
import org.dromara.sqlrest.core.exec.logger.SqlExecuteLogger;
import org.dromara.sqlrest.core.exec.logger.DebugExecuteLogger;
import org.dromara.sqlrest.template.SqlMeta;
@Slf4j
......@@ -89,7 +89,7 @@ public class SqlJdbcUtils {
return "(" + updateCount + ") rows affected";
}
} finally {
SqlExecuteLogger.add(sql, paramValues, System.currentTimeMillis() - start);
DebugExecuteLogger.add(sql, paramValues, System.currentTimeMillis() - start);
}
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment