Commit 2852b697 by inrgihc

分页查询错误修正

parent c7e6d1d8
......@@ -85,7 +85,7 @@ public enum ProductTypeEnum {
}
).build()),
/**
* Microsoft SQL Server数据库类型(>=2012)
* Microsoft SQL Server数据库类型(>=2005)
*/
SQLSERVER(
ProductContext.builder()
......@@ -101,11 +101,11 @@ public enum ProductTypeEnum {
.sqlSchemaList("select schema_name from INFORMATION_SCHEMA.SCHEMATA")
.hasCatalogAndSchema(true)
.adapter(database -> Pair.of(null, database))
.pageSql("SELECT * FROM (%s) ALIAS OFFSET ? ROWS FETCH NEXT ? ROWS ONLY")
.pageSql(
"SELECT TOP <LIMIT> * FROM ( SELECT ROW_NUMBER() OVER(ORDER BY (SELECT 0)) AS ALIAS_ROW_NUM,PAGE_ALAS1.* FROM (%s) PAGE_ALAS1 ) PAGE_ALAS2 WHERE ALIAS_ROW_NUM > ? ")
.pageConsumer(
(page, size, parameters) -> {
parameters.add((page - 1) * size);
parameters.add(size);
}
).build()),
......@@ -516,8 +516,9 @@ public enum ProductTypeEnum {
return String.format("%s%s%s.%s%s%s", quote, schema, quote, quote, table, quote);
}
public String getPageSql(String sql) {
return String.format(context.getPageSql(), sql);
public String getPageSql(String sql, int page, int size) {
String pageSql = String.format(context.getPageSql(), sql);
return pageSql.replace("<LIMIT>", String.valueOf(size));
}
/**
......
......@@ -20,7 +20,6 @@ import com.zaxxer.hikari.HikariDataSource;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
......@@ -58,10 +57,6 @@ public class ApiExecuteService {
Object result = ApiExecutorEngineFactory
.getExecutor(config.getEngine(), dataSource, dsEntity.getType())
.execute(config.getContextList(), paramValues, config.getNamingStrategy());
if (result instanceof Collection) {
Collection r = (Collection) result;
return ResultEntity.success(config.getContextList().size() == 1 ? r.stream().findFirst().get() : r);
}
return ResultEntity.success(result);
} catch (Throwable t) {
return ResultEntity.failed(ResponseErrorCode.ERROR_INTERNAL_ERROR, ExceptionUtil.getMessage(t));
......
......@@ -39,7 +39,7 @@ public class SqlExecutorService extends AbstractExecutorEngine {
dataList.add(SqlJdbcUtils.execute(productType, connection, sqlMeta, strategy, page, size));
}
connection.commit();
return dataList;
return scripts.size() > 1 ? dataList : dataList.stream().findFirst().orElse(null);
} catch (Exception e) {
try {
connection.rollback();
......
......@@ -106,12 +106,12 @@ public class DbVarModule {
public List<Map<String, Object>> page(@Comment("sqlOrXml") String sqlOrXml)
throws SQLException {
log.info("Enter page() function, SQL:{},params:{}", sqlOrXml, params);
int page = PageSizeUtils.getPageFromParams(params);
int size = PageSizeUtils.getSizeFromParams(params);
SqlTemplate template = cfg.getTemplate(sqlOrXml);
SqlMeta sqlMeta = template.process(params);
String pageSql = productType.getPageSql(sqlMeta.getSql());
String pageSql = productType.getPageSql(sqlMeta.getSql(), page, size);
List<Object> parameters = sqlMeta.getParameter();
int page = PageSizeUtils.getPageFromParams(params);
int size = PageSizeUtils.getSizeFromParams(params);
this.productType.getPageConsumer().accept(page, size, parameters);
return build(jdbcTemplate.queryForList(pageSql, parameters.toArray()));
}
......
......@@ -18,7 +18,6 @@ import java.util.concurrent.CompletableFuture;
import javax.annotation.Resource;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
......@@ -42,11 +41,6 @@ public class AuthenticationFilter implements Filter {
private AccessRecordMapper accessRecordMapper;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
......
......@@ -119,7 +119,7 @@ public class ApiAssignmentService {
.collect(Collectors.toList());
}
public void debugExecute(ApiDebugExecuteRequest request, HttpServletResponse response) {
public void debugExecute(ApiDebugExecuteRequest request, HttpServletResponse response) throws IOException {
DataSourceEntity dataSourceEntity = dataSourceDao.getById(request.getDataSourceId());
if (null == dataSourceEntity) {
String message = "datasource[id=" + request.getDataSourceId() + " not exist!";
......@@ -163,25 +163,16 @@ public class ApiAssignmentService {
Object result = ApiExecutorEngineFactory
.getExecutor(request.getEngine(), dataSource, dataSourceEntity.getType())
.execute(scripts, params, request.getNamingStrategy());
if (result instanceof Collection) {
Collection r = (Collection) result;
result = scripts.size() == 1 ? r.stream().findFirst().get() : r;
}
entity = ResultEntity.success(result);
response.setStatus(HttpServletResponse.SC_OK);
} catch (Exception e) {
response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
entity = ResultEntity.failed(ResponseErrorCode.ERROR_INTERNAL_ERROR, ExceptionUtil.getMessage(e));
}
try {
response.setContentType(MediaType.APPLICATION_JSON_VALUE);
response.setCharacterEncoding(Charsets.UTF_8.name());
response.getWriter().append(JacksonUtils.toJsonStr(entity, request.getFormatMap().stream()
.collect(Collectors.toMap(DataTypeFormatMapValue::getKey, DataTypeFormatMapValue::getValue, (a, b) -> a))));
} catch (Exception e) {
throw new RuntimeException(e);
}
response.setStatus(HttpServletResponse.SC_OK);
response.setContentType(MediaType.APPLICATION_JSON_VALUE);
response.setCharacterEncoding(Charsets.UTF_8.name());
response.getWriter().append(JacksonUtils.toJsonStr(entity, request.getFormatMap().stream()
.collect(Collectors.toMap(DataTypeFormatMapValue::getKey, DataTypeFormatMapValue::getValue, (a, b) -> a))));
}
public Long createAssignment(ApiAssignmentSaveRequest request) {
......
......@@ -34,7 +34,7 @@ public class SqlJdbcUtils {
NamingStrategyEnum strategy, int page, int size) throws SQLException {
List<Object> paramValues = sqlMeta.getParameter();
boolean isQuerySql = isQuerySQL(sqlMeta.getSql());
String sql = isQuerySql ? productType.getPageSql(sqlMeta.getSql()) : sqlMeta.getSql();
String sql = isQuerySql ? productType.getPageSql(sqlMeta.getSql(), page, size) : sqlMeta.getSql();
PreparedStatement statement = connection.prepareStatement(sql);
statement.setQueryTimeout(QUERY_TIMEOUT);
statement.setFetchSize(isMySqlConnection(connection) ? Integer.MIN_VALUE : size);
......
......@@ -19,15 +19,38 @@
</dependencySet>
</dependencySets>
<fileSets>
<!-- 打包assembly中的bin目录到 打包目录/sbin 下 -->
<fileSet>
<directory>src/main/assembly/bin</directory>
<!-- 打包assembly中的bin目录到 打包目录/bin 下 -->
<files>
<file>
<source>src/main/assembly/bin/sqlrestctl.sh</source>
<outputDirectory>bin</outputDirectory>
<!-- lineEnding>unix</lineEnding -->
<lineEnding>unix</lineEnding>
<fileMode>0755</fileMode>
</fileSet>
</file>
<file>
<source>src/main/assembly/bin/manager_startup.cmd</source>
<outputDirectory>bin</outputDirectory>
<lineEnding>dos</lineEnding>
<fileMode>0755</fileMode>
</file>
<file>
<source>src/main/assembly/bin/gateway_startup.cmd</source>
<outputDirectory>bin</outputDirectory>
<lineEnding>dos</lineEnding>
<fileMode>0755</fileMode>
</file>
<file>
<source>src/main/assembly/bin/executor_startup.cmd</source>
<outputDirectory>bin</outputDirectory>
<lineEnding>dos</lineEnding>
<fileMode>0755</fileMode>
</file>
</files>
<fileSets>
<!-- 创建logs目录文件夹 -->
<fileSet>
......
......@@ -14,6 +14,7 @@ import com.gitee.sqlrest.core.dto.NameValueRemarkResponse;
import com.gitee.sqlrest.core.service.ApiAssignmentService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import java.io.IOException;
import java.util.Arrays;
import java.util.stream.Collectors;
import javax.annotation.Resource;
......@@ -83,7 +84,7 @@ public class ApiAssignmentController {
@ApiOperation(value = "调试API配置")
@PostMapping(value = "/debug", produces = MediaType.APPLICATION_JSON_VALUE)
public void debug(@RequestBody ApiDebugExecuteRequest request, HttpServletResponse response) {
public void debug(@RequestBody ApiDebugExecuteRequest request, HttpServletResponse response) throws IOException {
apiAssignmentService.debugExecute(request, response);
}
......
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