TTのfailsafe

CDBIとかDBICイテレータ


[% WHILE (foo = foo.next) %]

とか書くと、


undef error - WHILE loop terminated (> 1000 iterations)

とか怒られた。

TT見ると


$WHILE_MAX = 1000 unless defined $WHILE_MAX;

...

sub while {
my ($class, $expr, $block) = @_;
$block = pad($block, 2) if $PRETTY;

return < $WHILE_MAX iterations)\\n"
unless \$failsafe;
};
EOF
}

こんな感じで無限ループを抑止してる。

なので、


local $Template::Directive::WHILE_MAX = $it->count+1;

こんな感じで回避。むむむきもい。
 +1
ってのがきもさ倍増。

    • -

やっぱなんかうまく動かん。。
Class::DBI::Plugin::Iterator#nextってレコードがなくなったら


my $use = $self->{_data}[$index];
unless ($use) {
$self->{_count} = $self->{_place} - 1 unless defined $self->{_count};
$self->reset;
return;
}

と、resetしてundef返してるけど、
なんかTTのWHILEでやると
何度も何度もループして$WHILE_MAXまで回る。
$WHILE_MAXを上書きしたときだけおこるっぽいかもかも。
はまったので取り合えずイテレータやめで対応。
かなしいorz...

なんでだろ。。
試したコード


sub hoge {
my $self = shift;

$it = Project::Data::User->retrieve_all;
$self->tmpl->param( users => $it );
local $Template::Directive::WHILE_MAX = $it->count+1;
}

TT側は


[% WHILE (user = users.next) %]