@kyanny's blog

My thoughts, my life. Views/opinions are my own.

DBIx::ContextualFetch のかえす $dbh の接続情報を読んでデバッグ

なんかしょうもないことでハマって・・・というかハメられている。

以下のような環境で、 Class::DBI::db_Main() を上書きして DBIx::ContextualFetch のインスタンスを返してるところがあり、その $dbh が実際にどういう接続情報をもっているのか?を知りたいのだけど、 $dbh を Dumper しても空のハッシュリファレンスを bless していて有効な情報が全然とれない。

もろもろバージョンが低すぎるのが問題の原因なのだろうとは思うのだけど、気楽にバージョンアップできない環境だし、あるメソッドの中で実行してる SQL がどこか虚空の彼方にあるデータベースに対して発行されていて、しかし同じコードを使っている別のメソッドからの呼び出しではちゃんと正しいデータベースのテーブルに SQL が発行されている、というわけのわからない状況で、問題点の切り分けをしたいので問題のある部分で $dbh をとってきて中身をみてデバッグ、したかったのだけどできなかった。なぜだ。

DBIx::ContextualFetch->connect() や connect_cached() を呼ぶと DBIx::ContextualFetch::db にブレスされたリファレンスを返し、そいつは DBI::db を親に持つ、ということはわかったのだけど DBI::db なら data_sources() メソッドが使えて接続情報を返すと思うんだけど返り値が空っぽ。接続情報が空のインスタンスなのに、 SQL がちゃんと実行できてデータベースの行も変更できたりする。なんでできるんだ。。

$ /usr/local/bin/perl -mClass::DBI -le 'print $Class::DBI::VERSION'
0.96
$ /usr/local/bin/perl -mDBI -le 'print $DBI::VERSION'
1.42
$ /usr/local/bin/perl -mDBD::mysql -le 'print $DBD::mysql::VERSION'
2.1028
$ /usr/local/bin/perl -mDBIx::ContextualFetch -le 'print $DBIx::ContextualFetch::VERSION'
1.02

DBIx::ContextualFetch のソース読んでみた上で、 $sth->SUPER:: なんちゃらを呼んでいるので $sth が作られた時点で接続情報を持っていることになるのかな?と思って $sth->{Database} から $dbh をとりなおして改めて Dump してみたけどやっぱり空ハッシュだった。これどうしてちゃんと動いてるのか全くわからない!どこかに説明書いてないものか。。