[Dbix-class] Re: $row->copy causing exit from controller(!)

Ash Berlin ash_cpan at firemirror.com
Thu May 8 11:52:04 BST 2008


On 8 May 2008, at 10:42, Paul Makepeace wrote:

> On Thu, May 1, 2008 at 11:31 AM, Paul Makepeace <paulm at paulm.com>  
> wrote:
>> I'm seeing something exceedingly odd: copying data causing a  
>> premature
>> return from the controller, like a detach(),
>>
>>        foreach my $table (@chart_related_tables) {
>>          my $rs = $ds->resultset($table);
>>          warn "copying $table for ", $new_chart->uid;
>>          for my $row ($rs->search({web_chart_spec_uid => $chart- 
>> >uid})) {
>>            warn "..row ", $row->web_chart_spec_uid, $row;
>>            $row->copy({web_chart_spec_uid => $new_chart->uid});  #  
>> XXX
>>          }
>>          #$_->copy({web_chart_spec_uid => $new_chart->uid})
>>              #for $rs->search({web_chart_spec_uid => $chart->uid});
>>          die "cloned", $new_chart->uid;
>>        }
>>
>> There's no further execution past the line marked XXX: the template  
>> is
>> rendered from that point on. The die is never called.
>>
>> I have a feeling it's something to do with has_many
>>
>> Chart:
>> __PACKAGE__->has_many(chartview_company =>  
>> 'IDL::Schema::ChartCompany'
>> => 'web_chart_spec_uid', {cascade_delete => 0});
>>
>> If I exclude from @chart_related_tables ChartCompany it works.
>
> I had the stroke of intuition to wrap the call to copy() in an "eval
> {}; warn @$ if $@;" and saw what is going on. It seems like the copy()
> is not just copying the row but other rows as well, which is in turn
> causing duplicate key errors, in particular the rels mentioned above
> that have has_many. The controller at least completes now. (Why an
> error like this would bypass the exception handler is a mystery and
> presumably a bug.)

This is what Jon Rockway and myself were saying. Somewhere in your  
application stack you have an die handler/eval block that is clearing  
$@. If you dont have Catalyst::Plugin::StackTrace installed (or have  
an old version) I'm not sure what could be causing it.

Try upgrading to latest ver of DBIx::Class - 0.08010 - I think that I  
might have fixed a possible cause of losing an exception between 09  
and 10 in Row->insert, which might be used by copy. Worth a go.

>
> Sorry I haven't got more debug, I'm squeezing this into occasional
> spare minutes here and there. If there's something specific I can try
> or provide, let me know. Unfortunately getting the fastcgi working
> with perl -d isn't likely any time soon. I don't think it's there in
> any case; it feels more DBIx::Class related.
>

This same error should also happen under the myapp_server.pl, which  
makes it some what easier to run under perl -d if upgrading doesn't  
make the exception appear properly.





More information about the DBIx-Class mailing list