DBIC_TRACE=1のときに発行されるsqlにどこで発行されたクエリか追記する

package DBIx::Class::Storage::Statistics::Caller;
use strict;
use warnings;

use base qw/ DBIx::Class::Storage::Statistics /;

sub query_start {
  my ($self, $string, @bind) = @_;
  
  my $caller_sub_name = $self->_get_non_dbic_caller;
  my $message = "[$caller_sub_name] $string: ".join(', ', @bind)."\n";

  if(defined($self->callback)) {
    $string =~ m/^(\w+)/;
    $self->callback->($1, $message);
    return;
  }

  $self->print($message);
}

sub _get_non_dbic_caller {
    my ($self) = @_;
    
    my $get_sub_name = sub {
         for my $n ( 0..20 ) {
             my ($package, $filename, $line, $subroutine, $hasargs,
                 $wantarray, $evaltext, $is_require, $hints, $bitmask) = caller($n);
             return $subroutine if $subroutine =~ s{^AppName::}{};
         };
         return '';
    };

    return $get_sub_name->();
}

1;

使いたいときに

$schema->storage->debugobj( DBIx::Class::Storage::Statistics::Caller->new );

する。

callerをとってくる部分はもっとうまくかけるにおいがぷんぷんする。


あと、上のやつとは全然関係ないけど、最近Arkアプリの起動は

perl boot_app_server_fcgi.pl >> ~/tmp/app/fcgi.log 2>&1  >> /dev/stdin  2>&1 | grep SELECT  >> ~/tmp/app/fcgi-select.log

みたいに起動して、

M-x tail-log-file ~/tmp/app/fcgi.log してる。

してる。
zshとかきちんと理解してないので勘で書いて、あ、動いた。みたいな感じ。


Emacsでlogを見るようにすると、anything-c-moccur とか使えて便利な事がおおい。
あと、sqlとかそのまま実行できて、それもたのしい。

tail-log-fileの定義は以下のような感じ

(defun tail-log-file (file)
  (interactive "f")
  (let* ((log-file (expand-file-name file))
         (buffer-name (concat "*" log-file  "*")))
    (with-current-buffer (get-buffer-create buffer-name)
      (set-buffer buffer-name)
      (setq auto-window-vscroll t)
      (fundamental-mode)
      (start-process "tail"
                     buffer-name
                     "tail"
                     "-f"
                     log-file)
      )
    (switch-to-buffer buffer-name)))

rails.elを参考にしました。


今日は、海の家でタイ料理を食べながらおビールを飲みました。
ですが、気温が高かったからか、僕のビールがすぐに蒸発してしまう不思議な現象に見舞われたため、沢山ビールを注文することになってしまいました。
不思議でしたが、楽しいお酒が沢山飲めて本当に幸せでした。しあわせ、しあわせ。