示例#1
0
 public 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);
     } elseif (strtoupper(substr($sqlexplain, 0, 12)) == 'INSERT INTO ' || strtoupper(substr($sqlexplain, 0, 19)) == 'INSERT IGNORE INTO ') {
         $sqlexplain = $this->strip_temptable($sqlexplain);
     } elseif (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;
 }
示例#2
0
function sqldbg_execute($sql, $bSlave)
{
    global $dblink;
    global $sqldbg_cmdNo;
    global $sqldbg_sumTimes;
    $sqldbg_cmdNo++;
    echo '<p class="sqlno"><span class="white">/*</span> SQL command ' . $sqldbg_cmdNo . ' ';
    if ($bSlave) {
        echo '<span class="slave_title">(slave)</span>';
    }
    echo '<span class="white">*/</span>';
    echo '</p>';
    echo '<p class="sqlcommand">';
    if ($bSlave) {
        echo '<span class="slave_sql">';
    }
    echo htmlspecialchars($sql, ENT_COMPAT, 'UTF-8');
    if ($bSlave) {
        echo '</span>';
    }
    echo ' ;</p>';
    echo '<div class="comments"><div class="white">/*</div><br>';
    // Explains
    $bUseExplain = true;
    $sqlexplain = $sql;
    $usebr = false;
    if (mb_strtoupper(mb_substr($sqlexplain, 0, 6)) == 'ALTER ') {
        $bUseExplain = false;
    } else {
        if (mb_strtoupper(mb_substr($sqlexplain, 0, 7)) == 'DELETE ') {
            $sqlexplain = sqldbg_strip_from($sqlexplain);
        } else {
            if (mb_strtoupper(mb_substr($sqlexplain, 0, 12)) == 'INSERT INTO ' || mb_strtoupper(mb_substr($sqlexplain, 0, 19)) == 'INSERT IGNORE INTO ') {
                $sqlexplain = sqldbg_strip_temptable($sqlexplain);
                if ($sqlexplain == '') {
                    $bUseExplain = false;
                }
            } else {
                if (mb_strtoupper(mb_substr($sqlexplain, 0, 7)) == 'INSERT ') {
                    $bUseExplain = false;
                } else {
                    if (mb_strtoupper(mb_substr($sqlexplain, 0, 7)) == 'UPDATE ') {
                        $bUseExplain = false;
                    } else {
                        if (mb_strtoupper(mb_substr($sqlexplain, 0, 11)) == 'DROP TABLE ') {
                            $bUseExplain = false;
                        } else {
                            if (mb_strtoupper(mb_substr($sqlexplain, 0, 23)) == 'CREATE TEMPORARY TABLE ') {
                                $sqlexplain = sqldbg_strip_temptable($sqlexplain);
                                if ($sqlexplain == '') {
                                    $bUseExplain = false;
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    if ($bUseExplain == true) {
        $bFirstLine = true;
        $nLine = 0;
        $rs = mysql_query($sqlexplain, $dblink);
        echo '<div class="selrows">Number of selected rows: ' . mysql_num_rows($rs) . '</div>';
        echo '<table class="firstresultrow" border="1">';
        while ($r = sql_fetch_assoc($rs)) {
            $usebr = true;
            $nLine++;
            if ($bFirstLine == true) {
                echo '<tr>' . "\n";
                foreach ($r as $field => $value) {
                    echo '<th>' . htmlspecialchars($field, ENT_COMPAT, 'UTF-8') . '</th>' . "\n";
                }
                echo '</tr>' . "\n";
            }
            if ($bFirstLine) {
                echo '<tr>';
            } else {
                echo '<tr class="result">';
            }
            foreach ($r as $value) {
                echo '<td>' . htmlspecialchars($value != null ? $value : 'NULL', ENT_COMPAT, 'UTF-8') . '</td>';
            }
            echo '</tr>' . "\n";
            if ($nLine == 25) {
                break;
            }
            $bFirstLine = false;
        }
        echo '</table>';
        mysql_free_result($rs);
        echo '<table class="explain" border="1">';
        $bFirstLine = true;
        $rs = mysql_query('EXPLAIN EXTENDED ' . $sqlexplain);
        while ($r = sql_fetch_assoc($rs)) {
            if ($bFirstLine == true) {
                echo '<tr>';
                foreach ($r as $field => $value) {
                    echo '<th>' . htmlspecialchars($field, ENT_COMPAT, 'UTF-8') . '</th>';
                }
                echo '</tr>' . "\n";
                $bFirstLine = false;
            }
            echo '<tr>';
            foreach ($r as $value) {
                echo '<td>' . htmlspecialchars($value != null ? mb_ereg_replace('\\*/', '* /', $value) : 'NULL', ENT_COMPAT, 'UTF-8') . '</td>';
            }
            echo '</tr>' . "\n";
        }
        echo '</table>';
        $usebr = true;
    }
    // dont use query cache!
    $sql = sqldbg_insert_nocache($sql);
    $bSqlExecution = new CBench();
    $bSqlExecution->start();
    $rsResult = mysql_query($sql, $dblink);
    $bError = $rsResult == false;
    $bSqlExecution->stop();
    $sqldbg_sumTimes += $bSqlExecution->Diff();
    if ($bError == true) {
        echo '<div class="error">Error while executing SQL command!</div>';
        echo '<div class="errormsg">';
        echo '<table>';
        $rs = mysql_query('SHOW WARNINGS', $dblink);
        while ($r = sql_fetch_assoc($rs)) {
            echo '<tr><td>' . htmlspecialchars($r['Message'], ENT_COMPAT, 'UTF-8') . '</td></tr>';
        }
        echo '</table>';
        echo '</div>';
    }
    echo '<div class="runtime">Runtime: ' . sprintf('%01.5f', $bSqlExecution->Diff()) . ' sek.</div>';
    echo '<div class="affectedrows">Number of affected rows: ' . mysql_affected_rows($dblink) . '</div>';
    echo '<div class="white">*/</div></div>';
    return $rsResult;
}