@kyanny's blog

My life. Opinions are my own.

DBI.pm や DBD::*.pm あたりのコードを少し読んだ

疲れた。結局、読んでみても悩んでることは解決しなかった。でもデバッガ使って追ってみたりソース読んでみたりして少し理解が深まったのでメモしておく。

DBI->connect() が返す $dbh (DataBaseHandle) は DBI::db に bless されていて、 DBI::db は DBI::common というクラスを親に持つ。また、 DBI->install_driver(DRIVER) が返す $drh (DRiverHandle?) は DBD::DRIVER::dr に bless されていて DBI::dr を親に持つ、んだったかな。 DBI::dr も DBI::common を親に持つ。これらのクラスで利用できるメソッドは DBI.pm の上の方にまとめてかいてある。

$dbh->data_source() と $drh->data_source() も定義されていて、実際には DBD::DRIVER が data_source() をオーバーライドして実装しているのでそちらが使われるのだが、これがモノによってちゃんと情報を返すかどうかまちまちみたいで、 DBD::SQLite なんてひどいことに即 return している。コメントをみると「DBD::Oracle からコピった。あとでやる」みたいなことが書いてある。

以上、だからどうした、というオチも結論もないエントリでした。不思議と、デバッガで潜ったことがあるとソースを読むのが少し気楽になる。「もうみたことあるから恐るるに足らず」みたいな心理になるのかな。実際は潜ってる最中はソースなんて読んじゃいなくて、ただ文字列が視界に入ってるだけにすぎないのだけど。