filter = $filter ? (int) $filter : DibiEvent::QUERY; $this->explain = $explain; } public function register(DibiConnection $connection) { if (is_callable('Nette\Diagnostics\Debugger::enable') && !class_exists('NDebugger')) { class_alias('Nette\Diagnostics\Debugger', 'NDebugger'); // PHP 5.2 code compatibility } if (is_callable('NDebugger::enable')) { NDebugger::$bar && NDebugger::$bar->addPanel($this); NDebugger::$blueScreen && NDebugger::$blueScreen->addPanel(array($this, 'renderException'), __CLASS__); $connection->onEvent[] = array($this, 'logEvent'); } elseif (is_callable('Debugger::enable')) { Debugger::$bar && Debugger::$bar->addPanel($this); Debugger::$blueScreen && Debugger::$blueScreen->addPanel(array($this, 'renderException'), __CLASS__); $connection->onEvent[] = array($this, 'logEvent'); } } /** * After event notification. * @return void */ public function logEvent(DibiEvent $event) { if (($event->type & $this->filter) === 0) { return; } $this->events[] = $event; } /** * Returns blue-screen custom tab. * @return mixed */ public function renderException($e) { if ($e instanceof DibiException && $e->getSql()) { return array( 'tab' => 'SQL', 'panel' => dibi::dump($e->getSql(), TRUE), ); } } /** * Returns HTML code for custom tab. (Nette\Diagnostics\IBarPanel) * @return mixed */ public function getTab() { $totalTime = 0; foreach ($this->events as $event) { $totalTime += $event->time; } return '' . count($this->events) . ' queries' . ($totalTime ? ' / ' . sprintf('%0.1f', $totalTime * 1000) . 'ms' : '') . ''; } /** * Returns HTML code for custom panel. (Nette\Diagnostics\IBarPanel) * @return mixed */ public function getPanel() { $totalTime = $s = NULL; $h = 'htmlSpecialChars'; foreach ($this->events as $event) { $totalTime += $event->time; $explain = NULL; // EXPLAIN is called here to work SELECT FOUND_ROWS() if ($this->explain && $event->type === DibiEvent::SELECT) { try { $backup = array($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' : 'EXPLAIN'); $explain = dibi::dump($event->connection->nativeQuery("$cmd $event->sql"), TRUE); } catch (DibiException $e) {} list($event->connection->onEvent, dibi::$numOfQueries, dibi::$totalTime) = $backup; } $s .= '' . sprintf('%0.3f', $event->time * 1000); if ($explain) { static $counter; $counter++; $s .= "
explain ►"; } $s .= '' . dibi::dump(strlen($event->sql) > self::$maxLength ? substr($event->sql, 0, self::$maxLength) . '...' : $event->sql, TRUE); if ($explain) { $s .= "
{$explain}
"; } if ($event->source) { $helpers = 'Nette\Diagnostics\Helpers'; if (!class_exists($helpers)) { $helpers = class_exists('NDebugHelpers') ? 'NDebugHelpers' : 'DebugHelpers'; } $s .= call_user_func(array($helpers, 'editorLink'), $event->source[0], $event->source[1])->class('nette-DibiProfiler-source'); } $s .= "{$event->count}{$h($event->connection->getConfig('driver') . '/' . $event->connection->getConfig('name'))}"; } return empty($this->events) ? '' : '

Queries: ' . count($this->events) . ($totalTime === NULL ? '' : ', time: ' . sprintf('%0.3f', $totalTime * 1000) . ' ms') . '

' . $s . '
Time msSQL StatementRowsConnection
'; } }