Files
oc-server3/htdocs/lib2/sqldebugger.class.php
2012-08-16 21:04:13 +02:00

135 lines
3.0 KiB
PHP

<?php
/***************************************************************************
* For license information see doc/license.txt
*
* Unicode Reminder メモ
*
* This modules gives you a very usefull SQL debugger for MySQL ...
***************************************************************************/
require_once($opt['rootpath'] . 'lib2/bench.inc.php');
$sqldebugger = new sqldebugger();
class sqldebugger
{
var $commands = array();
var $cancel = false;
function getCancel()
{
return $this->cancel;
}
function getCommands()
{
return $this->commands;
}
function execute($sql, $dblink, $bQuerySlave, $sServer)
{
global $db;
if (count($this->commands) >= 1000)
{
$this->cancel = true;
return mysql_query($sql, $dblink);
}
$command = array();
$command['sql'] = $sql;
$command['explain'] = array();
$command['result'] = array();
$command['warnings'] = array();
$command['runtime'] = 0;
$command['affected'] = 0;
$command['count'] = -1;
$command['mode'] = $db['mode'];
$command['slave'] = $bQuerySlave;
$command['server'] = $sServer;
$command['dblink'] = ''.$dblink;
$bUseExplain = false;
$sql = trim($sql);
$sqlexplain = $sql;
if (strtoupper(substr($sqlexplain, 0, 7)) == 'DELETE ')
$sqlexplain = $this->strip_from($sqlexplain);
else if ((strtoupper(substr($sqlexplain, 0, 12)) == 'INSERT INTO ') ||
(strtoupper(substr($sqlexplain, 0, 19)) == 'INSERT IGNORE INTO '))
$sqlexplain = $this->strip_temptable($sqlexplain);
else if (strtoupper(substr($sqlexplain, 0, 23)) == 'CREATE TEMPORARY TABLE ')
$sqlexplain = $this->strip_temptable($sqlexplain);
if (strtoupper(substr($sqlexplain, 0, 7)) == 'SELECT ')
{
// we can use EXPLAIN
$c = 0;
$rs = mysql_query($sqlexplain, $dblink);
$command['count'] = sql_num_rows($rs);
while ($r = sql_fetch_assoc($rs))
{
if ($c == 25) break;
$command['result'][] = $r;
$c++;
}
sql_free_result($rs);
$rs = mysql_query('EXPLAIN EXTENDED ' . $sqlexplain, $dblink);
while ($r = sql_fetch_assoc($rs))
{
$command['explain'][] = $r;
}
sql_free_result($rs);
}
// dont use query cache!
$sql = $this->insert_nocache($sql);
$bSqlExecution = new Cbench;
$bSqlExecution->start();
$rsResult = mysql_query($sql, $dblink);
$bSqlExecution->stop();
$bError = ($rsResult == false);
$command['affected'] = mysql_affected_rows($dblink);
$rs = mysql_query('SHOW WARNINGS', $dblink);
while ($r = sql_fetch_assoc($rs))
$command['warnings'][] = $r['Message'];
$command['runtime'] = $bSqlExecution->Diff();
$this->commands[] = $command;
return $rsResult;
}
function strip_temptable($sql)
{
$start = stripos($sql, 'SELECT ');
if ($start === false)
return '';
return substr($sql, $start);
}
function strip_from($sql)
{
$start = stripos($sql, 'FROM ');
if ($start === false)
return '';
return 'SELECT * ' . substr($sql, $start);
}
function insert_nocache($sql)
{
if (strtoupper(substr($sql, 0, 7)) == 'SELECT ')
$sql = 'SELECT SQL_NO_CACHE ' . substr($sql, 7);
return $sql;
}
}
?>