Merge pull request #1741 from nisargjhaveri/debug_console

Group/Ungroup queries in console SQL debug
This commit is contained in:
Marc Delisle 2015-06-18 11:49:36 -04:00
commit 72833685b7
6 changed files with 174 additions and 36 deletions

View File

@ -1100,6 +1100,13 @@ var PMA_consoleBookmarks = {
};
var PMA_consoleDebug = {
_config: {
groupQueries: false
},
_lastDebugInfo: {
debugInfo: null,
url: null
},
initialize: function() {
// Try to get debug info after every AJAX request
$( document ).ajaxSuccess(function(event, xhr, settings, data) {
@ -1108,6 +1115,29 @@ var PMA_consoleDebug = {
}
});
// Initialize config
this._initConfig();
if (this.configParam('groupQueries')) {
$('#debug_console').addClass('grouped');
} else {
$('#debug_console').addClass('ungrouped');
}
// Initialize actions in toolbar
$('#debug_console .button.group_queries').click(function() {
$('#debug_console').addClass('grouped');
$('#debug_console').removeClass('ungrouped');
PMA_consoleDebug.configParam('groupQueries', true);
PMA_consoleDebug.refresh();
});
$('#debug_console .button.ungroup_queries').click(function() {
$('#debug_console').addClass('ungrouped');
$('#debug_console').removeClass('grouped');
PMA_consoleDebug.configParam('groupQueries', false);
PMA_consoleDebug.refresh();
});
// Show SQL debug info for first page load
if (typeof debugSQLInfo !== 'undefined' && debugSQLInfo !== 'null') {
$('#pma_console .button.debug').removeClass('hide');
@ -1117,6 +1147,19 @@ var PMA_consoleDebug = {
}
PMA_consoleDebug.showLog(debugSQLInfo);
},
_initConfig: function() {
var config = JSON.parse($.cookie('pma_console_dbg_config'));
if (config) {
this._config = config;
}
},
configParam: function(name, value) {
if (typeof value === 'undefined') {
return this._config[name];
}
this._config[name] = value;
$.cookie('pma_console_dbg_config', JSON.stringify(this._config));
},
_formatFunctionCall: function(dbgStep) {
var functionName = '';
if ('class' in dbgStep) {
@ -1126,8 +1169,7 @@ var PMA_consoleDebug = {
functionName += dbgStep.function;
if (dbgStep.args.length) {
functionName += '(...)';
}
else {
} else {
functionName += '()';
}
return functionName;
@ -1181,8 +1223,7 @@ var PMA_consoleDebug = {
.append(
$('<span>').text(step)
);
}
else {
} else {
if (typeof step.args === 'string' && step.args) {
step.args = [step.args];
}
@ -1219,14 +1260,80 @@ var PMA_consoleDebug = {
}
return $traceElem;
},
_formatQueryOrGroup: function(queryInfo) {
var grouped, queryText, totalTime, count, i;
if (Array.isArray(queryInfo)) {
// It is grouped
grouped = true;
queryText = queryInfo[0].query;
totalTime = 0;
for (i in queryInfo) {
totalTime += queryInfo[i].time;
}
count = queryInfo.length;
} else {
queryText = queryInfo.query;
totalTime = queryInfo.time;
}
var $query = $('<div class="message collapsed hide_trace">')
.append(
$('#debug_console .templates .debug_query').clone()
)
.append(
$('<div class="query">')
.text(queryText)
);
if (grouped) {
$query.find('.text.count').removeClass('hide');
$query.find('.text.count span').text(count);
}
$query.find('.text.time span').text(totalTime);
if (grouped) {
var $singleQuery;
for (i in queryInfo) {
$singleQuery = $('<div class="message welcome trace">')
.text( (parseInt(i) + 1) + '.' )
.append(
$('<span class="time">').text(
PMA_messages.strConsoleDebugTimeTaken +
' ' + queryInfo[i].time + 's'
)
);
this._appendQueryExtraInfo(queryInfo[i], $singleQuery);
$query
.append('<div class="message welcome trace">')
.append($singleQuery);
}
} else {
this._appendQueryExtraInfo(queryInfo, $query);
}
return $query;
},
_appendQueryExtraInfo: function(query, $elem) {
if ('error' in query) {
$elem.append(
$('<div>').html(query.error)
);
}
$elem.append(this._formatBackTrace(query.trace));
},
showLog: function(debugInfo, url) {
this._lastDebugInfo.debugInfo = debugInfo;
this._lastDebugInfo.url = url;
$('#debug_console .debugLog').empty();
$("#debug_console .debug>.welcome").empty();
var debugJson = false;
if (typeof debugInfo === "object" && 'queries' in debugInfo) {
debugJson = debugInfo;
}
else if (typeof debugInfo === "string") {
} else if (typeof debugInfo === "string") {
try {
debugJson = JSON.parse(debugInfo);
} catch (e) {
@ -1249,7 +1356,7 @@ var PMA_consoleDebug = {
// Calculate total time and make unique query array
var totalTime = 0;
var i, query;
var i;
for (i = 0; i < totalExec; ++i) {
totalTime += allQueries[i].time;
if (!(allQueries[i].hash in uniqueQueries)) {
@ -1281,29 +1388,21 @@ var PMA_consoleDebug = {
);
}
for (i = 0; i < totalExec; ++i) {
query = $('<div class="message collapsed hide_trace">')
.append(
$('<div class="action_content">')
.append(
$('#debug_console .templates .debug_query').clone()
)
)
.append(
$('<div class="query">')
.text(allQueries[i].query)
);
query.find('.text.time span').text(allQueries[i].time);
if ('error' in allQueries[i]) {
query.append(
$('<div>').html(allQueries[i].error)
);
if (this.configParam('groupQueries')) {
for (i in uniqueQueries) {
$('#debug_console .debugLog').append(this._formatQueryOrGroup(uniqueQueries[i]));
}
} else {
for (i = 0; i < totalExec; ++i) {
$('#debug_console .debugLog').append(this._formatQueryOrGroup(allQueries[i]));
}
query.append(this._formatBackTrace(allQueries[i].trace));
$('#debug_console .debugLog').append(query);
}
PMA_consoleMessages._msgEventBinds($('#debug_console .message:not(.binded)'));
},
refresh: function() {
var last = this._lastDebugInfo;
PMA_consoleDebug.showLog(last.debugInfo, last.url);
}
};

View File

@ -593,6 +593,7 @@ $js_messages['strConsoleDebugSummary'] = __('%s queries executed %s times in %s
$js_messages['strConsoleDebugArgsSummary'] = __('%s argument(s) passed');
$js_messages['strConsoleDebugShowArgs'] = __('Show arguments');
$js_messages['strConsoleDebugHideArgs'] = __('Hide arguments');
$js_messages['strConsoleDebugTimeTaken'] = __('Time taken:');
$js_messages['strNoLocalStorage'] = __('Your web browser does not support local storage of settings or the quota limit has been reached, some features may not work properly for you. In Safari, such problem is commonly caused by "Private Mode Browsing".');
echo "var PMA_messages = new Array();\n";

View File

@ -272,22 +272,29 @@ class PMA_Console
// Debug SQL card
$output .= '<div class="card" id="debug_console">';
$output .= '<div class="toolbar"><div class="switch_button">'
. '<span>' . __('Debug SQL') . '</span>'
. '</div></div>'; // Toolbar
$output .= '<div class="toolbar">'
. '<div class="switch_button">'
. '<span>' . __('Debug SQL') . '</span>'
. '</div>'
. '<div class="button group_queries">'
. '<span>' . __('Group queries') . '</span>'
. '</div>'
. '<div class="button ungroup_queries">'
. '<span>' . __('Ungroup queries') . '</span>'
. '</div>'
. '</div>'; // Toolbar
$output .= '<div class="content debug">';
$output .= '<div class="message welcome"></div>';
$output .= '<div class="debugLog"></div>';
$output .= '</div>'; // Content
$output .= '<div class="templates">'
. '<div class="debug_query">'
. '<div class="debug_query action_content">'
. '<span class="action collapse">' . __('Collapse') . '</span> '
. '<span class="action expand">' . __('Expand') . '</span> '
. '<span class="action dbg_show_trace">' . __('Show trace') . '</span> '
. '<span class="action dbg_hide_trace">' . __('Hide trace') . '</span> '
. '<span class="text time">' . __('Time taken:')
. ' <span></span>s'
. '</span>'
. '<span class="text count hide">' . __('Count:') . ' <span></span></span>'
. '<span class="text time">' . __('Time taken:') . ' <span></span>s</span>'
. '</div>'
. '</div>'; // Template
$output .= '</div>'; // Debug SQL card

View File

@ -142,7 +142,6 @@ class PMA_DatabaseInterface
= '<span style="color:red">'
. htmlspecialchars($error_message) . '</span>';
}
$dbgInfo['count'] = 1;
$dbgInfo['query'] = htmlspecialchars($query);
$dbgInfo['time'] = $time;
// Get and slightly format backtrace

View File

@ -2928,9 +2928,21 @@ html.ie7 #pma_console .query_input {
margin: 0;
padding: 2px 4px;
}
#pma_console .button.debug.hide {
#pma_console .button.hide,
#pma_console .message span.text.hide {
display: none;
}
#debug_console.grouped .ungroup_queries,
#debug_console.ungrouped .group_queries {
display: inline-block;
}
#debug_console.ungrouped .ungroup_queries,
#debug_console.grouped .group_queries {
display: none;
}
#debug_console .count {
margin-right: 8px;
}
#debug_console .show_trace .trace,
#debug_console .show_args .args {
display: block;
@ -2945,6 +2957,7 @@ html.ie7 #pma_console .query_input {
}
#debug_console .traceStep:after,
#debug_console .trace.welcome:after,
#debug_console .debug>.welcome:after {
content: "";
display: table;
@ -2953,6 +2966,9 @@ html.ie7 #pma_console .query_input {
#debug_console .debug_summary {
float: left;
}
#debug_console .trace.welcome .time {
float: right;
}
#debug_console .traceStep .file,
#debug_console .script_name {
float: right;

View File

@ -3250,9 +3250,21 @@ html.ie7 #pma_console .query_input {
margin: 0;
padding: 2px 4px;
}
#pma_console .button.debug.hide {
#pma_console .button.hide,
#pma_console .message span.text.hide {
display: none;
}
#debug_console.grouped .ungroup_queries,
#debug_console.ungrouped .group_queries {
display: inline-block;
}
#debug_console.ungrouped .ungroup_queries,
#debug_console.grouped .group_queries {
display: none;
}
#debug_console .count {
margin-right: 8px;
}
#debug_console .show_trace .trace,
#debug_console .show_args .args {
display: block;
@ -3267,6 +3279,7 @@ html.ie7 #pma_console .query_input {
}
#debug_console .traceStep:after,
#debug_console .trace.welcome:after,
#debug_console .debug>.welcome:after {
content: "";
display: table;
@ -3275,6 +3288,9 @@ html.ie7 #pma_console .query_input {
#debug_console .debug_summary {
float: left;
}
#debug_console .trace.welcome .time {
float: right;
}
#debug_console .traceStep .file,
#debug_console .script_name {
float: right;