From f21ec1f4661a998498c53d492d4e897bae8f8856 Mon Sep 17 00:00:00 2001 From: Ludovic Arnaud Date: Thu, 28 Aug 2003 00:22:18 +0000 Subject: Taken explain code out of sql_query. New improved layout. git-svn-id: file:///svn/phpbb/trunk@4447 89ea8834-ac86-4346-8a33-228a782c2dd0 --- phpBB/includes/db/mysql.php | 210 ++++++++++++++++++++++++++++++++------------ 1 file changed, 155 insertions(+), 55 deletions(-) (limited to 'phpBB/includes/db/mysql.php') 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\n\n\n";
-								}
-								$this->sql_report .= "\n\n\n\n";
-							}
-						}
-
-						if ($html_table)
-						{
-							$this->sql_report .= '
" . implode("", array_keys($row)) . "
" . implode(" ", array_values($row)) . " 

'; - } - } - - $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 '
phpBB LogoSQL 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 .= ''; + } + $html_hold .= "\n\n"; + } + $html_hold .= "\n"; + + $class = 'row1'; + foreach (array_values($row) as $val) + { + $class = ($class == 'row1') ? 'row2' : 'row1'; + $html_hold .= ''; + } + $html_hold .= "\n\n"; + } + } + + if ($html_table) + { + $html_hold .= '
' . (($val) ? ucwords(str_replace('_', ' ', $val)) : ' ') . '
' . (($val) ? $val : ' ') . '

'; + } + } + 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
\n
Query#{$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
-- 
cgit v1.2.1