Všechny dibi query do profileru

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
na1k
Člen | 288
+
0
-

Profiler je skvělá věc, ale velice by se mi hodilo, kdyby vedle „number of sql queries“ bylo možné nechat si tyto dotazy vypsat (nějaké rozklikávátko nebo cokoliv).

Vím, že dibi má vlastní profiler, který ale posílá výstup do souboru. Netuším ale, jestli si ho i nějak schraňuje a bylo by možné si dotazy natáhnout do profileru podobně, jako lze přidat například verzi Nette nebo poslední query.

Je na to tedy nějaká finta?

jasir
Člen | 746
+
0
-

Všechny SQL příkazy jsou vypisovány do FireBugu…

Panda
Člen | 569
+
0
-

Integrovaný profiler v dibi vypisuje dotazy do FirePHP (pokud byly vykonány před odesláním hlaviček). Pokud ale nepoužíváš Firefox a tím pádem ani nemáš k dispozici Firebug, nebo potřebuješ i dotazy po odeslání hlaviček, můžeš si napsat vlastní profiler, kde si s SQLkem uděláš co chceš. Může vypadat třeba takto:

<?php

class MyDibiProfiler extends DibiProfiler
{
	public function after($ticket, $res = NULL)
	{
		parent::after($ticket, $res);

		list($connection, $event, $sql) = $this->tickets[$ticket];
		if ($event & self::QUERY)
			Debug::consoleDump($res, $sql);
	}
}

?>

V konfiguraci databáze pak stačí nastavit vlastní profiler:

database.profiler = MyDibiProfiler
na1k
Člen | 288
+
0
-

jasir: …a to je právě to, co se mi nelíbí :)
(mimo to nepracuji pořád jen ve FF)

Když to ale jde přesměrovat do FireBugu, mohlo by to jít i do profileru, ne?

Panda: díky! To už vypadá dobře, od toho se půjde odpíchnout :)

Editoval na1k (16. 7. 2009 14:36)

jasir
Člen | 746
+
0
-

Panda: A to je dobré toto :-)

Panda
Člen | 569
+
0
-

Díky. Ještě by možná někoho mohl inspirovat kód mého profileru – využívá FirePHP a každý SQL dotaz prožene EXPLAINem, krásně se s tím ladí indexy:

<?php
class MyDibiProfiler extends DibiProfiler
{
	public function after($ticket, $res = NULL)
	{
		parent::after($ticket, $res);

		list($connection, $event, $sql) = $this->tickets[$ticket];

		if ($event & self::QUERY) {
			if ($this->useFirebug) {
				if (String::startsWith($sql, 'SELECT')) {
					$table = array();

					$res = dibi::query('EXPLAIN EXTENDED %sql', $sql);
					$table[] = $res->getColumnNames();

					foreach ($res as $row)
					{
						$tr = array();
						foreach ($row as $value)
							$tr[] = $value;
						$table[] = $tr;
					}
					$res->free();

					Debug::fireLog($table, 'TABLE', 'EXPLAIN EXTENDED ' . $sql);
				}
			}
		}
	}
}
?>
Ondřej Brejla
Člen | 746
+
0
-

To by bylo dobré někam šoupnout, aby to tu nezapadlo…ale nejsem si jist, jestli je to Nette extras ;)