SQL工作台:查询结果添加加载更多数据、刷新功能

This commit is contained in:
datagear 2019-04-06 16:22:00 +08:00
parent f3e43af8bc
commit 56506dcefa
7 changed files with 356 additions and 80 deletions

View File

@ -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();

View File

@ -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)
{
}
}
/**

View File

@ -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>
<!-- 定时任务开始 -->

View File

@ -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

View File

@ -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>
&nbsp;&nbsp;
<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);
})

View File

@ -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();

View File

@ -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%;