nekoya/p5-dbix-skinny-schema-loader — pull request #7 by nyo-kichi (2012-02-18 00:33:54+00:00)
Title: Loader で読み込んだ時のプライマリーキーの持ち方を修正

はじめまして。
nyo-kichi と申します。

Loader で読み込んだ時のプライマリーキーの持ち方を、Skinny::Schema の install_table でセットアップした時と同じになるように修正してみました。

元の Loader だと、例えば auto increment なプライマリーキーをもつテーブルをロードしてあつかった場合、そのテーブルへ insert した後、戻り値の Row にプライマリーキーの値が入っていませんでした。

DBIx::Skinny-0.0742(今の最新)では、以下のように insert 後にプライマリーキーをとってきているのですが

DBIx/Skinny.pm
581 sub _insert_or_replace {
582 my ($class, $is_replace, $table, $args) = @_;
...(省略)...
598 my $sth = $class->_execute($sql, $bind_columns, $table);
599 $class->_close_sth($sth);
600
601 my $pk = $class->schema->schema_info->{$table}->{pk};
602
603 if (defined $pk && not(ref $pk) && not(defined $args->{$pk})) {
604 $args->{$pk} = $class->_last_insert_id($table);
605 }
606

603 行目の条件判定が偽になってしまうため、insert 後の主キーが取れてませんでした。

修正ですが
DBIx::Skinny::Schema::Loader::DBI の table_pk が返す値を、DBIx::Skinny::Schema の pk がセットするのと同じになるよう修正してみました。

DBIx/Skinny/Schema.pm
55 sub pk {
56 my @columns = @_;
57
58 my $class = caller;
59 $class->schema_info->{
60 $class->schema_info->{_installing_table}
61 }->{pk} = (@columns == 1 ? $columns[0] : \@columns);
62 }

61行目みたいに
* カラムが1つならスカラー
* そうでないなら配列のリファレンス
となるようにしています。