[CDBI] Errors with CDBI

Ken Youens-Clark kyclark at gmail.com
Thu Feb 9 16:59:53 GMT 2006


CDBI'ers:

I've started really using Class::DBI (3.0.14) on a development server  
at work and have been proselytizing my cow-orkers to convert.  It's  
mostly going very well, but it appears that CDBI errors occasionally  
take down our Apache server.  Specifically, since I added the use of  
CDBI classes to this one CGI script, Apache has been locking up at  
least once or twice a day.  When I look in the error logs just after  
this happens, I see errors like the following:

> Subroutine Gramene::CDBI::Literature::retrieve_all redefined at / 
> usr/local/lib/perl5/site_perl/5.8.6/Class/DBI/Plugin/RetrieveAll.pm  
> line 88.
> Subroutine Gramene::CDBI::Markers::retrieve_all redefined at /usr/ 
> local/lib/perl5/site_perl/5.8.6/Class/DBI/Plugin/RetrieveAll.pm  
> line 88.
> Subroutine Gramene::CDBI::retrieve_all redefined at /usr/local/lib/ 
> perl5/site_perl/5.8.6/Class/DBI/Plugin/RetrieveAll.pm line 88.
> Use of uninitialized value in concatenation (.) or string at /usr/ 
> local/lib/perl5/site_perl/5.8.6/Class/DBI/Relationship.pm line 67.
> Use of uninitialized value in concatenation (.) or string at /usr/ 
> local/lib/perl5/site_perl/5.8.6/Class/DBI/Relationship/HasMany.pm  
> line 86.
> Use of uninitialized value in join or string at /usr/local/lib/ 
> perl5/site_perl/5.8.6/Class/DBI.pm line 47.
> Use of uninitialized value in list assignment at /usr/local/lib/ 
> perl5/site_perl/5.8.6/Class/DBI/Relationship.pm line 63.
> search_count_search_where() already exists at /usr/local/lib/perl5/ 
> site_perl/5.8.6/Class/DBI/Plugin/AbstractCount.pm line 13
> search_retrieve_all_sorted() already exists at /usr/local/lib/perl5/ 
> site_perl/5.8.6/Class/DBI/Plugin/RetrieveAll.pm line 64

As this has been happening, I've been hacking the CDBI source to fix  
what are mostly assumptions about the definedness of variables and  
the ability to use them as (array|hash) refs, etc.  I used  
Module::Build::Convert to quickly make a Build.PL so I could then do  
"Build diff" to see all the changes I've made.  Here they are:

diff /usr/local/lib/perl5/site_perl/5.8.6/Class/DBI/Relationship.pm  
blib/lib/Class/DBI/Relationship.pm
23c23
< 	$class->clear_object_index if defined $class;
---
 > 	$class->clear_object_index;
42,44c42
<     if ( defined $self->class ) {
<         $self->class->_extend_meta($self->name => $self->accessor  
=> $self);
<     }
---
 > 	$self->class->_extend_meta($self->name => $self->accessor => $self);
64c62
< 	my $class   = $self->class   || '';
---
 > 	my $class   = $self->class;
67d64
<         next unless $method;
diff /usr/local/lib/perl5/site_perl/5.8.6/Class/DBI/Relationship/ 
HasMany.pm blib/lib/Class/DBI/Relationship/HasMany.pm
57,60c57,58
<     if ( ref $self->args eq 'HASH' ) {
<         $self->class->_extend_class_data(
<             __hasa_list => $self->foreign_class => $self->args-> 
{foreign_key});
<     }
---
 > 	$self->class->_extend_class_data(
 > 		__hasa_list => $self->foreign_class => $self->args->{foreign_key});
66,67d63
< 	return unless ref $self->args eq 'HASH';
<
84c80
< 	my $accessor = $self->accessor || '';
---
 > 	my $accessor = $self->accessor;
123,137c119,126
< 	if (  ref $self->args eq 'HASH'
< 	   && ref $self->args->{mapping} eq 'ARRAY'
<     ) {
<         my @mapping    = @{ $self->args->{mapping} };
<         return sub {
<             return $run_search->(@_)->set_mapping_method(@mapping)
<                 unless wantarray;
<             my @ret = $run_search->(@_);
<             foreach my $meth (@mapping) { @ret = map $_->$meth(),  
@ret }
<             return @ret;
<             };
<     }
<     else {
<         return $run_search;
<     }
---
 > 	my @mapping    = @{ $self->args->{mapping} } or return $run_search;
 > 	return sub {
 > 		return $run_search->(@_)->set_mapping_method(@mapping)
 > 			unless wantarray;
 > 		my @ret = $run_search->(@_);
 > 		foreach my $meth (@mapping) { @ret = map $_->$meth(), @ret }
 > 		return @ret;
 > 		}

Do these look like reasonable changes?  Does anyone else have such  
serious problems with CDBI that it crashes Apache (to the point that  
even static pages cannot be served)?  Should I submit these to  
rt.cpan.org for Tony to integrate?

ky




More information about the ClassDBI mailing list