[Dbix-class] dbix + perl5.18

Peter Rabbitson rabbit+dbic at rabbit.us
Wed Jun 12 14:17:25 GMT 2013


On Wed, Jun 12, 2013 at 03:42:20PM +0200, Bernhard Bauch wrote:
> dear dbix-folks,
>
> ...
>
> i figured out where the problem is!
> 
> since perl 5.18 >>> hash-ramdomizatiomn is used see:
> 	https://metacpan.org/module/RJBS/perl-5.18.0/pod/perldelta.pod#Hash-randomization
> 
> in DBIx::Class::Schema.pm line 232: 
> 	my %results = $class->_map_namespaces(@$result_namespace);
> an ordered list of result classes is stored in an hash ....
> 

This can't be true - _map_namespaces returns a list, without any
kind of order (it's Filesystem order). Even if it did - the order
would not be preserved on older perls either, after the hash
assignment.

> later in line242:
>     for my $res (values %results) {
> 	$class->ensure_class_loaded($res);
> this hash is used
> the error ist, that "values" return a randomly sorted list now ... the correct order coming from
> 	$class->_map_namespaces(@$result_namespace);
> is neglected.
> 
> 
> this was my workaround-fix ....
> ---------------------------
> diff Schema.pm_fix Schema.pm
> 235,241d234
> <     # correct order !!!
> <     my @result_classes;
> <     foreach my $class ( $class->_map_namespaces(@$result_namespace) ){
> <         push (@result_classes, $class) if $class =~ /Schema::Result/;
> <     }
> < 
> < 
> 249,250c242
> < #    for my $res (values %results) {
> <     for my $res ( @result_classes )  {
> ---
> >     for my $res (values %results) {
> ---------------------------


This can't be the correct fix due to reasons described above. Something 
else is happening that prevents a *specific class* requiring its 
far-relationship side.

Please provide several definitions of the adected classes (both the ones 
that throw an exception, and the ones whose load fails).

> 
> maybe this should be fixed in upcoming DBIx::Class releases ?

It should definitely be fixed, but first the real problem must be 
identified ;)

Cheers




More information about the DBIx-Class mailing list