Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/phpmyadmin/phpmyadmin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Foellmann <foellmann@foe-services.de>2014-04-05 17:35:38 +0400
committerChristian Foellmann <foellmann@foe-services.de>2014-04-05 17:35:38 +0400
commit9eb27ef6ebc763ddc6f6278462b8ffeed6de0e36 (patch)
treed3b4a1c7ae68cafb05b9d60040c9c22d457cee62 /libraries/server_status_monitor.lib.php
parentd472216554769ba596795f23a70c1809fa8897a3 (diff)
INIT phpmyadmin 4.1.12 multilanguage
Diffstat (limited to 'libraries/server_status_monitor.lib.php')
-rw-r--r--libraries/server_status_monitor.lib.php798
1 files changed, 798 insertions, 0 deletions
diff --git a/libraries/server_status_monitor.lib.php b/libraries/server_status_monitor.lib.php
new file mode 100644
index 0000000000..a2c6f35396
--- /dev/null
+++ b/libraries/server_status_monitor.lib.php
@@ -0,0 +1,798 @@
+<?php
+/* vim: set expandtab sw=4 ts=4 sts=4: */
+
+/**
+ * functions for displaying server status sub item: monitor
+ *
+ * @usedby server_status_monitor.php
+ *
+ * @package PhpMyAdmin
+ */
+if (! defined('PHPMYADMIN')) {
+ exit;
+}
+
+/**
+ * Prints html with monitor
+ *
+ * @param object $ServerStatusData An instance of the PMA_ServerStatusData class
+ *
+ * @return string
+ */
+function PMA_getHtmlForMonitor($ServerStatusData)
+{
+ $retval = PMA_getHtmlForTabLinks();
+
+ $retval .= PMA_getHtmlForSettingsDialog();
+
+ $retval .= PMA_getHtmlForInstructionsDialog();
+
+ $retval .= PMA_getHtmlForAddChartDialog();
+
+ if (! PMA_DRIZZLE) {
+ $retval .= PMA_getHtmlForAnalyseDialog();
+ }
+
+ $retval .= '<table class="clearfloat" id="chartGrid"></table>';
+ $retval .= '<div id="logTable">';
+ $retval .= '<br/>';
+ $retval .= '</div>';
+
+ $retval .= '<script type="text/javascript">';
+ $retval .= 'variableNames = [ ';
+ $i=0;
+ foreach ($ServerStatusData->status as $name=>$value) {
+ if (is_numeric($value)) {
+ if ($i++ > 0) {
+ $retval .= ", ";
+ }
+ $retval .= "'" . $name . "'";
+ }
+ }
+ $retval .= '];';
+ $retval .= '</script>';
+
+ return $retval;
+}
+
+/**
+ * Builds a <select> list for refresh rates
+ *
+ * @param string $name Name of select
+ * @param int $defaultRate Currently chosen rate
+ * @param array $refreshRates List of refresh rates
+ *
+ * @return string
+ */
+function PMA_getHtmlForRefreshList($name,
+ $defaultRate = 5,
+ $refreshRates = Array(1, 2, 5, 10, 20, 40, 60, 120, 300, 600)
+) {
+ $return = '<select name="' . $name . '" id="id_' . $name
+ . '" class="refreshRate">';
+ foreach ($refreshRates as $rate) {
+ $selected = ($rate == $defaultRate)?' selected="selected"':'';
+ $return .= '<option value="' . $rate . '"' . $selected . '>';
+ if ($rate < 60) {
+ $return .= sprintf(_ngettext('%d second', '%d seconds', $rate), $rate);
+ } else {
+ $rate = $rate / 60;
+ $return .= sprintf(_ngettext('%d minute', '%d minutes', $rate), $rate);
+ }
+ $return .= '</option>';
+ }
+ $return .= '</select>';
+ return $return;
+}
+
+/**
+ * Returns html for Analyse Dialog
+ *
+ * @return string
+ */
+function PMA_getHtmlForAnalyseDialog()
+{
+ $retval = '<div id="logAnalyseDialog" title="';
+ $retval .= __('Log statistics') . '" style="display:none;">';
+ $retval .= '<p>' . __('Selected time range:');
+ $retval .= '<input type="text" name="dateStart"'
+ . ' class="datetimefield" value="" /> - ';
+ $retval .= '<input type="text" name="dateEnd" class="datetimefield" value="" />';
+ $retval .= '</p>';
+ $retval .= '<input type="checkbox" id="limitTypes"'
+ . ' value="1" checked="checked" />';
+ $retval .= '<label for="limitTypes">';
+ $retval .= __('Only retrieve SELECT,INSERT,UPDATE and DELETE Statements');
+ $retval .= '</label>';
+ $retval .= '<br/>';
+ $retval .= '<input type="checkbox" id="removeVariables"'
+ . ' value="1" checked="checked" />';
+ $retval .= '<label for="removeVariables">';
+ $retval .= __('Remove variable data in INSERT statements for better grouping');
+ $retval .= '</label>';
+ $retval .= '<p>';
+ $retval .= __(
+ 'Choose from which log you want the statistics to be generated from.'
+ );
+ $retval .= '</p>';
+ $retval .= '<p>';
+ $retval .= __('Results are grouped by query text.');
+ $retval .= '</p>';
+ $retval .= '</div>';
+ $retval .= '<div id="queryAnalyzerDialog" title="';
+ $retval .= __('Query analyzer') . '" style="display:none;">';
+ $retval .= '<textarea id="sqlquery"> </textarea>';
+ $retval .= '<p></p>';
+ $retval .= '<div class="placeHolder"></div>';
+ $retval .= '</div>';
+
+ return $retval;
+}
+
+/**
+ * Returns html for Instructions Dialog
+ *
+ * @return string
+ */
+function PMA_getHtmlForInstructionsDialog()
+{
+ $retval = '<div id="monitorInstructionsDialog" title="';
+ $retval .= __('Monitor Instructions') . '" style="display:none;">';
+ $retval .= __(
+ 'The phpMyAdmin Monitor can assist you in optimizing the server'
+ . ' configuration and track down time intensive queries. For the latter you'
+ . ' will need to set log_output to \'TABLE\' and have either the'
+ . ' slow_query_log or general_log enabled. Note however, that the'
+ . ' general_log produces a lot of data and increases server load'
+ . ' by up to 15%.'
+ );
+
+ if (PMA_MYSQL_INT_VERSION < 50106) {
+ $retval .= '<p>';
+ $retval .= PMA_Util::getImage('s_attention.png');
+ $retval .= __(
+ 'Unfortunately your Database server does not support logging to table,'
+ . ' which is a requirement for analyzing the database logs with'
+ . ' phpMyAdmin. Logging to table is supported by MySQL 5.1.6 and'
+ . ' onwards. You may still use the server charting features however.'
+ );
+ $retval .= '</p>';
+ } else {
+ $retval .= '<p></p>';
+ $retval .= '<img class="ajaxIcon" src="';
+ $retval .= $GLOBALS['pmaThemeImage'] . 'ajax_clock_small.gif"';
+ $retval .= ' alt="' . __('Loading…') . '" />';
+ $retval .= '<div class="ajaxContent"></div>';
+ $retval .= '<div class="monitorUse" style="display:none;">';
+ $retval .= '<p></p>';
+ $retval .= '<strong>';
+ $retval .= __('Using the monitor:');
+ $retval .= '</strong><p>';
+ $retval .= __(
+ 'Your browser will refresh all displayed charts in a regular interval.'
+ . ' You may add charts and change the refresh rate under \'Settings\','
+ . ' or remove any chart using the cog icon on each respective chart.'
+ );
+ $retval .= '</p><p>';
+ $retval .= __(
+ 'To display queries from the logs, select the relevant time span on any'
+ . ' chart by holding down the left mouse button and panning over the'
+ . ' chart. Once confirmed, this will load a table of grouped queries,'
+ . ' there you may click on any occurring SELECT statements to further'
+ . ' analyze them.'
+ );
+ $retval .= '</p>';
+ $retval .= '<p>';
+ $retval .= PMA_Util::getImage('s_attention.png');
+ $retval .= '<strong>';
+ $retval .= __('Please note:');
+ $retval .= '</strong><br />';
+ $retval .= __(
+ 'Enabling the general_log may increase the server load by'
+ . ' 5-15%. Also be aware that generating statistics from the logs is a'
+ . ' load intensive task, so it is advisable to select only a small time'
+ . ' span and to disable the general_log and empty its table once'
+ . ' monitoring is not required any more.'
+ );
+ $retval .= '</p>';
+ $retval .= '</div>';
+ }
+ $retval .= '</div>';
+
+ return $retval;
+}
+
+/**
+ * Returns html for addChartDialog
+ *
+ * @return string
+ */
+function PMA_getHtmlForAddChartDialog()
+{
+ $retval = '<div id="addChartDialog" title="'
+ . __('Add chart') . '" style="display:none;">';
+ $retval .= '<div id="tabGridVariables">';
+ $retval .= '<p><input type="text" name="chartTitle" value="'
+ . __('Chart Title') . '" /></p>';
+ $retval .= '<input type="radio" name="chartType"'
+ . ' value="preset" id="chartPreset" />';
+ $retval .= '<label for="chartPreset">' . __('Preset chart') . '</label>';
+ $retval .= '<select name="presetCharts"></select><br/>';
+ $retval .= '<input type="radio" name="chartType" value="variable" '
+ . 'id="chartStatusVar" checked="checked" />';
+ $retval .= '<label for="chartStatusVar">';
+ $retval .= __('Status variable(s)');
+ $retval .= '</label><br/>';
+ $retval .= '<div id="chartVariableSettings">';
+ $retval .= '<label for="chartSeries">' . __('Select series:') . '</label><br />';
+ $retval .= '<select id="chartSeries" name="varChartList" size="1">';
+ $retval .= '<option>' . __('Commonly monitored') . '</option>';
+ $retval .= '<option>Processes</option>';
+ $retval .= '<option>Questions</option>';
+ $retval .= '<option>Connections</option>';
+ $retval .= '<option>Bytes_sent</option>';
+ $retval .= '<option>Bytes_received</option>';
+ $retval .= '<option>Threads_connected</option>';
+ $retval .= '<option>Created_tmp_disk_tables</option>';
+ $retval .= '<option>Handler_read_first</option>';
+ $retval .= '<option>Innodb_buffer_pool_wait_free</option>';
+ $retval .= '<option>Key_reads</option>';
+ $retval .= '<option>Open_tables</option>';
+ $retval .= '<option>Select_full_join</option>';
+ $retval .= '<option>Slow_queries</option>';
+ $retval .= '</select><br />';
+ $retval .= '<label for="variableInput">';
+ $retval .= __('or type variable name:');
+ $retval .= ' </label>';
+ $retval .= '<input type="text" name="variableInput" id="variableInput" />';
+ $retval .= '<p></p>';
+ $retval .= '<input type="checkbox" name="differentialValue"'
+ . ' id="differentialValue" value="differential" checked="checked" />';
+ $retval .= '<label for="differentialValue">';
+ $retval .= __('Display as differential value');
+ $retval .= '</label><br />';
+ $retval .= '<input type="checkbox" id="useDivisor"'
+ . ' name="useDivisor" value="1" />';
+ $retval .= '<label for="useDivisor">' . __('Apply a divisor') . '</label>';
+ $retval .= '<span class="divisorInput" style="display:none;">';
+ $retval .= '<input type="text" name="valueDivisor" size="4" value="1" />';
+ $retval .= '(<a href="#kibDivisor">' . __('KiB') . '</a>, ';
+ $retval .= '<a href="#mibDivisor">' . __('MiB') . '</a>)';
+ $retval .= '</span><br />';
+ $retval .= '<input type="checkbox" id="useUnit" name="useUnit" value="1" />';
+ $retval .= '<label for="useUnit">';
+ $retval .= __('Append unit to data values');
+ $retval .= '</label>';
+ $retval .= '<span class="unitInput" style="display:none;">';
+ $retval .= '<input type="text" name="valueUnit" size="4" value="" />';
+ $retval .= '</span>';
+ $retval .= '<p>';
+ $retval .= '<a href="#submitAddSeries"><b>' . __('Add this series') . '</b></a>';
+ $retval .= '<span id="clearSeriesLink" style="display:none;">';
+ $retval .= ' | <a href="#submitClearSeries">' . __('Clear series') . '</a>';
+ $retval .= '</span>';
+ $retval .= '</p>';
+ $retval .= __('Series in Chart:');
+ $retval .= '<br/>';
+ $retval .= '<span id="seriesPreview">';
+ $retval .= '<i>' . __('None') . '</i>';
+ $retval .= '</span>';
+ $retval .= '</div>';
+ $retval .= '</div>';
+ $retval .= '</div>';
+
+ return $retval;
+}
+
+/**
+ * Returns html with Tab Links
+ *
+ * @return string
+ */
+function PMA_getHtmlForTabLinks()
+{
+ $retval = '<div class="tabLinks">';
+ $retval .= '<a href="#pauseCharts">';
+ $retval .= PMA_Util::getImage('play.png') . __('Start Monitor');
+ $retval .= '</a>';
+ $retval .= '<a href="#settingsPopup" class="popupLink">';
+ $retval .= PMA_Util::getImage('s_cog.png') . __('Settings');
+ $retval .= '</a>';
+ if (! PMA_DRIZZLE) {
+ $retval .= '<a href="#monitorInstructionsDialog">';
+ $retval .= PMA_Util::getImage('b_help.png') . __('Instructions/Setup');
+ }
+ $retval .= '<a href="#endChartEditMode" style="display:none;">';
+ $retval .= PMA_Util::getImage('s_okay.png');
+ $retval .= __('Done dragging (rearranging) charts');
+ $retval .= '</a>';
+ $retval .= '</div>';
+
+ return $retval;
+}
+
+/**
+ * Returns html with Settings dialog
+ *
+ * @return string
+ */
+function PMA_getHtmlForSettingsDialog()
+{
+ $retval = '<div class="popupContent settingsPopup">';
+ $retval .= '<a href="#addNewChart">';
+ $retval .= PMA_Util::getImage('b_chart.png') . __('Add chart');
+ $retval .= '</a>';
+ $retval .= '<a href="#rearrangeCharts">';
+ $retval .= PMA_Util::getImage('b_tblops.png') . __('Enable charts dragging');
+ $retval .= '</a>';
+ $retval .= '<div class="clearfloat paddingtop"></div>';
+ $retval .= '<div class="floatleft">';
+ $retval .= __('Refresh rate') . '<br />';
+ $retval .= PMA_getHtmlForRefreshList(
+ 'gridChartRefresh',
+ 5,
+ Array(2, 3, 4, 5, 10, 20, 40, 60, 120, 300, 600, 1200)
+ );
+ $retval .= '<br />';
+ $retval .= '</div>';
+ $retval .= '<div class="floatleft">';
+ $retval .= __('Chart columns');
+ $retval .= '<br />';
+ $retval .= '<select name="chartColumns">';
+ $retval .= '<option>1</option>';
+ $retval .= '<option>2</option>';
+ $retval .= '<option>3</option>';
+ $retval .= '<option>4</option>';
+ $retval .= '<option>5</option>';
+ $retval .= '<option>6</option>';
+ $retval .= '<option>7</option>';
+ $retval .= '<option>8</option>';
+ $retval .= '<option>9</option>';
+ $retval .= '<option>10</option>';
+ $retval .= '</select>';
+ $retval .= '</div>';
+ $retval .= '<div class="clearfloat paddingtop">';
+ $retval .= '<b>' . __('Chart arrangement') . '</b> ';
+ $retval .= PMA_Util::showHint(
+ __(
+ 'The arrangement of the charts is stored to the browsers local storage. '
+ . 'You may want to export it if you have a complicated set up.'
+ )
+ );
+ $retval .= '<br/>';
+ $retval .= '<a class="ajax" href="#importMonitorConfig">';
+ $retval .= __('Import');
+ $retval .= '</a>';
+ $retval .= '&nbsp;&nbsp;';
+ $retval .= '<a class="disableAjax" href="#exportMonitorConfig">';
+ $retval .= __('Export');
+ $retval .= '</a>';
+ $retval .= '&nbsp;&nbsp;';
+ $retval .= '<a href="#clearMonitorConfig">';
+ $retval .= __('Reset to default');
+ $retval .= '</a>';
+ $retval .= '</div>';
+ $retval .= '</div>';
+
+ return $retval;
+}
+
+
+/**
+ * Define some data and links needed on the client side
+ *
+ * @param object $ServerStatusData An instance of the PMA_ServerStatusData class
+ *
+ * @return string
+ */
+function PMA_getHtmlForClientSideDataAndLinks($ServerStatusData)
+{
+ /**
+ * Define some data needed on the client side
+ */
+ $input = '<input type="hidden" name="%s" value="%s" />';
+ $form = '<form id="js_data" class="hide">';
+ $form .= sprintf($input, 'server_time', microtime(true) * 1000);
+ $form .= sprintf($input, 'server_os', PHP_OS);
+ $form .= sprintf($input, 'is_superuser', $GLOBALS['dbi']->isSuperuser());
+ $form .= sprintf($input, 'server_db_isLocal', $ServerStatusData->db_isLocal);
+ $form .= '</form>';
+ /**
+ * Define some links used on client side
+ */
+ $links = '<div id="profiling_docu" class="hide">';
+ $links .= PMA_Util::showMySQLDocu('general-thread-states');
+ $links .= '</div>';
+ $links .= '<div id="explain_docu" class="hide">';
+ $links .= PMA_Util::showMySQLDocu('explain-output');
+ $links .= '</div>';
+
+ return $form . $links;
+}
+
+/***************************Ajax request function***********************************/
+
+/**
+ * Returns JSon for real-time charting data
+ *
+ * @return Array
+ */
+function PMA_getJsonForChartingData()
+{
+ $ret = json_decode($_REQUEST['requiredData'], true);
+ $statusVars = array();
+ $serverVars = array();
+ $sysinfo = $cpuload = $memory = 0;
+ $pName = '';
+
+ /* Accumulate all required variables and data */
+ // For each chart
+ foreach ($ret as $chart_id => $chartNodes) {
+ // For each data series
+ foreach ($chartNodes as $node_id => $nodeDataPoints) {
+ // For each data point in the series (usually just 1)
+ foreach ($nodeDataPoints as $point_id => $dataPoint) {
+ $pName = $dataPoint['name'];
+
+ switch ($dataPoint['type']) {
+ /* We only collect the status and server variables here to
+ * read them all in one query,
+ * and only afterwards assign them.
+ * Also do some white list filtering on the names
+ */
+ case 'servervar':
+ if (! preg_match('/[^a-zA-Z_]+/', $pName)) {
+ $serverVars[] = $pName;
+ }
+ break;
+
+ case 'statusvar':
+ if (! preg_match('/[^a-zA-Z_]+/', $pName)) {
+ $statusVars[] = $pName;
+ }
+ break;
+
+ case 'proc':
+ $result = $GLOBALS['dbi']->query('SHOW PROCESSLIST');
+ $ret[$chart_id][$node_id][$point_id]['value']
+ = $GLOBALS['dbi']->numRows($result);
+ break;
+
+ case 'cpu':
+ if (!$sysinfo) {
+ include_once 'libraries/sysinfo.lib.php';
+ $sysinfo = PMA_getSysInfo();
+ }
+ if (!$cpuload) {
+ $cpuload = $sysinfo->loadavg();
+ }
+
+ if (PMA_getSysInfoOs() == 'Linux') {
+ $ret[$chart_id][$node_id][$point_id]['idle']
+ = $cpuload['idle'];
+ $ret[$chart_id][$node_id][$point_id]['busy']
+ = $cpuload['busy'];
+ } else {
+ $ret[$chart_id][$node_id][$point_id]['value']
+ = $cpuload['loadavg'];
+ }
+
+ break;
+
+ case 'memory':
+ if (!$sysinfo) {
+ include_once 'libraries/sysinfo.lib.php';
+ $sysinfo = PMA_getSysInfo();
+ }
+ if (!$memory) {
+ $memory = $sysinfo->memory();
+ }
+
+ $ret[$chart_id][$node_id][$point_id]['value']
+ = $memory[$pName];
+ break;
+ } /* switch */
+ } /* foreach */
+ } /* foreach */
+ } /* foreach */
+
+ // Retrieve all required status variables
+ if (count($statusVars)) {
+ $statusVarValues = $GLOBALS['dbi']->fetchResult(
+ "SHOW GLOBAL STATUS WHERE Variable_name='"
+ . implode("' OR Variable_name='", $statusVars) . "'",
+ 0,
+ 1
+ );
+ } else {
+ $statusVarValues = array();
+ }
+
+ // Retrieve all required server variables
+ if (count($serverVars)) {
+ $serverVarValues = $GLOBALS['dbi']->fetchResult(
+ "SHOW GLOBAL VARIABLES WHERE Variable_name='"
+ . implode("' OR Variable_name='", $serverVars) . "'",
+ 0,
+ 1
+ );
+ } else {
+ $serverVarValues = array();
+ }
+
+ // ...and now assign them
+ foreach ($ret as $chart_id => $chartNodes) {
+ foreach ($chartNodes as $node_id => $nodeDataPoints) {
+ foreach ($nodeDataPoints as $point_id => $dataPoint) {
+ switch($dataPoint['type']) {
+ case 'statusvar':
+ $ret[$chart_id][$node_id][$point_id]['value']
+ = $statusVarValues[$dataPoint['name']];
+ break;
+ case 'servervar':
+ $ret[$chart_id][$node_id][$point_id]['value']
+ = $serverVarValues[$dataPoint['name']];
+ break;
+ }
+ }
+ }
+ }
+
+ $ret['x'] = microtime(true) * 1000;
+ return $ret;
+}
+
+/**
+ * Returns JSon for log data with type: slow
+ *
+ * @param int $start Unix Time: Start time for query
+ * @param int $end Unix Time: End time for query
+ *
+ * @return Array
+ */
+function PMA_getJsonForLogDataTypeSlow($start, $end)
+{
+ $q = 'SELECT start_time, user_host, ';
+ $q .= 'Sec_to_Time(Sum(Time_to_Sec(query_time))) as query_time, ';
+ $q .= 'Sec_to_Time(Sum(Time_to_Sec(lock_time))) as lock_time, ';
+ $q .= 'SUM(rows_sent) AS rows_sent, ';
+ $q .= 'SUM(rows_examined) AS rows_examined, db, sql_text, ';
+ $q .= 'COUNT(sql_text) AS \'#\' ';
+ $q .= 'FROM `mysql`.`slow_log` ';
+ $q .= 'WHERE start_time > FROM_UNIXTIME(' . $start . ') ';
+ $q .= 'AND start_time < FROM_UNIXTIME(' . $end . ') GROUP BY sql_text';
+
+ $result = $GLOBALS['dbi']->tryQuery($q);
+
+ $return = array('rows' => array(), 'sum' => array());
+ $type = '';
+
+ while ($row = $GLOBALS['dbi']->fetchAssoc($result)) {
+ $type = strtolower(
+ substr($row['sql_text'], 0, strpos($row['sql_text'], ' '))
+ );
+
+ switch($type) {
+ case 'insert':
+ case 'update':
+ //Cut off big inserts and updates, but append byte count instead
+ if (strlen($row['sql_text']) > 220) {
+ $implode_sql_text = implode(
+ ' ',
+ PMA_Util::formatByteDown(
+ strlen($row['sql_text']), 2, 2
+ )
+ );
+ $row['sql_text'] = substr($row['sql_text'], 0, 200)
+ . '... [' . $implode_sql_text . ']';
+ }
+ break;
+ default:
+ break;
+ }
+
+ if (! isset($return['sum'][$type])) {
+ $return['sum'][$type] = 0;
+ }
+ $return['sum'][$type] += $row['#'];
+ $return['rows'][] = $row;
+ }
+
+ $return['sum']['TOTAL'] = array_sum($return['sum']);
+ $return['numRows'] = count($return['rows']);
+
+ $GLOBALS['dbi']->freeResult($result);
+ return $return;
+}
+
+/**
+ * Returns JSon for log data with type: general
+ *
+ * @param int $start Unix Time: Start time for query
+ * @param int $end Unix Time: End time for query
+ *
+ * @return Array
+ */
+function PMA_getJsonForLogDataTypeGeneral($start, $end)
+{
+ $limitTypes = '';
+ if (isset($_REQUEST['limitTypes']) && $_REQUEST['limitTypes']) {
+ $limitTypes
+ = 'AND argument REGEXP \'^(INSERT|SELECT|UPDATE|DELETE)\' ';
+ }
+
+ $q = 'SELECT TIME(event_time) as event_time, user_host, thread_id, ';
+ $q .= 'server_id, argument, count(argument) as \'#\' ';
+ $q .= 'FROM `mysql`.`general_log` ';
+ $q .= 'WHERE command_type=\'Query\' ';
+ $q .= 'AND event_time > FROM_UNIXTIME(' . $start . ') ';
+ $q .= 'AND event_time < FROM_UNIXTIME(' . $end . ') ';
+ $q .= $limitTypes . 'GROUP by argument'; // HAVING count > 1';
+
+ $result = $GLOBALS['dbi']->tryQuery($q);
+
+ $return = array('rows' => array(), 'sum' => array());
+ $type = '';
+ $insertTables = array();
+ $insertTablesFirst = -1;
+ $i = 0;
+ $removeVars = isset($_REQUEST['removeVariables'])
+ && $_REQUEST['removeVariables'];
+
+ while ($row = $GLOBALS['dbi']->fetchAssoc($result)) {
+ preg_match('/^(\w+)\s/', $row['argument'], $match);
+ $type = strtolower($match[1]);
+
+ if (! isset($return['sum'][$type])) {
+ $return['sum'][$type] = 0;
+ }
+ $return['sum'][$type] += $row['#'];
+
+ switch($type) {
+ case 'insert':
+ // Group inserts if selected
+ if ($removeVars
+ && preg_match(
+ '/^INSERT INTO (`|\'|"|)([^\s\\1]+)\\1/i',
+ $row['argument'], $matches
+ )
+ ) {
+ $insertTables[$matches[2]]++;
+ if ($insertTables[$matches[2]] > 1) {
+ $return['rows'][$insertTablesFirst]['#']
+ = $insertTables[$matches[2]];
+
+ // Add a ... to the end of this query to indicate that
+ // there's been other queries
+ $temp = $return['rows'][$insertTablesFirst]['argument'];
+ if ($temp[strlen($temp) - 1] != '.') {
+ $return['rows'][$insertTablesFirst]['argument']
+ .= '<br/>...';
+ }
+
+ // Group this value, thus do not add to the result list
+ continue 2;
+ } else {
+ $insertTablesFirst = $i;
+ $insertTables[$matches[2]] += $row['#'] - 1;
+ }
+ }
+ // No break here
+
+ case 'update':
+ // Cut off big inserts and updates,
+ // but append byte count therefor
+ if (strlen($row['argument']) > 220) {
+ $row['argument'] = substr($row['argument'], 0, 200)
+ . '... ['
+ . implode(
+ ' ',
+ PMA_Util::formatByteDown(
+ strlen($row['argument']),
+ 2,
+ 2
+ )
+ )
+ . ']';
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ $return['rows'][] = $row;
+ $i++;
+ }
+
+ $return['sum']['TOTAL'] = array_sum($return['sum']);
+ $return['numRows'] = count($return['rows']);
+
+ $GLOBALS['dbi']->freeResult($result);
+
+ return $return;
+}
+/**
+ * Returns JSon for logging vars
+ *
+ * @return Array
+ */
+function PMA_getJsonForLoggingVars()
+{
+ if (isset($_REQUEST['varName']) && isset($_REQUEST['varValue'])) {
+ $value = PMA_Util::sqlAddSlashes($_REQUEST['varValue']);
+ if (! is_numeric($value)) {
+ $value="'" . $value . "'";
+ }
+
+ if (! preg_match("/[^a-zA-Z0-9_]+/", $_REQUEST['varName'])) {
+ $GLOBALS['dbi']->query(
+ 'SET GLOBAL ' . $_REQUEST['varName'] . ' = ' . $value
+ );
+ }
+
+ }
+
+ $loggingVars = $GLOBALS['dbi']->fetchResult(
+ 'SHOW GLOBAL VARIABLES WHERE Variable_name IN'
+ . ' ("general_log","slow_query_log","long_query_time","log_output")',
+ 0,
+ 1
+ );
+ return $loggingVars;
+}
+
+/**
+ * Returns JSon for query_analyzer
+ *
+ * @return Array
+ */
+function PMA_getJsonForQueryAnalyzer()
+{
+ $return = array();
+
+ if (strlen($_REQUEST['database'])) {
+ $GLOBALS['dbi']->selectDb($_REQUEST['database']);
+ }
+
+ if ($profiling = PMA_Util::profilingSupported()) {
+ $GLOBALS['dbi']->query('SET PROFILING=1;');
+ }
+
+ // Do not cache query
+ $query = preg_replace(
+ '/^(\s*SELECT)/i',
+ '\\1 SQL_NO_CACHE',
+ $_REQUEST['query']
+ );
+
+ $result = $GLOBALS['dbi']->tryQuery($query);
+ $return['affectedRows'] = $GLOBALS['cached_affected_rows'];
+
+ $result = $GLOBALS['dbi']->tryQuery('EXPLAIN ' . $query);
+ while ($row = $GLOBALS['dbi']->fetchAssoc($result)) {
+ $return['explain'][] = $row;
+ }
+
+ // In case an error happened
+ $return['error'] = $GLOBALS['dbi']->getError();
+
+ $GLOBALS['dbi']->freeResult($result);
+
+ if ($profiling) {
+ $return['profiling'] = array();
+ $result = $GLOBALS['dbi']->tryQuery(
+ 'SELECT seq,state,duration FROM INFORMATION_SCHEMA.PROFILING'
+ . ' WHERE QUERY_ID=1 ORDER BY seq'
+ );
+ while ($row = $GLOBALS['dbi']->fetchAssoc($result)) {
+ $return['profiling'][]= $row;
+ }
+ $GLOBALS['dbi']->freeResult($result);
+ }
+ return $return;
+}
+
+?>
+
+