diff --git a/src/Dibi/Bridges/Nette/Panel.php b/src/Dibi/Bridges/Nette/Panel.php index 14c19329..51d83f2f 100644 --- a/src/Dibi/Bridges/Nette/Panel.php +++ b/src/Dibi/Bridges/Nette/Panel.php @@ -65,7 +65,7 @@ class DibiNettePanel extends DibiObject implements Nette\Diagnostics\IBarPanel if ($e instanceof DibiException && $e->getSql()) { return [ 'tab' => 'SQL', - 'panel' => dibi::dump($e->getSql(), TRUE), + 'panel' => DibiHelpers::dump($e->getSql(), TRUE), ]; } } @@ -104,7 +104,7 @@ class DibiNettePanel extends DibiObject implements Nette\Diagnostics\IBarPanel $backup = [$event->connection->onEvent, dibi::$numOfQueries, dibi::$totalTime]; $event->connection->onEvent = NULL; $cmd = is_string($this->explain) ? $this->explain : ($event->connection->getConfig('driver') === 'oracle' ? 'EXPLAIN PLAN FOR' : 'EXPLAIN'); - $explain = dibi::dump($event->connection->nativeQuery("$cmd $event->sql"), TRUE); + $explain = DibiHelpers::dump($event->connection->nativeQuery("$cmd $event->sql"), TRUE); } catch (DibiException $e) { } list($event->connection->onEvent, dibi::$numOfQueries, dibi::$totalTime) = $backup; @@ -117,7 +117,7 @@ class DibiNettePanel extends DibiObject implements Nette\Diagnostics\IBarPanel $s .= "
explain"; } - $s .= '' . dibi::dump(strlen($event->sql) > self::$maxLength ? substr($event->sql, 0, self::$maxLength) . '...' : $event->sql, TRUE); + $s .= '' . DibiHelpers::dump(strlen($event->sql) > self::$maxLength ? substr($event->sql, 0, self::$maxLength) . '...' : $event->sql, TRUE); if ($explain) { $s .= "
{$explain}
"; } diff --git a/src/Dibi/Bridges/Tracy/Panel.php b/src/Dibi/Bridges/Tracy/Panel.php index fde26208..ff9fd0f4 100644 --- a/src/Dibi/Bridges/Tracy/Panel.php +++ b/src/Dibi/Bridges/Tracy/Panel.php @@ -9,6 +9,7 @@ namespace Dibi\Bridges\Tracy; use dibi; use Tracy; +use DibiHelpers; /** @@ -67,7 +68,7 @@ class Panel extends \DibiObject implements Tracy\IBarPanel if ($e instanceof \DibiException && $e->getSql()) { return [ 'tab' => 'SQL', - 'panel' => dibi::dump($e->getSql(), TRUE), + 'panel' => DibiHelpers::dump($e->getSql(), TRUE), ]; } } @@ -107,7 +108,7 @@ class Panel extends \DibiObject implements Tracy\IBarPanel $backup = [$event->connection->onEvent, dibi::$numOfQueries, dibi::$totalTime]; $event->connection->onEvent = NULL; $cmd = is_string($this->explain) ? $this->explain : ($event->connection->getConfig('driver') === 'oracle' ? 'EXPLAIN PLAN FOR' : 'EXPLAIN'); - $explain = dibi::dump($event->connection->nativeQuery("$cmd $event->sql"), TRUE); + $explain = DibiHelpers::dump($event->connection->nativeQuery("$cmd $event->sql"), TRUE); } catch (\DibiException $e) { } list($event->connection->onEvent, dibi::$numOfQueries, dibi::$totalTime) = $backup; @@ -120,7 +121,7 @@ class Panel extends \DibiObject implements Tracy\IBarPanel $s .= "
explain"; } - $s .= '' . dibi::dump(strlen($event->sql) > self::$maxLength ? substr($event->sql, 0, self::$maxLength) . '...' : $event->sql, TRUE); + $s .= '' . DibiHelpers::dump(strlen($event->sql) > self::$maxLength ? substr($event->sql, 0, self::$maxLength) . '...' : $event->sql, TRUE); if ($explain) { $s .= "
{$explain}
"; } diff --git a/src/Dibi/Connection.php b/src/Dibi/Connection.php index b9924880..2bf98358 100644 --- a/src/Dibi/Connection.php +++ b/src/Dibi/Connection.php @@ -260,12 +260,12 @@ class DibiConnection extends DibiObject { $args = func_get_args(); try { - dibi::dump($this->translateArgs($args)); + DibiHelpers::dump($this->translateArgs($args)); return TRUE; } catch (DibiException $e) { if ($e->getSql()) { - dibi::dump($e->getSql()); + DibiHelpers::dump($e->getSql()); } else { echo get_class($e) . ': ' . $e->getMessage() . (PHP_SAPI === 'cli' ? "\n" : '
'); } diff --git a/src/Dibi/Helpers.php b/src/Dibi/Helpers.php index 929e7f28..97e142b2 100644 --- a/src/Dibi/Helpers.php +++ b/src/Dibi/Helpers.php @@ -12,6 +12,85 @@ class DibiHelpers { + /** + * Prints out a syntax highlighted version of the SQL command or DibiResult. + * @param string|DibiResult + * @param bool return output instead of printing it? + * @return string + */ + public static function dump($sql = NULL, $return = FALSE) + { + ob_start(); + if ($sql instanceof DibiResult) { + $sql->dump(); + + } else { + if ($sql === NULL) { + $sql = dibi::$sql; + } + + static $keywords1 = 'SELECT|(?:ON\s+DUPLICATE\s+KEY)?UPDATE|INSERT(?:\s+INTO)?|REPLACE(?:\s+INTO)?|DELETE|CALL|UNION|FROM|WHERE|HAVING|GROUP\s+BY|ORDER\s+BY|LIMIT|OFFSET|FETCH\s+NEXT|SET|VALUES|LEFT\s+JOIN|INNER\s+JOIN|TRUNCATE|START\s+TRANSACTION|BEGIN|COMMIT|ROLLBACK(?:\s+TO\s+SAVEPOINT)?|(?:RELEASE\s+)?SAVEPOINT'; + static $keywords2 = 'ALL|DISTINCT|DISTINCTROW|IGNORE|AS|USING|ON|AND|OR|IN|IS|NOT|NULL|LIKE|RLIKE|REGEXP|TRUE|FALSE'; + + // insert new lines + $sql = " $sql "; + $sql = preg_replace("#(?<=[\\s,(])($keywords1)(?=[\\s,)])#i", "\n\$1", $sql); + + // reduce spaces + $sql = preg_replace('#[ \t]{2,}#', ' ', $sql); + + $sql = wordwrap($sql, 100); + $sql = preg_replace("#([ \t]*\r?\n){2,}#", "\n", $sql); + + // syntax highlight + $highlighter = "#(/\\*.+?\\*/)|(\\*\\*.+?\\*\\*)|(?<=[\\s,(])($keywords1)(?=[\\s,)])|(?<=[\\s,(=])($keywords2)(?=[\\s,)=])#is"; + if (PHP_SAPI === 'cli') { + if (substr(getenv('TERM'), 0, 5) === 'xterm') { + $sql = preg_replace_callback($highlighter, function ($m) { + if (!empty($m[1])) { // comment + return "\033[1;30m" . $m[1] . "\033[0m"; + + } elseif (!empty($m[2])) { // error + return "\033[1;31m" . $m[2] . "\033[0m"; + + } elseif (!empty($m[3])) { // most important keywords + return "\033[1;34m" . $m[3] . "\033[0m"; + + } elseif (!empty($m[4])) { // other keywords + return "\033[1;32m" . $m[4] . "\033[0m"; + } + }, $sql); + } + echo trim($sql) . "\n\n"; + + } else { + $sql = htmlSpecialChars($sql); + $sql = preg_replace_callback($highlighter, function ($m) { + if (!empty($m[1])) { // comment + return '' . $m[1] . ''; + + } elseif (!empty($m[2])) { // error + return '' . $m[2] . ''; + + } elseif (!empty($m[3])) { // most important keywords + return '' . $m[3] . ''; + + } elseif (!empty($m[4])) { // other keywords + return '' . $m[4] . ''; + } + }, $sql); + echo '
', trim($sql), "
\n\n"; + } + } + + if ($return) { + return ob_get_clean(); + } else { + ob_end_flush(); + } + } + + /** @internal */ public static function escape($driver, $value, $type) { diff --git a/src/Dibi/dibi.php b/src/Dibi/dibi.php index 51f08263..477492c3 100644 --- a/src/Dibi/dibi.php +++ b/src/Dibi/dibi.php @@ -51,9 +51,6 @@ class dibi /** @var DibiConnection Current connection */ private static $connection; - /** @var array @see addHandler */ - private static $handlers = []; - /** @var string Last SQL command @see dibi::query() */ public static $sql; @@ -459,74 +456,7 @@ class dibi */ public static function dump($sql = NULL, $return = FALSE) { - ob_start(); - if ($sql instanceof DibiResult) { - $sql->dump(); - - } else { - if ($sql === NULL) { - $sql = self::$sql; - } - - static $keywords1 = 'SELECT|(?:ON\s+DUPLICATE\s+KEY)?UPDATE|INSERT(?:\s+INTO)?|REPLACE(?:\s+INTO)?|DELETE|CALL|UNION|FROM|WHERE|HAVING|GROUP\s+BY|ORDER\s+BY|LIMIT|OFFSET|FETCH\s+NEXT|SET|VALUES|LEFT\s+JOIN|INNER\s+JOIN|TRUNCATE|START\s+TRANSACTION|BEGIN|COMMIT|ROLLBACK(?:\s+TO\s+SAVEPOINT)?|(?:RELEASE\s+)?SAVEPOINT'; - static $keywords2 = 'ALL|DISTINCT|DISTINCTROW|IGNORE|AS|USING|ON|AND|OR|IN|IS|NOT|NULL|LIKE|RLIKE|REGEXP|TRUE|FALSE'; - - // insert new lines - $sql = " $sql "; - $sql = preg_replace("#(?<=[\\s,(])($keywords1)(?=[\\s,)])#i", "\n\$1", $sql); - - // reduce spaces - $sql = preg_replace('#[ \t]{2,}#', ' ', $sql); - - $sql = wordwrap($sql, 100); - $sql = preg_replace("#([ \t]*\r?\n){2,}#", "\n", $sql); - - // syntax highlight - $highlighter = "#(/\\*.+?\\*/)|(\\*\\*.+?\\*\\*)|(?<=[\\s,(])($keywords1)(?=[\\s,)])|(?<=[\\s,(=])($keywords2)(?=[\\s,)=])#is"; - if (PHP_SAPI === 'cli') { - if (substr(getenv('TERM'), 0, 5) === 'xterm') { - $sql = preg_replace_callback($highlighter, function ($m) { - if (!empty($m[1])) { // comment - return "\033[1;30m" . $m[1] . "\033[0m"; - - } elseif (!empty($m[2])) { // error - return "\033[1;31m" . $m[2] . "\033[0m"; - - } elseif (!empty($m[3])) { // most important keywords - return "\033[1;34m" . $m[3] . "\033[0m"; - - } elseif (!empty($m[4])) { // other keywords - return "\033[1;32m" . $m[4] . "\033[0m"; - } - }, $sql); - } - echo trim($sql) . "\n\n"; - - } else { - $sql = htmlSpecialChars($sql); - $sql = preg_replace_callback($highlighter, function ($m) { - if (!empty($m[1])) { // comment - return '' . $m[1] . ''; - - } elseif (!empty($m[2])) { // error - return '' . $m[2] . ''; - - } elseif (!empty($m[3])) { // most important keywords - return '' . $m[3] . ''; - - } elseif (!empty($m[4])) { // other keywords - return '' . $m[4] . ''; - } - }, $sql); - echo '
', trim($sql), "
\n\n"; - } - } - - if ($return) { - return ob_get_clean(); - } else { - ob_end_flush(); - } + return DibiHelpers::dump($sql, $return); } }