From abd3e2116cd6b0709f4158bfa7f359d207de62f2 Mon Sep 17 00:00:00 2001 From: David Grudl Date: Mon, 24 Mar 2014 19:29:59 +0100 Subject: [PATCH] added bridge for Nette 2.2 & Tracy --- .../Nette-2.2/DibiNette22Extension.php | 52 +++++++ dibi/bridges/Nette-2.2/config.sample.neon | 12 ++ dibi/bridges/Tracy/Panel.php | 145 ++++++++++++++++++ dibi/libs/DibiConnection.php | 2 +- 4 files changed, 210 insertions(+), 1 deletion(-) create mode 100644 dibi/bridges/Nette-2.2/DibiNette22Extension.php create mode 100644 dibi/bridges/Nette-2.2/config.sample.neon create mode 100644 dibi/bridges/Tracy/Panel.php diff --git a/dibi/bridges/Nette-2.2/DibiNette22Extension.php b/dibi/bridges/Nette-2.2/DibiNette22Extension.php new file mode 100644 index 00000000..dd5b9936 --- /dev/null +++ b/dibi/bridges/Nette-2.2/DibiNette22Extension.php @@ -0,0 +1,52 @@ +getContainerBuilder(); + $config = $this->getConfig(); + + $useProfiler = isset($config['profiler']) + ? $config['profiler'] + : class_exists('Tracy\Debugger') && $container->parameters['debugMode']; + + unset($config['profiler']); + + if (isset($config['flags'])) { + $flags = 0; + foreach ((array) $config['flags'] as $flag) { + $flags |= constant($flag); + } + $config['flags'] = $flags; + } + + $connection = $container->addDefinition($this->prefix('connection')) + ->setClass('DibiConnection', array($config)); + + if ($useProfiler) { + $panel = $container->addDefinition($this->prefix('panel')) + ->setClass('Dibi\Bridges\Tracy\Panel'); + $connection->addSetup(array($panel, 'register'), array($connection)); + } + } + +} diff --git a/dibi/bridges/Nette-2.2/config.sample.neon b/dibi/bridges/Nette-2.2/config.sample.neon new file mode 100644 index 00000000..2af2fdf9 --- /dev/null +++ b/dibi/bridges/Nette-2.2/config.sample.neon @@ -0,0 +1,12 @@ +# This will create service named 'dibi.connection'. +# Requires Nette Framework 2.2 + +extensions: + dibi: Dibi\Bridges\Nette\DibiExtension22 + +dibi: + host: localhost + username: root + password: *** + database: foo + lazy: TRUE diff --git a/dibi/bridges/Tracy/Panel.php b/dibi/bridges/Tracy/Panel.php new file mode 100644 index 00000000..f3463d40 --- /dev/null +++ b/dibi/bridges/Tracy/Panel.php @@ -0,0 +1,145 @@ +filter = $filter ? (int) $filter : \DibiEvent::QUERY; + $this->explain = $explain; + } + + + public function register(\DibiConnection $connection) + { + Tracy\Debugger::getBar()->addPanel($this); + Tracy\Debugger::getBlueScreen()->addPanel(array(__CLASS__, 'renderException')); + $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 static 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. (Tracy\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 ms', $totalTime * 1000) : '') + . ''; + } + + + /** + * Returns HTML code for custom panel. (Tracy\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) { + $s .= Tracy\Helpers::editorLink($event->source[0], $event->source[1]);//->class('tracy-DibiProfiler-source'); + } + + $s .= "{$event->count}{$h($event->connection->getConfig('driver') . '/' . $event->connection->getConfig('name'))}"; + } + + return empty($this->events) ? '' : + ' +

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

+
+ + ' . $s . ' +
Time msSQL StatementRowsConnection
+
'; + } + +} diff --git a/dibi/libs/DibiConnection.php b/dibi/libs/DibiConnection.php index 679afe1a..861c77ca 100644 --- a/dibi/libs/DibiConnection.php +++ b/dibi/libs/DibiConnection.php @@ -111,7 +111,7 @@ class DibiConnection extends DibiObject $this->onEvent[] = array(new DibiFirePhpLogger($filter), 'logEvent'); } - if (class_exists('DibiNettePanel')) { + if (class_exists('DibiNettePanel') && !interface_exists('Tracy\IBarPanel')) { $panel = new DibiNettePanel(isset($profilerCfg['explain']) ? $profilerCfg['explain'] : TRUE, $filter); $panel->register($this); }