にぽたん研修所 兼 にぽたん休憩所

旧にぽたん休憩所をマージしたからわけがわからない

CDBI + Plugin::Iterator + sth_to_objects()

CDBI を使ってて、

__PACKAGE__->set_sql(Foo =><<'SQL');
SELECT __ESSENTIAL__
FROM __TABLE__
WHERE foo = ? AND bar = ?
SQL

sub do_something {
    my($class, $foo, $bar) = @_;
    my $sth = $class->sql_Foo;
    $sth->execute($foo, $bar);
    return $class->sth_to_objects($sth);
}

Class::DBI::Plugin::Iterator を use しておいてこんなんしとくと、CDBI の $VERSION が古いやつの場合に、scalar context で動いてくれない。
動いてくれんというか、空っぽの Iterator が返る。


3.x 系ではちゃんと動いたんだけど、0.9x 系でちゃんと動かん。
でも現状数十台あるサーバの全台を 3.x 系に更新するのはちょっと危なっかしい。

__PACKAGE__->plugin_iterator_disable(1);

とかしておけばいいんだけど、class data として全体で disable にはしたくない。
ここを呼んでるとこだけどうにかしたい。


色々試してみると、set_sql() したやつの場合だけっぽい。

sub do_something {
    my($class, $foo, $bar) = @_;
    require UNIVERSAL;
    if (UNIVERSAL::can($class, 'plugin_iterator_disable') &&
        !$class->plugin_iterator_disable) {
        return $class->sth_to_objects('Foo', [$foo, $bar]);
    }
    else {
        my $sth = $class->sql_Foo;
        $sth->execute($foo, $bar);
        return $class->sth_to_objects($sth);
    }
}

こうしておけば、一応 Plugin::Iterator を使ってても使ってなくても意図した通りちゃんと動く。
sth_to_objects() に $sth を渡すとかしてないから、なんかちょっとキモいけど。


いや、、、うーむ、、、すげー BK だな。。。



BK つっても、Batara Kesuma ではないよー。