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できるので色々つかってみてくださいまし。