forked from p81075629/datagear
SQL工作台:查询结果添加加载更多数据、刷新功能
This commit is contained in:
parent
f3e43af8bc
commit
56506dcefa
|
@ -11,6 +11,9 @@ import javax.servlet.http.HttpServletRequest;
|
|||
import javax.servlet.http.HttpServletResponse;
|
||||
|
||||
import org.datagear.connection.ConnectionSource;
|
||||
import org.datagear.dbmodel.DatabaseModelResolver;
|
||||
import org.datagear.dbmodel.ModelSqlSelectService;
|
||||
import org.datagear.dbmodel.ModelSqlSelectService.ModelSqlResult;
|
||||
import org.datagear.management.domain.Schema;
|
||||
import org.datagear.management.service.SchemaService;
|
||||
import org.datagear.persistence.support.UUID;
|
||||
|
@ -43,6 +46,14 @@ import org.springframework.web.bind.annotation.ResponseBody;
|
|||
@RequestMapping("/sqlpad")
|
||||
public class SqlpadController extends AbstractSchemaConnController
|
||||
{
|
||||
public static final int DEFAULT_SQL_RESULTSET_FETCH_SIZE = 20;
|
||||
|
||||
@Autowired
|
||||
private ModelSqlSelectService modelSqlSelectService;
|
||||
|
||||
@Autowired
|
||||
private DatabaseModelResolver databaseModelResolver;
|
||||
|
||||
@Autowired
|
||||
private SqlpadExecutionService sqlpadExecutionService;
|
||||
|
||||
|
@ -52,10 +63,33 @@ public class SqlpadController extends AbstractSchemaConnController
|
|||
}
|
||||
|
||||
public SqlpadController(MessageSource messageSource, ClassDataConverter classDataConverter,
|
||||
SchemaService schemaService, ConnectionSource connectionSource,
|
||||
SqlpadExecutionService sqlpadExecutionService)
|
||||
SchemaService schemaService, ConnectionSource connectionSource, ModelSqlSelectService modelSqlSelectService,
|
||||
DatabaseModelResolver databaseModelResolver, SqlpadExecutionService sqlpadExecutionService)
|
||||
{
|
||||
super(messageSource, classDataConverter, schemaService, connectionSource);
|
||||
this.modelSqlSelectService = modelSqlSelectService;
|
||||
this.databaseModelResolver = databaseModelResolver;
|
||||
this.sqlpadExecutionService = sqlpadExecutionService;
|
||||
}
|
||||
|
||||
public ModelSqlSelectService getModelSqlSelectService()
|
||||
{
|
||||
return modelSqlSelectService;
|
||||
}
|
||||
|
||||
public void setModelSqlSelectService(ModelSqlSelectService modelSqlSelectService)
|
||||
{
|
||||
this.modelSqlSelectService = modelSqlSelectService;
|
||||
}
|
||||
|
||||
public DatabaseModelResolver getDatabaseModelResolver()
|
||||
{
|
||||
return databaseModelResolver;
|
||||
}
|
||||
|
||||
public void setDatabaseModelResolver(DatabaseModelResolver databaseModelResolver)
|
||||
{
|
||||
this.databaseModelResolver = databaseModelResolver;
|
||||
}
|
||||
|
||||
public SqlpadExecutionService getSqlpadExecutionService()
|
||||
|
@ -99,7 +133,8 @@ public class SqlpadController extends AbstractSchemaConnController
|
|||
@RequestParam(value = "sqlStartColumn", required = false) Integer sqlStartColumn,
|
||||
@RequestParam(value = "commitMode", required = false) CommitMode commitMode,
|
||||
@RequestParam(value = "exceptionHandleMode", required = false) ExceptionHandleMode exceptionHandleMode,
|
||||
@RequestParam(value = "overTimeThreashold", required = false) Integer overTimeThreashold) throws Throwable
|
||||
@RequestParam(value = "overTimeThreashold", required = false) Integer overTimeThreashold,
|
||||
@RequestParam(value = "resultsetFetchSize", required = false) Integer resultsetFetchSize) throws Throwable
|
||||
{
|
||||
Schema schema = getSchemaNotNull(request, response, schemaId);
|
||||
|
||||
|
@ -122,10 +157,13 @@ public class SqlpadController extends AbstractSchemaConnController
|
|||
else if (overTimeThreashold > 60)
|
||||
overTimeThreashold = 60;
|
||||
|
||||
if (resultsetFetchSize == null)
|
||||
resultsetFetchSize = DEFAULT_SQL_RESULTSET_FETCH_SIZE;
|
||||
|
||||
List<SqlStatement> sqlStatements = sqlScriptParser.parse();
|
||||
|
||||
this.sqlpadExecutionService.submit(sqlpadId, schema, sqlStatements, commitMode, exceptionHandleMode,
|
||||
overTimeThreashold, WebUtils.getLocale(request));
|
||||
overTimeThreashold, resultsetFetchSize, WebUtils.getLocale(request));
|
||||
|
||||
return buildOperationMessageSuccessEmptyResponseEntity();
|
||||
}
|
||||
|
@ -141,6 +179,50 @@ public class SqlpadController extends AbstractSchemaConnController
|
|||
return buildOperationMessageSuccessEmptyResponseEntity();
|
||||
}
|
||||
|
||||
@RequestMapping(value = "/{schemaId}/select", produces = CONTENT_TYPE_JSON)
|
||||
@ResponseBody
|
||||
public ModelSqlResult select(HttpServletRequest request, HttpServletResponse response,
|
||||
org.springframework.ui.Model springModel, @PathVariable("schemaId") String schemaId,
|
||||
@RequestParam("sqlpadId") String sqlpadId, @RequestParam("sql") final String sql,
|
||||
@RequestParam(value = "startRow", required = false) Integer startRow,
|
||||
@RequestParam(value = "fetchSize", required = false) Integer fetchSize,
|
||||
@RequestParam(value = "returnModel", required = false) Boolean returnModel) throws Throwable
|
||||
{
|
||||
if (startRow == null)
|
||||
startRow = 1;
|
||||
if (fetchSize == null)
|
||||
fetchSize = DEFAULT_SQL_RESULTSET_FETCH_SIZE;
|
||||
if (returnModel == null)
|
||||
returnModel = false;
|
||||
|
||||
if (fetchSize < 1)
|
||||
fetchSize = 1;
|
||||
if (fetchSize > 1000)
|
||||
fetchSize = 1000;
|
||||
|
||||
final int startRowFinal = startRow;
|
||||
final int fetchSizeFinal = fetchSize;
|
||||
|
||||
ModelSqlResult modelSqlResult = new ReturnSchemaConnExecutor<ModelSqlResult>(request, response, springModel,
|
||||
schemaId, true)
|
||||
{
|
||||
@Override
|
||||
protected ModelSqlResult execute(HttpServletRequest request, HttpServletResponse response,
|
||||
Model springModel, Schema schema) throws Throwable
|
||||
{
|
||||
ModelSqlResult modelSqlResult = modelSqlSelectService.select(getConnection(), sql, startRowFinal,
|
||||
fetchSizeFinal, databaseModelResolver);
|
||||
|
||||
return modelSqlResult;
|
||||
}
|
||||
}.execute();
|
||||
|
||||
if (!Boolean.TRUE.equals(returnModel))
|
||||
modelSqlResult.setModel(null);
|
||||
|
||||
return modelSqlResult;
|
||||
}
|
||||
|
||||
protected String generateSqlpadId(HttpServletRequest request, HttpServletResponse response)
|
||||
{
|
||||
return UUID.gen();
|
||||
|
|
|
@ -128,16 +128,18 @@ public class SqlpadExecutionService
|
|||
* @param commitMode
|
||||
* @param exceptionHandleMode
|
||||
* @param overTimeThreashold
|
||||
* @param resultsetFetchSize
|
||||
* @param locale
|
||||
* @return
|
||||
*/
|
||||
public boolean submit(String sqlpadId, Schema schema, List<SqlStatement> sqlStatements, CommitMode commitMode,
|
||||
ExceptionHandleMode exceptionHandleMode, int overTimeThreashold, Locale locale)
|
||||
ExceptionHandleMode exceptionHandleMode, int overTimeThreashold, int resultsetFetchSize, Locale locale)
|
||||
{
|
||||
String sqlpadChannelId = getSqlpadChannelId(sqlpadId);
|
||||
|
||||
SqlpadExecutionRunnable sqlpadExecutionRunnable = new SqlpadExecutionRunnable(schema, sqlpadId, sqlpadChannelId,
|
||||
sqlpadCometdService, sqlStatements, commitMode, exceptionHandleMode, overTimeThreashold, locale);
|
||||
sqlpadCometdService, sqlStatements, commitMode, exceptionHandleMode, overTimeThreashold,
|
||||
resultsetFetchSize, locale);
|
||||
|
||||
SqlpadExecutionRunnable old = this._sqlpadExecutionRunnableMap.putIfAbsent(sqlpadId, sqlpadExecutionRunnable);
|
||||
|
||||
|
@ -265,6 +267,9 @@ public class SqlpadExecutionService
|
|||
/** 超时分钟数 */
|
||||
private int overTimeThreashold;
|
||||
|
||||
/** 结果集页大小 */
|
||||
private int resultsetFetchSize;
|
||||
|
||||
private Locale locale;
|
||||
|
||||
/** 发送给此Runnable的SQL命令 */
|
||||
|
@ -279,7 +284,7 @@ public class SqlpadExecutionService
|
|||
|
||||
public SqlpadExecutionRunnable(Schema schema, String sqlpadId, String sqlpadChannelId,
|
||||
SqlpadCometdService sqlpadCometdService, List<SqlStatement> sqlStatements, CommitMode commitMode,
|
||||
ExceptionHandleMode exceptionHandleMode, int overTimeThreashold, Locale locale)
|
||||
ExceptionHandleMode exceptionHandleMode, int overTimeThreashold, int resultsetFetchSize, Locale locale)
|
||||
{
|
||||
super();
|
||||
this.schema = schema;
|
||||
|
@ -290,6 +295,7 @@ public class SqlpadExecutionService
|
|||
this.commitMode = commitMode;
|
||||
this.exceptionHandleMode = exceptionHandleMode;
|
||||
this.overTimeThreashold = overTimeThreashold;
|
||||
this.resultsetFetchSize = resultsetFetchSize;
|
||||
this.locale = locale;
|
||||
}
|
||||
|
||||
|
@ -373,6 +379,16 @@ public class SqlpadExecutionService
|
|||
this.overTimeThreashold = overTimeThreashold;
|
||||
}
|
||||
|
||||
public int getResultsetFetchSize()
|
||||
{
|
||||
return resultsetFetchSize;
|
||||
}
|
||||
|
||||
public void setResultsetFetchSize(int resultsetFetchSize)
|
||||
{
|
||||
this.resultsetFetchSize = resultsetFetchSize;
|
||||
}
|
||||
|
||||
public Locale getLocale()
|
||||
{
|
||||
return locale;
|
||||
|
@ -663,7 +679,7 @@ public class SqlpadExecutionService
|
|||
Model model = SqlpadExecutionService.this.databaseModelResolver.resolve(cn, rs, UUID.gen());
|
||||
|
||||
ModelSqlResult modelSqlResult = SqlpadExecutionService.this.modelSqlSelectService.select(cn,
|
||||
sqlStatement.getSql(), rs, model, 1, 20);
|
||||
sqlStatement.getSql(), rs, model, 1, this.resultsetFetchSize);
|
||||
modelSqlResult.setSql(null);
|
||||
|
||||
this.sqlpadCometdService.sendSqlSuccessMessage(this._sqlpadServerChannel, sqlStatement,
|
||||
|
@ -686,14 +702,6 @@ public class SqlpadExecutionService
|
|||
sqlStatementIndex);
|
||||
}
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
Thread.sleep(500);
|
||||
}
|
||||
catch (InterruptedException e)
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -332,8 +332,14 @@
|
|||
<bean id="changelogResolver" class="org.datagear.web.util.ChangelogResolver" />
|
||||
|
||||
<!-- cometd配置开始 -->
|
||||
<bean id="bayeuxJsonContext" class="org.cometd.server.JacksonJSONContextServer" />
|
||||
|
||||
<bean id="bayeuxJsonContext" class="org.cometd.server.JacksonJSONContextServer" />
|
||||
<!--
|
||||
<bean id="bayeuxJsonContext" class="org.datagear.web.sqlpad.FastjsonJSONContextServer">
|
||||
<property name="serializeConfig" ref="serializeConfig" />
|
||||
<property name="serializerFeatures" ref="serializerFeatures" />
|
||||
</bean>
|
||||
-->
|
||||
<bean id="bayeuxServerFactory" class="org.datagear.web.util.BayeuxServerFactory">
|
||||
<property name="options">
|
||||
<map>
|
||||
|
@ -362,6 +368,8 @@
|
|||
</bean>
|
||||
<!-- cometd配置结束 -->
|
||||
|
||||
<bean id="modelSqlSelectService" class="org.datagear.dbmodel.ModelSqlSelectService" />
|
||||
|
||||
<bean id="sqlpadCometdService" class="org.datagear.web.sqlpad.SqlpadCometdService">
|
||||
<constructor-arg><ref local="bayeuxServer" /></constructor-arg>
|
||||
</bean>
|
||||
|
@ -371,6 +379,7 @@
|
|||
<property name="messageSource" ref="messageSource" />
|
||||
<property name="sqlpadCometdService" ref="sqlpadCometdService" />
|
||||
<property name="databaseModelResolver" ref="databaseModelResolver" />
|
||||
<property name="modelSqlSelectService" ref="modelSqlSelectService" />
|
||||
</bean>
|
||||
|
||||
<!-- 定时任务开始 -->
|
||||
|
|
|
@ -57,6 +57,7 @@ editGrid=\u7F16\u8F91\u8868\u683C
|
|||
restore=\u6062\u590D
|
||||
restoreAll=\u6062\u590D\u5168\u90E8
|
||||
execute=\u6267\u884C
|
||||
rowNumber=\u884C\u53F7
|
||||
|
||||
dataTables.noData=\u6CA1\u6709\u6570\u636E
|
||||
dataTables.zeroRecords=\u6CA1\u6709\u7ED3\u679C
|
||||
|
@ -362,9 +363,14 @@ sqlpad.overTimeThreashold=\u8D85\u65F6\u8BBE\u7F6E
|
|||
sqlpad.overTimeThreashold.unit=\u5206\u949F
|
||||
sqlpad.overTimeThreashold.desc=\u6682\u505C\u3001\u7B49\u5F85\u63D0\u4EA4/\u56DE\u6EDA\u7684\u8D85\u65F6\u65F6\u95F4
|
||||
sqlpad.overTimeThreashold.validation=\u4EC5\u53EF\u586B\u5199[1-60]
|
||||
sqlpad.resultsetFetchSize=\u67E5\u8BE2\u7ED3\u679C\u9875\u5927\u5C0F
|
||||
sqlpad.resultsetFetchSize.desc=\u67E5\u8BE2\u7ED3\u679C\u6BCF\u6B21\u52A0\u8F7D\u7684\u8BB0\u5F55\u6570
|
||||
sqlpad.resultsetFetchSize.validation=\u4EC5\u53EF\u586B\u5199[1-1000]
|
||||
sqlpad.executionStart=\u5F00\u59CB\u6267\u884C\uFF08SQL\u603B\u8BA1{0}\u6761\uFF09
|
||||
sqlpad.executeionFinish=\u5B8C\u6210\u6267\u884C
|
||||
sqlpad.clearSqlResult=\u6E05\u9664\u6267\u884C\u65E5\u5FD7
|
||||
sqlpad.clearSqlResultMessage=\u6E05\u9664\u6267\u884C\u65E5\u5FD7
|
||||
sqlpad.loadMoreData=\u52A0\u8F7D\u66F4\u591A\u6570\u636E
|
||||
sqlpad.refreshSqlResult=\u5237\u65B0\u67E5\u8BE2\u7ED3\u679C
|
||||
sqlpad.lockSqlResultTab=\u590D\u7528\u5F53\u524D\u67E5\u8BE2\u7ED3\u679C\u9009\u9879\u5361
|
||||
sqlpad.executionSqlselectionRange=\u8D77\u59CB\u884C\uFF1A{0}\uFF08{1}\uFF09\uFF0C\u7ED3\u675F\u884C\uFF1A{2}\uFF08{3}\uFF09
|
||||
sqlpad.keepResult=\u4FDD\u7559\u6267\u884C\u65E5\u5FD7
|
||||
|
@ -387,4 +393,5 @@ sqlpad.sqlExecutionStat.infoTaskDurationSuffix=\uFF0C\u4EFB\u52A1\u7528\u65F6{0}
|
|||
sqlpad.affectDataRowCount=\u5F71\u54CD\u4E86 {0} \u884C\u6570\u636E
|
||||
sqlpad.selectResultWithIndex=\u67E5\u8BE2\u7ED3\u679C-{0}
|
||||
sqlpad.viewResult=\u67E5\u770B\u7ED3\u679C
|
||||
sqlpad.selectResultExpired=\u67E5\u8BE2\u7ED3\u679C\u5DF2\u8FC7\u671F
|
||||
sqlpad.selectResultExpired=\u67E5\u8BE2\u7ED3\u679C\u5DF2\u8FC7\u671F
|
||||
sqlpad.noMoreData=\u6CA1\u6709\u66F4\u591A\u6570\u636E\u4E86
|
|
@ -29,7 +29,7 @@ Schema schema 数据库,不允许为null
|
|||
<button id="clearSqlButton" class="ui-button ui-corner-all ui-widget ui-button-icon-only" title="<@spring.message code='sqlpad.clearEditSql' />"><span class="ui-button-icon ui-icon ui-icon-trash"></span><span class="ui-button-icon-space"> </span><@spring.message code='sqlpad.clearEditSql' /></button>
|
||||
<div class="more-operation-wrapper">
|
||||
<button id="moreOperationButton" class="ui-button ui-corner-all ui-widget ui-button-icon-only" title="<@spring.message code='sqlpad.moreOperation' />"><span class="ui-button-icon ui-icon ui-icon-caret-1-s"></span><span class="ui-button-icon-space"> </span><@spring.message code='sqlpad.moreOperation' /></button>
|
||||
<div class="more-operation-panel ui-widget ui-widget-content ui-corner-all ui-widget-shadow">
|
||||
<div class="more-operation-panel ui-widget ui-widget-content ui-corner-all ui-widget-shadow ui-front">
|
||||
<form id="moreOperationForm" method="POST" action="#">
|
||||
<div class="form-content">
|
||||
<div class="form-item">
|
||||
|
@ -58,6 +58,12 @@ Schema schema 数据库,不允许为null
|
|||
<@spring.message code='sqlpad.overTimeThreashold.unit' />
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-item">
|
||||
<div class="form-item-label"><label><@spring.message code='sqlpad.resultsetFetchSize' /></label></div>
|
||||
<div class="form-item-value">
|
||||
<input type="text" name="resultsetFetchSize" value="20" class="ui-widget ui-widget-content" style="width:4em;" title="<@spring.message code='sqlpad.resultsetFetchSize.desc' />" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
@ -95,10 +101,16 @@ delete from t_address where city = '-99999999';
|
|||
</div>
|
||||
</div>
|
||||
<div class="result-operations button-operation">
|
||||
<button id="toggleAutoClearResultButton" class="result-message-button ui-button ui-corner-all ui-widget ui-button-icon-only stated-active" title="<@spring.message code='sqlpad.keepResult' />"><span class="ui-button-icon ui-icon ui-icon-pin-s"></span><span class="ui-button-icon-space"> </span><@spring.message code='sqlpad.keepResult' /></button>
|
||||
<button id="clearResultButton" class="result-message-button ui-button ui-corner-all ui-widget ui-button-icon-only" title="<@spring.message code='sqlpad.clearSqlResult' />"><span class="ui-button-icon ui-icon ui-icon-trash"></span><span class="ui-button-icon-space"> </span><@spring.message code='sqlpad.clearSqlResult' /></button>
|
||||
|
||||
<button id="lockSqlResultTabButton" class="sql-result-button ui-button ui-corner-all ui-widget ui-button-icon-only stated-active" title="<@spring.message code='sqlpad.lockSqlResultTab' />"><span class="ui-button-icon ui-icon ui-icon-locked"></span><span class="ui-button-icon-space"> </span><@spring.message code='sqlpad.lockSqlResultTab' /></button>
|
||||
<div class="result-message-buttons">
|
||||
<button id="toggleAutoClearResultButton" class="result-message-button ui-button ui-corner-all ui-widget ui-button-icon-only stated-active" title="<@spring.message code='sqlpad.keepResult' />"><span class="ui-button-icon ui-icon ui-icon-pin-s"></span><span class="ui-button-icon-space"> </span><@spring.message code='sqlpad.keepResult' /></button>
|
||||
<button id="clearSqlResultMessageButton" class="result-message-button ui-button ui-corner-all ui-widget ui-button-icon-only" title="<@spring.message code='sqlpad.clearSqlResultMessage' />"><span class="ui-button-icon ui-icon ui-icon-trash"></span><span class="ui-button-icon-space"> </span><@spring.message code='sqlpad.clearSqlResultMessage' /></button>
|
||||
</div>
|
||||
<div class="sql-result-buttons">
|
||||
<button id="moreSqlResultTabButton" class="sql-result-button ui-button ui-corner-all ui-widget ui-button-icon-only" title="<@spring.message code='sqlpad.loadMoreData' />"><span class="ui-button-icon ui-icon ui-icon-arrowthick-1-s"></span><span class="ui-button-icon-space"> </span><@spring.message code='sqlpad.loadMoreData' /></button>
|
||||
<button id="refreshSqlResultTabButton" class="sql-result-button ui-button ui-corner-all ui-widget ui-button-icon-only" title="<@spring.message code='sqlpad.refreshSqlResult' />"><span class="ui-button-icon ui-icon ui-icon-refresh"></span><span class="ui-button-icon-space"> </span><@spring.message code='sqlpad.refreshSqlResult' /></button>
|
||||
|
||||
<button id="lockSqlResultTabButton" class="sql-result-button ui-button ui-corner-all ui-widget ui-button-icon-only stated-active" title="<@spring.message code='sqlpad.lockSqlResultTab' />"><span class="ui-button-icon ui-icon ui-icon-locked"></span><span class="ui-button-icon-space"> </span><@spring.message code='sqlpad.lockSqlResultTab' /></button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -126,7 +138,7 @@ delete from t_address where city = '-99999999';
|
|||
po.resultMessageElement = po.element("#${pageId}-resultMessage");
|
||||
po.sqlResultTabs = po.element("#${pageId}-sqlResultTabs");
|
||||
|
||||
$.initButtons(po.element(".head"));
|
||||
$.initButtons(po.element(".head, .result-operations"));
|
||||
po.element("#sqlCommitModeSet").buttonset();
|
||||
po.element("#sqlExceptionHandleModeSet").buttonset();
|
||||
|
||||
|
@ -171,11 +183,11 @@ delete from t_address where city = '-99999999';
|
|||
}
|
||||
});
|
||||
|
||||
po.executeSql = function(sql, sqlStartRow, sqlStartColumn, commitMode, exceptionHandleMode, overTimeThreashold)
|
||||
po.executeSql = function(sql, sqlStartRow, sqlStartColumn, commitMode, exceptionHandleMode, overTimeThreashold, resultsetFetchSize)
|
||||
{
|
||||
if(po.cometdSubscribed)
|
||||
{
|
||||
po.requestExecuteSql(sql, sqlStartRow, sqlStartColumn, commitMode, exceptionHandleMode, overTimeThreashold);
|
||||
po.requestExecuteSql(sql, sqlStartRow, sqlStartColumn, commitMode, exceptionHandleMode, overTimeThreashold, resultsetFetchSize);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -191,13 +203,13 @@ delete from t_address where city = '-99999999';
|
|||
{
|
||||
po.cometdSubscribed = true;
|
||||
|
||||
po.requestExecuteSql(sql, sqlStartRow, sqlStartColumn, commitMode, exceptionHandleMode, overTimeThreashold);
|
||||
po.requestExecuteSql(sql, sqlStartRow, sqlStartColumn, commitMode, exceptionHandleMode, overTimeThreashold, resultsetFetchSize);
|
||||
}
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
po.requestExecuteSql = function(sql, sqlStartRow, sqlStartColumn, commitMode, exceptionHandleMode, overTimeThreashold)
|
||||
po.requestExecuteSql = function(sql, sqlStartRow, sqlStartColumn, commitMode, exceptionHandleMode, overTimeThreashold, resultsetFetchSize)
|
||||
{
|
||||
if(!po.element("#toggleAutoClearResultButton").hasClass("ui-state-active"))
|
||||
po.resultMessageElement.empty();
|
||||
|
@ -214,7 +226,8 @@ delete from t_address where city = '-99999999';
|
|||
"sqlStartColumn" : sqlStartColumn,
|
||||
"commitMode" : commitMode,
|
||||
"exceptionHandleMode" : exceptionHandleMode,
|
||||
"overTimeThreashold" : overTimeThreashold
|
||||
"overTimeThreashold" : overTimeThreashold,
|
||||
"resultsetFetchSize" : resultsetFetchSize
|
||||
},
|
||||
error : function()
|
||||
{
|
||||
|
@ -541,7 +554,7 @@ delete from t_address where city = '-99999999';
|
|||
+"<div class='tabs-more-operation-button' title='<@spring.message code='moreOperation' />'></div>"
|
||||
+"</div>"
|
||||
+"</li>";
|
||||
|
||||
|
||||
po.getSqlResultTabPanelTableId = function(tabId)
|
||||
{
|
||||
return tabId + "-table";
|
||||
|
@ -598,13 +611,82 @@ delete from t_address where city = '-99999999';
|
|||
po.refreshTabsNavForHidden(po.sqlResultTabs, tabsNav);
|
||||
}
|
||||
|
||||
var form = $("<form style='display:none;' />").attr("id", po.getSqlResultTabPanelFormId(tabId)).appendTo(tabPanel);
|
||||
$("<textarea name='sql' />").val(sql).appendTo(form);
|
||||
$("<input name='startRow' />").val(modelSqlResult.nextStartRow).appendTo(form);
|
||||
$("<input name='fetchSize' />").val(modelSqlResult.fetchSize).appendTo(form);
|
||||
|
||||
var table = $("<table width='100%' class='hover stripe'></table>").attr("id", po.getSqlResultTabPanelTableId(tabId)).appendTo(tabPanel);
|
||||
po.initSqlResultDataTable(tabId, table, sql, modelSqlResult);
|
||||
|
||||
$("<div class='no-more-data-flag ui-widget ui-widget-content' />")
|
||||
.attr("title", "<@spring.message code='sqlpad.noMoreData' />").appendTo(tabPanel);
|
||||
|
||||
var form = $("<form style='display:none;' />")
|
||||
.attr("id", po.getSqlResultTabPanelFormId(tabId))
|
||||
.attr("action", "${contextPath}/sqlpad/"+po.schemaId+"/select")
|
||||
.attr("method", "POST")
|
||||
.attr("tab-id", tabId)
|
||||
.appendTo(tabPanel);
|
||||
|
||||
$("<input name='sqlpadId' type='hidden' />").val(po.sqlpadId).appendTo(form);
|
||||
$("<textarea name='sql' />").val(sql).appendTo(form);
|
||||
$("<input name='startRow' type='hidden' />").val(modelSqlResult.nextStartRow).appendTo(form);
|
||||
$("<input name='fetchSize' type='hidden' />").val(modelSqlResult.fetchSize).appendTo(form);
|
||||
|
||||
if(modelSqlResult.datas == null || modelSqlResult.datas.length < modelSqlResult.fetchSize)
|
||||
{
|
||||
form.attr("no-more-data", "1");
|
||||
$(".no-more-data-flag", tabPanel).show();
|
||||
}
|
||||
|
||||
form.submit(function()
|
||||
{
|
||||
var $this = $(this);
|
||||
|
||||
if("1" == $this.attr("no-more-data"))
|
||||
{
|
||||
$.tipInfo("<@spring.message code='sqlpad.noMoreData' />");
|
||||
}
|
||||
else
|
||||
{
|
||||
po.element("#moreSqlResultTabButton").button("disable");
|
||||
po.element("#refreshSqlResultTabButton").button("disable");
|
||||
|
||||
$this.ajaxSubmit(
|
||||
{
|
||||
beforeSerialize: function($form, options)
|
||||
{
|
||||
var fetchSize = po.getResultsetFetchSize(po.element("#moreOperationForm"));
|
||||
$("input[name='fetchSize']", $form).val(fetchSize);
|
||||
},
|
||||
success : function(modelSqlResult, statusText, xhr, $form)
|
||||
{
|
||||
$("input[name='startRow']", $form).val(modelSqlResult.nextStartRow);
|
||||
|
||||
var tabId = $form.attr("tab-id");
|
||||
var tabPanel = po.getTabsTabPanelByTabId(po.sqlResultTabs, tabId);
|
||||
|
||||
var dataTable = po.element("#" + po.getSqlResultTabPanelTableId(tabId), tabPanel).DataTable();
|
||||
|
||||
$.addDataTableData(dataTable, modelSqlResult.datas, modelSqlResult.startRow-1);
|
||||
|
||||
if(modelSqlResult.datas.length < modelSqlResult.fetchSize)
|
||||
{
|
||||
$form.attr("no-more-data", "1");
|
||||
$(".no-more-data-flag", tabPanel).show();
|
||||
}
|
||||
else
|
||||
{
|
||||
$form.attr("no-more-data", "0");
|
||||
$(".no-more-data-flag", tabPanel).hide();
|
||||
}
|
||||
},
|
||||
complete : function()
|
||||
{
|
||||
po.element("#moreSqlResultTabButton").button("enable");
|
||||
po.element("#refreshSqlResultTabButton").button("enable");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
return false;
|
||||
});
|
||||
};
|
||||
|
||||
po.calSqlResultTableHeight = function(tabIdOrTabPanel)
|
||||
|
@ -612,7 +694,17 @@ delete from t_address where city = '-99999999';
|
|||
if(typeof(tabIdOrTabPanel) == "string")
|
||||
tabIdOrTabPanel = po.getTabsTabPanelByTabId(po.sqlResultTabs, tabIdOrTabPanel);
|
||||
|
||||
return tabIdOrTabPanel.height() - 35;
|
||||
return tabIdOrTabPanel.height() - 37;
|
||||
};
|
||||
|
||||
po.renderRowNumberColumn = function(data, type, row, meta)
|
||||
{
|
||||
var row = meta.row;
|
||||
|
||||
if(row.length > 0)
|
||||
row = row[0];
|
||||
|
||||
return row + 1;
|
||||
};
|
||||
|
||||
po.initSqlResultDataTable = function(tabId, $table, sql, modelSqlResult)
|
||||
|
@ -620,9 +712,17 @@ delete from t_address where city = '-99999999';
|
|||
var model = modelSqlResult.model;
|
||||
var columns = $.buildDataTablesColumns(model);
|
||||
|
||||
var newColumns = [
|
||||
{
|
||||
title : "<@spring.message code='rowNumber' />", data : "", defaultContent: "",
|
||||
render : po.renderRowNumberColumn, className : "column-row-number"
|
||||
}
|
||||
];
|
||||
newColumns = newColumns.concat(columns);
|
||||
|
||||
var settings =
|
||||
{
|
||||
"columns" : columns,
|
||||
"columns" : newColumns,
|
||||
"data" : (modelSqlResult.datas ? modelSqlResult.datas : []),
|
||||
"scrollX": true,
|
||||
"autoWidth": true,
|
||||
|
@ -688,6 +788,34 @@ delete from t_address where city = '-99999999';
|
|||
});
|
||||
};
|
||||
|
||||
po.getOverTimeThreashold = function($form)
|
||||
{
|
||||
var overTimeThreashold = parseInt(po.element("input[name='overTimeThreashold']", $form).val());
|
||||
|
||||
if(isNaN(overTimeThreashold))
|
||||
overTimeThreashold = 10;
|
||||
else if(overTimeThreashold < 1)
|
||||
overTimeThreashold = 1;
|
||||
else if(overTimeThreashold > 60)
|
||||
overTimeThreashold = 60;
|
||||
|
||||
return overTimeThreashold;
|
||||
};
|
||||
|
||||
po.getResultsetFetchSize = function($form)
|
||||
{
|
||||
var resultsetFetchSize = parseInt(po.element("input[name='resultsetFetchSize']", $form).val());
|
||||
|
||||
if(isNaN(resultsetFetchSize))
|
||||
resultsetFetchSize = 20;
|
||||
else if(resultsetFetchSize < 1)
|
||||
resultsetFetchSize = 1;
|
||||
else if(resultsetFetchSize > 1000)
|
||||
resultsetFetchSize = 1000;
|
||||
|
||||
return resultsetFetchSize;
|
||||
};
|
||||
|
||||
po.element("#executeSqlButton").click(function()
|
||||
{
|
||||
var $this = $(this);
|
||||
|
@ -721,16 +849,12 @@ delete from t_address where city = '-99999999';
|
|||
if(!sql)
|
||||
return;
|
||||
|
||||
var commitMode = po.element("input[name='sqlCommitMode']:checked").val();
|
||||
var exceptionHandleMode = po.element("input[name='sqlExceptionHandleMode']:checked").val();
|
||||
var overTimeThreashold = parseInt(po.element("input[name='overTimeThreashold']").val());
|
||||
var moreOperationForm = po.element("#moreOperationForm");
|
||||
|
||||
if(isNaN(overTimeThreashold))
|
||||
overTimeThreashold = 10;
|
||||
else if(overTimeThreashold < 1)
|
||||
overTimeThreashold = 1;
|
||||
else if(overTimeThreashold > 60)
|
||||
overTimeThreashold = 60;
|
||||
var commitMode = po.element("input[name='sqlCommitMode']:checked", moreOperationForm).val();
|
||||
var exceptionHandleMode = po.element("input[name='sqlExceptionHandleMode']:checked", moreOperationForm).val();
|
||||
var overTimeThreashold = po.getOverTimeThreashold(moreOperationForm);
|
||||
var resultsetFetchSize = po.getResultsetFetchSize(moreOperationForm);
|
||||
|
||||
var cometd = $.cometd;
|
||||
|
||||
|
@ -743,12 +867,12 @@ delete from t_address where city = '-99999999';
|
|||
{
|
||||
if(handshakeReply.successful)
|
||||
{
|
||||
po.executeSql(sql, sqlStartRow, sqlStartColumn, commitMode, exceptionHandleMode, overTimeThreashold);
|
||||
po.executeSql(sql, sqlStartRow, sqlStartColumn, commitMode, exceptionHandleMode, overTimeThreashold, resultsetFetchSize);
|
||||
}
|
||||
});
|
||||
}
|
||||
else
|
||||
po.executeSql(sql, sqlStartRow, sqlStartColumn, commitMode, exceptionHandleMode, overTimeThreashold);
|
||||
po.executeSql(sql, sqlStartRow, sqlStartColumn, commitMode, exceptionHandleMode, overTimeThreashold, resultsetFetchSize);
|
||||
}
|
||||
|
||||
po.sqlEditor.focus();
|
||||
|
@ -826,10 +950,35 @@ delete from t_address where city = '-99999999';
|
|||
}
|
||||
});
|
||||
|
||||
po.element("#clearResultButton").click(function()
|
||||
po.element("#clearSqlResultMessageButton").click(function()
|
||||
{
|
||||
po.resultMessageElement.empty();
|
||||
});
|
||||
|
||||
po.element("#moreSqlResultTabButton").click(function()
|
||||
{
|
||||
var tabsNav = po.getTabsNav(po.sqlResultTabs);
|
||||
var activeTab = po.getActiveTab(po.sqlResultTabs, tabsNav);
|
||||
var activeTabId = po.getTabsTabId(po.sqlResultTabs, tabsNav, activeTab);
|
||||
var activeTabFormId = po.getSqlResultTabPanelFormId(activeTabId);
|
||||
var activeTabForm = po.element("#" + activeTabFormId);
|
||||
|
||||
activeTabForm.submit();
|
||||
});
|
||||
|
||||
po.element("#refreshSqlResultTabButton").click(function()
|
||||
{
|
||||
var tabsNav = po.getTabsNav(po.sqlResultTabs);
|
||||
var activeTab = po.getActiveTab(po.sqlResultTabs, tabsNav);
|
||||
var activeTabId = po.getTabsTabId(po.sqlResultTabs, tabsNav, activeTab);
|
||||
var activeTabFormId = po.getSqlResultTabPanelFormId(activeTabId);
|
||||
var activeTabForm = po.element("#" + activeTabFormId);
|
||||
|
||||
$("input[name='startRow']", activeTabForm).val(1);
|
||||
activeTabForm.attr("no-more-data", "0");
|
||||
|
||||
activeTabForm.submit();
|
||||
});
|
||||
|
||||
po.element("#lockSqlResultTabButton").click(function()
|
||||
{
|
||||
|
@ -849,11 +998,13 @@ delete from t_address where city = '-99999999';
|
|||
{
|
||||
rules :
|
||||
{
|
||||
overTimeThreashold : { required : true, integer : true, min : 1, max : 60 }
|
||||
overTimeThreashold : { required : true, integer : true, min : 1, max : 60 },
|
||||
resultsetFetchSize : { required : true, integer : true, min : 1, max : 1000 }
|
||||
},
|
||||
messages :
|
||||
{
|
||||
overTimeThreashold : "<@spring.message code='sqlpad.overTimeThreashold.validation' />"
|
||||
overTimeThreashold : "<@spring.message code='sqlpad.overTimeThreashold.validation' />",
|
||||
resultsetFetchSize : "<@spring.message code='sqlpad.resultsetFetchSize.validation' />"
|
||||
},
|
||||
submitHandler : function(form)
|
||||
{
|
||||
|
@ -896,13 +1047,13 @@ delete from t_address where city = '-99999999';
|
|||
|
||||
if(newTab.hasClass("sql-result-tab"))
|
||||
{
|
||||
$(".result-message-button", resultOperations).hide();
|
||||
$(".sql-result-button", resultOperations).show();
|
||||
$(".result-message-buttons", resultOperations).hide();
|
||||
$(".sql-result-buttons", resultOperations).show();
|
||||
}
|
||||
else if(newTab.hasClass("result-message-tab"))
|
||||
{
|
||||
$(".sql-result-button", resultOperations).hide();
|
||||
$(".result-message-button", resultOperations).show();
|
||||
$(".sql-result-buttons", resultOperations).hide();
|
||||
$(".result-message-buttons", resultOperations).show();
|
||||
}
|
||||
|
||||
$.callTabsPanelShowCallback(newPanel);
|
||||
|
@ -932,7 +1083,7 @@ delete from t_address where city = '-99999999';
|
|||
|
||||
po.element("input[name='sqlCommitMode'][value='AUTO']").click();
|
||||
po.element(".more-operation-panel").hide();
|
||||
po.element(".result-operations .sql-result-button").hide();
|
||||
po.element(".result-operations .sql-result-buttons").hide();
|
||||
|
||||
po.bindTabsMenuHiddenEvent(po.sqlResultTabs);
|
||||
})
|
||||
|
|
|
@ -937,23 +937,37 @@
|
|||
* 设置表格数据。
|
||||
*/
|
||||
setDataTableData : function(dataTable, data, notDraw)
|
||||
{
|
||||
$.addDataTableData(dataTable, data, 0, notDraw);
|
||||
},
|
||||
|
||||
/**
|
||||
* 添加表格数据
|
||||
*/
|
||||
addDataTableData : function(dataTable, datas, startRowIndex, notDraw)
|
||||
{
|
||||
var rows = dataTable.rows();
|
||||
var removeRowIndexes = [];
|
||||
var dataIndex = 0;
|
||||
|
||||
rows.every(function(rowIndex)
|
||||
if(startRowIndex != null)
|
||||
{
|
||||
if(dataIndex >= data.length)
|
||||
removeRowIndexes.push(rowIndex);
|
||||
else
|
||||
this.data(data[dataIndex]);
|
||||
|
||||
dataIndex++;
|
||||
});
|
||||
rows.every(function(rowIndex)
|
||||
{
|
||||
if(rowIndex < startRowIndex)
|
||||
return;
|
||||
|
||||
if(dataIndex >= datas.length)
|
||||
removeRowIndexes.push(rowIndex);
|
||||
else
|
||||
this.data(datas[dataIndex]);
|
||||
|
||||
dataIndex++;
|
||||
});
|
||||
}
|
||||
|
||||
for(; dataIndex<data.length; dataIndex++)
|
||||
var row = dataTable.row.add(data[dataIndex]);
|
||||
for(; dataIndex<datas.length; dataIndex++)
|
||||
var row = dataTable.row.add(datas[dataIndex]);
|
||||
|
||||
dataTable.rows(removeRowIndexes).remove();
|
||||
|
||||
|
|
|
@ -1228,8 +1228,8 @@ table.dataTable tbody tr .column-check .row-data-state .ui-icon{
|
|||
margin-left: 1.5em;
|
||||
border-width: 0px;
|
||||
border-right-width: 1px;
|
||||
opacity: 0.7;
|
||||
filter: Alpha(Opacity=70);
|
||||
opacity: 0.8;
|
||||
filter: Alpha(Opacity=80);
|
||||
}
|
||||
.page-sqlpad .head{
|
||||
height: 1.2em;
|
||||
|
@ -1250,13 +1250,12 @@ table.dataTable tbody tr .column-check .row-data-state .ui-icon{
|
|||
position: absolute;
|
||||
right: 0.1em;
|
||||
top: 1.1em;
|
||||
z-index: 9;
|
||||
width: 350%;
|
||||
width: 450%;
|
||||
text-align: left;
|
||||
padding: 0.41em 1em;
|
||||
}
|
||||
.page-sqlpad .head .more-operation-wrapper .more-operation-panel form .form-content .form-item .form-item-label{
|
||||
width: 30%;
|
||||
width: 35%;
|
||||
}
|
||||
.page-sqlpad .head .more-operation-wrapper .more-operation-panel form .form-content .form-item .form-item-value{
|
||||
width: auto;
|
||||
|
@ -1336,14 +1335,14 @@ table.dataTable tbody tr .column-check .row-data-state .ui-icon{
|
|||
margin: 0 0;
|
||||
padding: 0 0;
|
||||
padding-left: 0.1em;
|
||||
padding-right: 10em;
|
||||
padding-right: 18em;
|
||||
overflow: hidden;
|
||||
height: 1.5em;
|
||||
background: none;
|
||||
border-width: 0;
|
||||
border-bottom-width: 1px;
|
||||
opacity: 0.7;
|
||||
filter: Alpha(Opacity=70);
|
||||
opacity: 0.85;
|
||||
filter: Alpha(Opacity=85);
|
||||
box-sizing: border-box;
|
||||
-moz-box-sizing: border-box;
|
||||
-webkit-box-sizing: border-box;
|
||||
|
@ -1370,7 +1369,7 @@ table.dataTable tbody tr .column-check .row-data-state .ui-icon{
|
|||
}
|
||||
.page-sqlpad .content .content-result .result-tabs.ui-tabs .tabs-more-tab-button{
|
||||
top: 0.25em;
|
||||
right: 9em;
|
||||
right: 16em;
|
||||
}
|
||||
.page-sqlpad .content .content-result .result-operations{
|
||||
float: right;
|
||||
|
@ -1378,8 +1377,8 @@ table.dataTable tbody tr .column-check .row-data-state .ui-icon{
|
|||
}
|
||||
.page-sqlpad .content .content-result .button-operation{
|
||||
padding-right: 0.2em;
|
||||
opacity: 0.7;
|
||||
filter: Alpha(Opacity=70);
|
||||
opacity: 0.8;
|
||||
filter: Alpha(Opacity=80);
|
||||
}
|
||||
.page-sqlpad .content .content-result .ui-tabs-panel{
|
||||
position: absolute;
|
||||
|
@ -1403,8 +1402,8 @@ table.dataTable tbody tr .column-check .row-data-state .ui-icon{
|
|||
.page-sqlpad .content .content-result .result-message .execution-message .message-time,
|
||||
.page-sqlpad .content .content-result .result-message .execution-message .message-content{
|
||||
display: inline-block;
|
||||
opacity: 0.7;
|
||||
filter: Alpha(Opacity=70);
|
||||
opacity: 0.8;
|
||||
filter: Alpha(Opacity=80);
|
||||
white-space: nowrap;
|
||||
}
|
||||
.page-sqlpad .content .content-result .result-message .execution-message .message-time{
|
||||
|
@ -1466,6 +1465,12 @@ table.dataTable tbody tr .column-check .row-data-state .ui-icon{
|
|||
.page-sqlpad .sql-result-tab-panel table.dataTable tbody th, table.dataTable tbody td{
|
||||
height: 2.2em;
|
||||
}
|
||||
.page-sqlpad .sql-result-tab-panel .no-more-data-flag{
|
||||
height: 0px;
|
||||
border-top-width: 2px;
|
||||
border-bottom-width: 3px;
|
||||
display: none;
|
||||
}
|
||||
.page-sqlpad .foot{
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
|
|
Loading…
Reference in New Issue