DBIx::Class::Schema::Loaderでダンプさせたやつが変わってて(´(・)`)クマッタ・・[Oracle]

スキーマが変わったのでダンプさせたら

-__PACKAGE__->load_components("PK::Auto", "Core");
+__PACKAGE__->load_components("Core");

-  {
-    data_type => "TIMESTAMP(6)",
-    default_value => undef,
-    is_nullable => 1,
-    size => 11,
-  },

こんな差分になってた。
「data_typeがTIMESTAMPだったらinflate_column仕掛ける」ってのをやっていたのに、できなくなってしまったではないか。
DBIx::Class::Schema::Loader::DBI::OracleがDBIx-Class-Schema-Loaderにマージされたから?とか思ってDBIx-Class-Schema-Loader-DBI-Oracleとの差分を見たけど特に変わったところは無かった。

DBIx::Class::Schema::Loader::DBI#_columns_info_forがちゃんと動いてないのかな?これは結構(´(・)`)クマッタ・・

自分の環境
  • DBIx-Class-Schema-Loader-0.04000
  • DBD-Oracle-1.19
で、DBIC::Schema::Loader経由でcolumn_infoが取れなくなってしまった件についてです。 Oracleのバージョンとかでも変わってきそう。(自分は10g)

DBIx-Class-Schema-LoaderのChangesを見ると、columns_info_forというメソッドをDBIx::Class::Storage::DBI(DBIx-Class)からDBIx::Class::Schema::Loader::DBI(DBIx-Class-Schema-Loader)へ移動しているのだけれども、その過程でエンバグしてるっぽいです。DBIx-Class-Schema-Loader-0.03999_01から起きると思います。

DBIx::Class::Storage::DBIの場合、その具象クラスであるDBIx::Class::Storage::DBI::Oracle#columns_info_forで
sub columns_info_for {
  my ($self, $table) = @_;

  $self->next::method(uc($table));
}

と、テーブル名をUpperCaseにしています。 しかしDBIx::Class::Schema::Loader::DBIの場合はUpperCaseにせずにそのままのテーブル名で$dbh->column_infoを呼んでしまっており、それが原因となっているようです。

DBIx-Class-Schema-Loaderの方にパッチを当てる場合
% diff DBIx/Class/Schema/Loader/DBI.pm.orig DBIx/Class/Schema/Loader/DBI.pm
--- DBIx/Class/Schema/Loader/DBI.pm.orig        2007-06-12 23:32:51.906250000 +0900
+++ DBIx/Class/Schema/Loader/DBI.pm     2007-06-12 23:42:32.546875000 +0900
@@ -211,7 +211,7 @@
     if ($dbh->can('column_info')) {
         my %result;
         eval {
-            my $sth = $dbh->column_info( undef, $self->db_schema, $table, '%' );
+            my $sth = $dbh->column_info( undef, $self->db_schema, uc $table, '%' );
             $sth->execute();
             while ( my $info = $sth->fetchrow_hashref() ){
                 my %column_info;
もしくは、DBD-Oracleの方にパッチを当てる場合
% diff DBD/Oracle.pm.orig DBD/Oracle.pm
--- DBD/Oracle.pm.orig  2007-06-12 23:34:24.562500000 +0900
+++ DBD/Oracle.pm       2007-06-12 23:34:33.562500000 +0900
@@ -490,7 +490,7 @@
     sub column_info {
        my $dbh  = shift;
        my $attr = ( ref $_[0] eq 'HASH') ? $_[0] : {
-           'TABLE_SCHEM' => $_[1],'TABLE_NAME' => $_[2],'COLUMN_NAME' => $_[3] };
+           'TABLE_SCHEM' => $_[1],'TABLE_NAME' => uc $_[2],'COLUMN_NAME' => $_[3] };
        my($typecase,$typecaseend) = ('','');
        if (ora_server_version($dbh)->[0] >= 8) {
            $typecase = <<'SQL';
どちらも、ちゃんとcolumn_infoが出てくるようになりました。

DBD-Oracleの方にパッチ当てるのが筋かなあと思いますし、元々DBD-Oracleにはパッチを当てて使っているのでとりあえず後者を採用することにしました。

何か問題があったらまた考える。