ADOdbのdebugモードでEthnaのログにSQLが吐き出されるようにする
と、この内容はhaltさんに相談したので、もしかしたら本流にコミットしてもらえるかもしれません・・・?(・ω・)が、まぁとりあえず先走りエントリーということで。Revision 491にて修正されました。ただしまだリリースされてませんので、Ethna 2.3.2でこの機能を使いたい場合は下記のようにDB_ADOdb.phpを修正してください。
通常(Ethnaで使わなくても)、ADOdbをdebugモードで実行すると、実行SQLごとに、hrで区切られてページの先頭にSQLが表示されます。
しかし、Ethnaでは、ADOdbをdebugモードにしても、これが表示されません。その原因は、Ethna_DB_ADOdb.phpの先頭で、
<?php ... define('ADODB_OUTP', 'sprintf'); //disable output error
と、debug出力の出力関数をsprintfとして定義してしまっているからです。SQLが出力されないばかりか、「date_format(date, '%y%m')」など、「%」を含むSQL文を発行すると、引数が足りないよーと怒られてしまいます。
(補足:ただし、Ethna_DB_ADOdb::query経由でクエリを投げたときは、ログが出力されるようになっています。autoExecuteや、getAllなど、ADOdbの機能を直接使ったときのSQLが出力されない問題を解消したいわけです。)
で、どうせフレームワークを使っているなら、
まぁそういうことを考えるわけです。笑
ということで、そんなことを実現してみます。
Ethna_DB_ADOdb.phpをFix
まず、このADODB_OUTPのsprintfを何とかします。
以下のように、ethna_adodb_logger という関数を作成し、loggerを呼び出します。
<?php /** * ADOdb config setting */ define('ADODB_OUTP', 'ethna_adodb_logger'); //disable output error require_once 'adodb/adodb.inc.php'; function ethna_adodb_logger ($msg, $newline) { $c =& Ethna_Controller::getInstance(); $logger =& $c->getLogger(); $logger->log(LOG_DEBUG, strip_tags(str_replace("\n", "", $msg))); }
str_replace と strip_tagsをしているのは、ADOdbのデバッグ出力のデフォルトが、改行とhrタグを出力する設定になっているからです。(これはADOdb側で抑制する設定がある?パっと見みあたらなかったので…)
ログレベルは、Ethna_DB_ADOdb::query を実行したときのログレベルが「LOG_DEBUG」でしたので、これでOKでしょう。
ADOdbをdebugモードに
あとは、DBを呼び出した段階で(通常、アクションのコンストラクタなどでgetDBしちゃうのかな?と思うので、そのあたりで)、
<?php ... $DB =& $this->backend->getDB(); $DB->db->debug = true;
などとしてあげれば、OKです。
これで
Ethnaのログレベル・ログ設定に応じた出力ができるようになりました。