Why does DBIx::Class with multiple inheritance fail on update?
I have a DBIC schema, where all the classes use a common base class, and definition class. The base class loads common components, and overrides the update method in order to record changesets in an audit table. The definition class is a static class generated from the database. A typical class header looks something like:
package Schema::Base;
use base 'DBIx::Class::Core';
sub update {
my $self = shift;
# track changes to row
my $instance = $self->next::method(@_);
# sa开发者_开发技巧ve changeset to audit table
return $instance;
}
package Schema::Immutable::User;
use Moose;
use MooseX::NonMoose;
use namespace::autoclean;
extends 'DBIx::Class:Core';
__PACKAGE__->load_components("InflateColumn::DateTime");
package Schema::Mutable::User
use base ('Schema::Base', 'Schema::Immutable::User');
sub update {
my $self = shift;
# encrypt password
return $self->next::method(@_);
}
Everything was working fine until I added and an override to the update in the User class. Apparently having the override in the base class, and the User class conflict in some way. I'm using next::method(@_) to call the next update method, but it always hangs.
This is a CGI application. So when I hit "save" the browser spins its wheels until I hit escape to cancel the request. At this point, my logging picks back up and it shows that all the queries are being executed correctly, and quickly, but it hangs at the end of the User class, and does not progress until I hit escape in the browser.
UPDATE: This appears to be an issue with the interaction with catalyst. When run by itself this code works correctly. However, when executed from within a catalyst application it fails.
I discovered the root cause of this issue in the application I was debugging. The original author was creating a request parsing object that instantiates a CGI object to parse the incoming request. However, this conflicts with catalyst, so the request object spins its wheels until the request from the client ends. Apparently all they needed to get was the url, and the ip from the user so it was easy enough to insert code to do that using the environmental variables without calling CGI.
精彩评论