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 ではないよー。