diff --git a/phpBB/includes/db/mysql.php b/phpBB/includes/db/mysql.php
index 040f057f4e..8ef18de9df 100644
--- a/phpBB/includes/db/mysql.php
+++ b/phpBB/includes/db/mysql.php
@@ -30,7 +30,6 @@ class sql_db
var $query_result;
var $return_on_error = false;
var $transaction = false;
- var $sql_report = '';
var $sql_time = 0;
var $num_queries = 0;
var $open_queries = array();
@@ -119,70 +118,23 @@ class sql_db
if ($query != '')
{
global $cache;
-
+
+ // DEBUG
+ $this->sql_report('start', $query);
+
$this->query_result = ($max_age && method_exists($cache, 'sql_load')) ? $cache->sql_load($query, $max_age) : false;
if (!$this->query_result)
{
$this->num_queries++;
- if (!empty($_GET['explain']))
- {
- global $starttime;
-
- $curtime = explode(' ', microtime());
- $curtime = $curtime[0] + $curtime[1] - $starttime;
- }
-
if (($this->query_result = @mysql_query($query, $this->db_connect_id)) === false)
{
$this->sql_error($query);
}
- if (!empty($_GET['explain']))
- {
- $endtime = explode(' ', microtime());
- $endtime = $endtime[0] + $endtime[1] - $starttime;
-
- $this->sql_report .= "
Query:\t" . htmlspecialchars(preg_replace('/[\s]*[\n\r\t]+[\n\r\s\t]*/', "\n\t", $query)) . "\n\n";
-
- if ($this->query_result)
- {
- $this->sql_report .= "Time before: $curtime\nTime after: $endtime\nElapsed time: " . ($endtime - $curtime) . "\n
";
- }
- else
- {
- $error = $this->sql_error();
- $this->sql_report .= 'FAILED - MySQL Error ' . $error['code'] . ': ' . htmlspecialchars($error['message']) . '
';
- }
-
- $this->sql_time += $endtime - $curtime;
-
- if (preg_match('/^SELECT/', $query))
- {
- $html_table = FALSE;
- if ($result = mysql_query("EXPLAIN $query", $this->db_connect_id))
- {
- while ($row = mysql_fetch_assoc($result))
- {
- if (!$html_table && count($row))
- {
- $html_table = TRUE;
- $this->sql_report .= "
\n";
- $this->sql_report .= "\n" . implode(" | \n", array_keys($row)) . " | \n
\n";
- }
- $this->sql_report .= "\n" . implode(" | \n", array_values($row)) . " | \n
\n";
- }
- }
-
- if ($html_table)
- {
- $this->sql_report .= '
';
- }
- }
-
- $this->sql_report .= "
\n";
- }
+ // DEBUG
+ $this->sql_report('stop', $query);
if (preg_match('/^SELECT/', $query))
{
@@ -195,6 +147,11 @@ class sql_db
@mysql_free_result(array_pop($this->open_queries));
}
}
+ else
+ {
+ // DEBUG
+ $this->sql_report('fromcache', $query);
+ }
}
else
{
@@ -216,7 +173,7 @@ class sql_db
$total = -1;
}
- $query .= ' LIMIT ' . ((!empty($offset)) ? $offset . ', ' . $total : $total);
+ $query .= "\n LIMIT " . ((!empty($offset)) ? $offset . ', ' . $total : $total);
return $this->sql_query($query, $max_age);
}
@@ -429,6 +386,149 @@ class sql_db
return $result;
}
+ // DEBUG
+ function sql_report($mode, $query = '')
+ {
+ if (empty($_GET['explain']))
+ {
+ return;
+ }
+
+ global $db, $cache, $starttime, $phpbb_root_path;
+ static $curtime, $query_hold, $html_hold;
+ static $sql_report = '';
+ static $cache_num_queries = 0;
+
+ if (!$query && !empty($query_hold))
+ {
+ $query = $query_hold;
+ }
+
+ switch ($mode)
+ {
+ case 'display':
+ if (!empty($cache))
+ {
+ $cache->unload();
+ }
+ $db->sql_close();
+
+ $mtime = explode(' ', microtime());
+ $totaltime = $mtime[0] + $mtime[1] - $starttime;
+
+ echo '' . $msg_title . '';
+ echo ' | SQL Report |
Page generated in ' . round($totaltime, 4) . " seconds with {$this->num_queries} queries." . (($cache_num_queries) ? " (plus $cache_num_queries " . (($cache_num_queries == 1) ? 'query' : 'queries') . ' returning results from cache)' : '') . ' |
|
Time spent on MySQL queries: | ' . round($this->sql_time, 5) . ' |
Time spent on PHP: | ' . round($totaltime - $this->sql_time, 5) . ' |
';
+
+ echo $sql_report;
+
+ echo ' |
';
+
+ exit;
+ break;
+
+ case 'start':
+ $curtime = explode(' ', microtime());
+ $curtime = $curtime[0] + $curtime[1] - $starttime;
+
+ $query_hold = $query;
+ $html_hold = '';
+
+ $explain_query = $query;
+ if (preg_match('/UPDATE ([a-z0-9_]+).*?WHERE(.*)/s', $query, $m))
+ {
+ $explain_query = 'SELECT * FROM ' . $m[1] . ' WHERE ' . $m[2];
+ }
+ elseif (preg_match('/DELETE FROM ([a-z0-9_]+).*?WHERE(.*)/s', $query, $m))
+ {
+ $explain_query = 'SELECT * FROM ' . $m[1] . ' WHERE ' . $m[2];
+ }
+
+ if (preg_match('/^SELECT/', $explain_query))
+ {
+ $html_table = FALSE;
+
+ if ($result = mysql_query("EXPLAIN $explain_query", $this->db_connect_id))
+ {
+ while ($row = mysql_fetch_assoc($result))
+ {
+ if (!$html_table && count($row))
+ {
+ $html_table = TRUE;
+ $html_hold .= '';
+ $html_hold .= "\n";
+
+ foreach (array_keys($row) as $val)
+ {
+ $html_hold .= '' . (($val) ? ucwords(str_replace('_', ' ', $val)) : ' ') . ' | ';
+ }
+ $html_hold .= "\n
\n";
+ }
+ $html_hold .= "\n";
+
+ $class = 'row1';
+ foreach (array_values($row) as $val)
+ {
+ $class = ($class == 'row1') ? 'row2' : 'row1';
+ $html_hold .= '' . (($val) ? $val : ' ') . ' | ';
+ }
+ $html_hold .= "\n
\n";
+ }
+ }
+
+ if ($html_table)
+ {
+ $html_hold .= '
';
+ }
+ }
+ break;
+
+ case 'fromcache':
+ $endtime = explode(' ', microtime());
+ $endtime = $endtime[0] + $endtime[1] - $starttime;
+
+ $sql_report .= "Query results obtained from the cache\n\nQuery:\t" . preg_replace('/\t(AND|OR)(\W)/', "\t \$1\$2", preg_replace('/(.*)/e', "wordwrap('\$1', 120, '\n\t ')", htmlspecialchars(preg_replace('/[\s]*[\n\r\t]+[\n\r\s\t]*/', "\n\t", $query)))) . "\n\n";
+
+ $sql_report .= "Time before:\t$curtime\nTime after:\t$endtime\nTime elapsed:\t" . ($endtime - $curtime) . "\t(from cache)\n";
+
+ $s = explode(' ', microtime());
+ mysql_query($query, $this->db_connect_id);
+ $e = explode(' ', microtime());
+
+ $sql_report .= "\t\t" . ($e[0] + $e[1] - $s[0] - $s[1]) . "\t(from DB)\n
";
+
+ $cache_num_queries++;
+ break;
+
+ case 'stop':
+ $endtime = explode(' ', microtime());
+ $endtime = $endtime[0] + $endtime[1] - $starttime;
+
+ $sql_report .= "\n
\nQuery#{$this->num_queries}:\t" . preg_replace('/\t(AND|OR)(\W)/', "\t \$1\$2", preg_replace('/(.*)/e', "wordwrap('\$1', 120, '\n\t ')", htmlspecialchars(preg_replace('/[\s]*[\n\r\t]+[\n\r\s\t]*/', "\n\t", $query)))) . "\n\n";
+
+ if ($this->query_result)
+ {
+ if (preg_match('/^(UPDATE|DELETE)/', $query))
+ {
+ $sql_report .= "Affected rows: " . $this->sql_affectedrows($this->query_result) . "\n\n";
+ }
+ $sql_report .= "Time before: $curtime\nTime after: $endtime\nTime elapsed: " . ($endtime - $curtime) . "\n
";
+ }
+ else
+ {
+ $error = $this->sql_error();
+ $sql_report .= 'FAILED - MySQL Error ' . $error['code'] . ': ' . htmlspecialchars($error['message']) . '
';
+ }
+
+ $sql_report .= $html_hold;
+
+ $this->sql_time += $endtime - $curtime;
+
+ break;
+ }
+ }
} // class sql_db
} // if ... define