shipit DBIx::Skinny 0.04
DBIx::Skinnyの0.04を先ほどshipitしました。
今回の変更で、バックエンドのDBにPostgreSQLを利用することができるようになりました。
おいぬめさん、fujiwaraさんありがとうございます。
また、PODに結構なtypoがあるのを色々な方に指摘/直してもらいました。
ありがとうございます。
またDBIx::Skinny::Mixinというモジュールが追加されました。
これはDBIx::Skinnyをuseしたユーザモジュールにメソッドをexportさせる機能があります。
たとえば、DBIx::Class::FromSledge相当のことをしたい場合
package Proj::Model::Mixin::FromSledge; use strict; use warnings; use Carp; sub register_method { +{ create_from_sledge => \&create_from_sledge, update_from_sledge => \&update_from_sledge, }; } sub create_from_sledge { my ($self, $table, $page, $args) = @_; croak "error detected at validator" if $page->valid->is_error; my $cols = $args || {}; for my $col (@{$self->schema->schema_info->{$table}->{columns}}) { unless ($cols->{$col}) { if ($page->valid->{PLAN}->{$col}) { $cols->{$col} = &_get_val($page, $col); } elsif ($page->valid->{PLAN}->{"$col\_year"}) { if ($page->r->param("$col\_year")) { $cols->{$col} = sprintf '%d-%02d-%02d', map {$page->r->param("$col\_$_")} qw(year month day); if ($page->valid->{PLAN}->{"$col\_hour"}) { $cols->{$col} = $cols->{$col} . " " . sprintf '%02d:%02d:%02d', map {$page->r->param("$col\_$_")} qw(hour minute second); } } else { $cols->{$col} = undef; } } } } $self->insert($table, $cols); } sub update_from_sledge { my ($self, $table, $row, $page, $args) = @_; croak "error detected at validator" if $page->valid->is_error; my $cols = $args || {}; for my $col (@{$self->schema->schema_info->{$table}->{columns}}) { unless ($cols->{$col}) { if ($page->valid->{PLAN}->{$col}) { $cols->{$col} = &_get_val($page, $col); } elsif ($page->valid->{PLAN}->{"$col\_year"}) { if ($page->r->param("$col\_year")) { $cols->{$col} = sprintf '%d-%02d-%02d', map {$page->r->param("$col\_$_")} qw(year month day); if ($page->valid->{PLAN}->{"$col\_hour"}) { $cols->{$col} = $cols->{$col} . " " . sprintf '%02d:%02d:%02d', map {$page->r->param("$col\_$_")} qw(hour minute second); } } else { $cols->{$col} = undef; } } } } $row->set($cols); $row->update; $row; } sub _get_val { my ($page, $col) = @_; my @val = $page->r->param($col); if (@val==1) { return $val[0] ne '' ? $val[0] : undef; # scalar } else { return join ',', @val; # array } } 1;
このようなモジュールを用意しておいて
package Proj::Model; use DBIx::Skinny; use utf8; use DBIx::Skinny::Mixin modules => [qw/+Proj::Model::Mixin::FromSledge/]; 1;
このように設定すると、
Proj::Model->create_from_sledge('table', $pages, {}); Proj::Model->create_from_sledge('table', $row, $pages, {});
このように書くことができます。
独自拡張メソッドは簡単にexportできるので色々つかってみてくださいまし。