Skip to content

Commit

Permalink
Merge branch 'support_to_execute_multiple_queries'
Browse files Browse the repository at this point in the history
  • Loading branch information
Yoichiro Tanaka committed Aug 27, 2014
2 parents e9dd884 + 7074ea2 commit 82cde07
Show file tree
Hide file tree
Showing 10 changed files with 165 additions and 41 deletions.
2 changes: 1 addition & 1 deletion app/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
"name": "ChromeMyAdmin",
"short_name": "MyAdmin",
"description": "This application provides you 'MySQL GUI Admin console' windows.",
"version": "2.2.0",
"version": "2.3.0",
"author": "Yoichiro Tanaka",
"app": {
"background": {
Expand Down
2 changes: 0 additions & 2 deletions app/scripts/lib/mysql_js_driver_1.7.0.min.js

This file was deleted.

3 changes: 3 additions & 0 deletions app/scripts/lib/mysql_js_driver_1.8.0.min.js

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,8 @@ chromeMyAdmin.controller("DatabaseObjectListController", ["$scope", "mySQLClient

$scope.selectTable = function(tableName) {
targetObjectService.changeTable(tableName);
if (modeService.getMode() === Modes.DATABASE) {
if (modeService.getMode() === Modes.DATABASE ||
modeService.getMode() === Modes.QUERY) {
modeService.changeMode(Modes.ROWS);
}
};
Expand Down
129 changes: 98 additions & 31 deletions app/scripts/window/controllers/query_panel_controller.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ chromeMyAdmin.directive("queryPanel", function() {
};
});

chromeMyAdmin.controller("QueryPanelController", ["$scope", "modeService", "mySQLClientService", "targetObjectService", "UIConstants", "Events", "Modes", "queryHistoryService", "Templates", "configurationService", "Configurations", function($scope, modeService, mySQLClientService, targetObjectService, UIConstants, Events, Modes, queryHistoryService, Templates, configurationService, Configurations) {
chromeMyAdmin.controller("QueryPanelController", ["$scope", "modeService", "mySQLClientService", "targetObjectService", "UIConstants", "Events", "Modes", "queryHistoryService", "Templates", "configurationService", "Configurations", "$timeout", function($scope, modeService, mySQLClientService, targetObjectService, UIConstants, Events, Modes, queryHistoryService, Templates, configurationService, Configurations, $timeout) {
"use strict";

var initializeQueryResultGrid = function() {
Expand All @@ -26,6 +26,7 @@ chromeMyAdmin.controller("QueryPanelController", ["$scope", "modeService", "mySQ
var resetQueryResultGrid = function() {
$scope.queryResultColumnDefs = [];
$scope.queryResultData = [];
$scope.selectedQuery = "";
};

var _isQueryPanelVisible = function() {
Expand All @@ -45,15 +46,8 @@ chromeMyAdmin.controller("QueryPanelController", ["$scope", "modeService", "mySQ
UIConstants.WINDOW_TITLE_PANEL_HEIGHT -
UIConstants.NAVBAR_HEIGHT -
UIConstants.FOOTER_HEIGHT;
$(".queryEditor").height(totalHeight / 3 - 14);
$("#queryResultGrid").height(totalHeight * 2 / 3 - 53);
};

var onTableChanged = function(table) {
if (modeService.getMode() === Modes.QUERY) {
$scope.editor.insert(table);
$scope.editor.focus();
}
$(".queryEditor").height(totalHeight / 3);
$("#queryResultGrid").height(totalHeight * 2 / 3 - 74);
};

var onModeChanged = function(mode) {
Expand All @@ -70,17 +64,14 @@ chromeMyAdmin.controller("QueryPanelController", ["$scope", "modeService", "mySQ
$scope.$on(Events.CONNECTION_CHANGED, function(event, data) {
onConnectionChanged();
});
$scope.$on(Events.TABLE_CHANGED, function(event, table) {
onTableChanged(table);
});
$scope.$on(Events.MODE_CHANGED, function(event, mode) {
onModeChanged(mode);
});
$scope.$on(Events.SHOW_QUERY_PANEL, function(event, data) {
onShowQueryPanel(data.query);
});
$scope.$on(Events.REQUEST_REFRESH, function(event, data) {
doExecuteQuery();
doExecuteQueries();
});
configurationService.addConfigurationChangeListener(function(name, value) {
if (name === Configurations.QUERY_EDITOR_WRAP_MODE) {
Expand All @@ -97,31 +88,83 @@ chromeMyAdmin.controller("QueryPanelController", ["$scope", "modeService", "mySQ
}
};

var doExecuteQuery = function() {
var doShowQueryResult = function(index) {
resetQueryResultGrid();
$scope.queryErrorMessage = "";
var query = $scope.query;
mySQLClientService.query(query).then(function(result) {
var queryResult = $scope.queryResults[index];
$scope.selectedQuery = queryResult.query;
if (queryResult.success) {
var result = queryResult.result;
if (result.hasResultsetRows) {
$scope.safeApply(function() {
$scope.queryErrorMessage = "";
updateQueryResultColumnDefs(result.columnDefinitions);
updateQueryResult(result.columnDefinitions, result.resultsetRows);
queryHistoryService.add(query).then(function() {
loadQueryHistory();
});
$scope.editor.focus();
});
} else {
$scope.safeApply(function() {
var message =
"No errors. Affected rows count is " +
result.result.affectedRows;
$scope.queryErrorMessage = message;
$scope.editor.focus();
});
}
} else {
$scope.queryErrorMessage = queryResult.errorMessage;
$scope.editor.focus();
}
};

var doExecuteQuery = function(queries) {
if (queries.length === 0) {
doShowQueryResult(0);
return;
}
var query = queries.shift();
mySQLClientService.query(query).then(function(result) {
$scope.queryResults.push({
query: query,
result: result,
success: true
});
doExecuteQuery(queries);
queryHistoryService.add(query).then(function() {
loadQueryHistory();
});
}, function(reason) {
var errorMessage = "[Error code:" + reason.errorCode;
errorMessage += " SQL state:" + reason.sqlState;
errorMessage += "] ";
errorMessage += reason.errorMessage;
$scope.queryErrorMessage = errorMessage;
$scope.editor.focus();
$scope.queryResults.push({
query: query,
errorMessage: errorMessage,
sucess: false
});
doExecuteQuery([]);
});
};

var doExecuteQueries = function() {
resetQueryResultGrid();
$scope.queryErrorMessage = "";
$scope.queryResults = [];
var query = $scope.query;
if (query) {
var parseResult = new MySQL.QueryDivider().parse(query);
if (parseResult.success) {
if (parseResult.result.length > 0) {
doExecuteQuery(parseResult.result);
}
} else {
var errorMessage = "ParseError: " + parseResult.error.message;
$scope.queryErrorMessage = errorMessage;
$scope.editor.focus();
}
}
};

var updateQueryResultColumnDefs = function(columnDefinitions) {
var columnDefs = [];
angular.forEach(columnDefinitions, function(columnDefinition, index) {
Expand Down Expand Up @@ -154,25 +197,25 @@ chromeMyAdmin.controller("QueryPanelController", ["$scope", "modeService", "mySQ

var loadQueryHistory = function() {
queryHistoryService.getAll().then(function(result) {
result.push("");
$scope.queryHistory = result.reverse();
$scope.queryInHistory = result[0];
});
};

$scope.initialize = function() {
$scope.queryResults = [];
assignEventHandlers();
initializeQueryResultGrid();
assignWindowResizeEventHandler();
adjustQueryPanelHeight();
$scope.clearQuery();
};

$scope.isQueryPanelVisible = function() {
return _isQueryPanelVisible();
};

$scope.executeQuery = function() {
doExecuteQuery();
doExecuteQueries();
};

$scope.isQueryErrorMessageVisible = function() {
Expand All @@ -195,18 +238,38 @@ chromeMyAdmin.controller("QueryPanelController", ["$scope", "modeService", "mySQ
mac: "Command-Enter"
},
exec: function(editor) {
doExecuteQuery();
doExecuteQueries();
},
readOnly: false
});
$scope.createDdl = "CREATE TABLE ... ";
};

$scope.onChangeQueryInHistory = function() {
var target = $scope.queryInHistory;
if (target) {
$scope.query = target;
$scope.setQuery = function(query) {
$scope.query = query;
$scope.editor.focus();
};

$scope.insertQuery = function(query) {
var current = $scope.editor.getCursorPosition();
var pos = 0;
var lines = $scope.query.split("\n");
for (var i = 0; i < current.row; i++) {
pos += lines[i].length + 1;
}
pos += current.column;
$scope.query =
$scope.query.substring(0, pos) +
query +
$scope.query.substring(pos);
$scope.editor.focus();
$timeout(function() {
$scope.editor.getSelection().moveCursorToPosition(current);
}, 100);
};

$scope.clearQuery = function() {
$scope.query = "";
};

$scope.getDisplayValue = function(value) {
Expand All @@ -225,4 +288,8 @@ chromeMyAdmin.controller("QueryPanelController", ["$scope", "modeService", "mySQ
}
};

$scope.showQueryResult = function(index) {
doShowQueryResult(index);
};

}]);
2 changes: 2 additions & 0 deletions app/scripts/window/services/mysql_client_service.js
Original file line number Diff line number Diff line change
Expand Up @@ -208,6 +208,7 @@ chromeMyAdmin.factory("mySQLClientService", ["$q", "$rootScope", function($q, $r
Number(portNumber),
userName,
password,
false,
function(initialHandshakeRequest, result) {
$rootScope.hideProgressBar();
if (result.isSuccess()) {
Expand Down Expand Up @@ -239,6 +240,7 @@ chromeMyAdmin.factory("mySQLClientService", ["$q", "$rootScope", function($q, $r
Number(portNumber),
userName,
password,
false,
ca,
checkCN,
function(initialHandshakeRequest, result) {
Expand Down
9 changes: 7 additions & 2 deletions app/scripts/window/services/query_history_service.js
Original file line number Diff line number Diff line change
@@ -1,19 +1,24 @@
chromeMyAdmin.factory("queryHistoryService", ["$rootScope", "$q", "Events", function($rootScope, $q, Events) {
"use strict";

var trim = function(str) {
return str.replace(/^[  \t\r\n]+|[  \t\r\n]+$/g, "");
};

return {
add: function(query) {
var trimed = trim(query);
var deferred = $q.defer();
chrome.storage.sync.get("queries", function(items) {
var queries = items.queries || [];
var exists = false;
angular.forEach(queries, function(target) {
if (target === query) {
if (target === trimed) {
exists = true;
}
});
if (!exists) {
queries.push(query);
queries.push(trimed);
if (queries.length > 30) {
queries = queries.slice(-30);
}
Expand Down
15 changes: 15 additions & 0 deletions app/styles/window.css
Original file line number Diff line number Diff line change
Expand Up @@ -211,6 +211,21 @@ body {
}

.queryMiddlePanel {
background-color: #e7e7e7;
height: 22px;
}

.queryMiddlePanel .selectedQuery {
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
font-size: 12px;
line-height: 1.8em;
padding-left: 5px;
padding-right: 5px;
}

#queryPanel nav {
margin-bottom: 0;
}

Expand Down
39 changes: 36 additions & 3 deletions app/templates/query_panel.html
Original file line number Diff line number Diff line change
@@ -1,9 +1,42 @@
<div id="queryPanel" ng-controller="QueryPanelController" ng-init="initialize()" ng-show="isQueryPanelVisible()">
<nav class="navbar navbar-default" role="navigation">
<div class="container-fluid">
<div class="collapse navbar-collapse">
<ul class="nav navbar-nav">
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">History <span class="caret"></span></a>
<ul class="dropdown-menu">
<li ng-repeat="query in queryHistory">
<a href="#" ng-click="insertQuery(query)">{{query}}</a>
</li>
</ul>
</li>
</ul>
<form class="navbar-form navbar-right">
<button type="submit" class="btn btn-default btn-sm" ng-click="clearQuery()">Clear</button>
<button type="submit" class="btn btn-default btn-sm" ng-click="executeQuery()">Execute</button>
</form>
</div>
</div>
</nav>
<div ui-ace="{mode: 'sql', theme: 'clouds', onLoad: aceLoaded}" ng-model="query" class="queryEditor"></div>
<div class="form-group queryMiddlePanel">
<select class="form-control" ng-model="queryInHistory" ng-options="query for query in queryHistory" ng-change="onChangeQueryInHistory()"></select>
<button type="button" class="form-control btn btn-default btn-xs" ng-click="executeQuery()">Execute</button>

<div class="queryMiddlePanel">
<div class="dropdown pull-left">
<button class="btn btn-default btn-xs dropdown-toggle" type="button" id="queryResultSelector" data-toggle="dropdown">
Result ({{queryResults.length}})
<span class="caret"></span>
</button>
<ul class="dropdown-menu" role="menu" aria-labelledby="queryResultSelector">
<li role="<p></p>resentation" ng-repeat="result in queryResults">
<a role="menuitem" tabindex="-1" href="#" ng-click="showQueryResult($index)">{{$index + 1}}. {{result.query}}</a>
</li>
</ul>
</div>

<div class="selectedQuery">{{selectedQuery}}</div>
</div>

<div id="queryResultGrid" class="gridStyle" ng-grid="queryResultGrid">
</div>
<div class="queryErrorMessage" ng-model="queryError" ng-show="isQueryErrorMessageVisible()">{{queryErrorMessage}}</div>
Expand Down
2 changes: 1 addition & 1 deletion app/window.html
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@
<script type="text/javascript" src="scripts/lib/sha1.js"></script>
<!-- endbuild -->
<script type="text/javascript" src="scripts/lib/forge.min.js"></script>
<script type="text/javascript" src="scripts/lib/mysql_js_driver_1.7.0.min.js"></script>
<script type="text/javascript" src="scripts/lib/mysql_js_driver_1.8.0.min.js"></script>

<script type="text/javascript" src="scripts/lib/ace-builds/src-min-noconflict/ace.js"></script>
<!-- build:js scripts/lib/ui-ace.min.js -->
Expand Down

0 comments on commit 82cde07

Please sign in to comment.