[cakePHP][plugin] SQL Explain component for the Debugkit UPDATE

CakePHP 1.2.2をさっそく利用してます。


Debugkit版SQL Explainの使い方の一つを書きれたので書いておきます。

遅いSQLクエリだけExplainしたい場合は、debugkit/controllers/components/toolbar.phpに述している、sqlExplainPanelクラスの中の、

var $slowQueryThreshold = 0;

の値を変えてください。これを例えば3にすると3秒以上かかったクエリだけExplainします。


SQL Explain for debugkitをいくつか修正したのと、本家debug kitがいくつか修正されてたので、その修正を取り込みました。

ファイルはここからzipをダウンロードするか(ダウンロード前にページの再読み込みを念のためして下さい)、下thechaw.comからgitでダウンロードしてください。

http://thechaw.com/forks/ichikaway/debug_kit


変更履歴は下で見れます。

http://thechaw.com/forks/ichikaway/debug_kit/timeline/type:commits


具体的な変更箇所は、複数のDBを使ってる時(例えばSelectを投げるDBが複数ある時)、app/config/database.phpに複数のDATABASE_CONFIGを載し、コントローラなどで

$this->Model->setDataSource('default2');

みたいにして切り替えてると思うのですが、そのような場合にもSQL Explainし、その結果をhtmlのテーブルを分けて表示します(下画像)


f:id:cakephper:20090320122246j:image:w600


複数のDBがMySQLとPostgreSQL混在してても対応してます(かなりレアケースだと思いますが)


あとは、Debugkitを開発しているMark Storyに、private propertyを直接参照してるからルール違反ゃないの?と言われたので、別の方法に変更しました。

具体的には、DboSource::showLog()で出力したhtmlタグがいているSQLクエリを取得し、それを配列に変換して、SQLクエリだけ取り出す方法にしました。下のリンク先でmcurryがやってる方法そのままです。

http://github.com/mcurry/cakephp/tree/master/plugins/sql_log


具体的なコードだけ抽出すると

App::import('Core', 'Xml');

ob_start();
$db->showLog();
$queryLogs[$configName] = ob_get_clean();

$Xml = new Xml($queryLogs[$configName]);
$logs = $Xml->toArray();
$logs = Set::classicExtract($logs, 'Table.Tbody.Tr.{n}.Td');

です。

XMLクラスのtoArray()はかなり最強!htmlのテーブルタグを取り除いて配列構造に変換してくれる!!

そして、SetクラスのclassicExtractはその配列構造から必要な深さの配列だけを抽出してくれる。

この組み合わせ、すごい!

わざわざhtml出力をした結果に対してhtmlタグ除去してるので、この実装はなんだか遠回りしてる気がしてなりませんが。。。