Commit 2852b697 by inrgihc

分页查询错误修正

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