読者です 読者をやめる 読者になる 読者になる

肉とビールとパンケーキ by @sotarok

少し大人になった「肉とご飯と甘いもの」

ADOdbのdebugモードでEthnaのログにSQLが吐き出されるようにする

Ethna

と、この内容は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が出力されない問題を解消したいわけです。)

で、どうせフレームワークを使っているなら、

  1. Ethnaのdebugモードに応じてSQLの出力をしてほしい
    • debugモードがechoならechoで
    • fileならファイルに

まぁそういうことを考えるわけです。笑

ということで、そんなことを実現してみます。

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のログレベル・ログ設定に応じた出力ができるようになりました。

出力例

スクリーンショットです。アプリ名のところはちょっとボカシw