Skip Menu |
 

This queue is for tickets about the DBIx-Class CPAN distribution.

Report information
The Basics
Id: 27488
Status: resolved
Priority: 0/
Queue: DBIx-Class

People
Owner: Nobody in particular
Requestors: stephen.butler [...] gmail.com
Cc:
AdminCc:

Bug Information
Severity: Important
Broken in: (no value)
Fixed in: (no value)



Subject: ::Storage::DBI modifies the options hash of connect_info
Download (untitled) / with headers
text/plain 1.6k
Suppose you have the following code: $config->{'connect_info'} = [ 'dbi:mysql:foo', 'bar', 'baz', { quote_char => '`', name_sep => '.' } ]; $schema1 = MyApp::Schema->connect( @{$config->{'connect_info'}} ); $schema2 = MyApp::Schema->connect( @{$config->{'connect_info'}} ); Operations through $schema1 will use the quote_char/name_sep, but operations through $schema2 will not. After hunting it down, I located the problem in ::Storage::DBI, inside "connect_info": if($info_arg) { # Kill sql_maker/_sql_maker_opts, so we get a fresh one with only # the new set of options $self->_sql_maker(undef); $self->_sql_maker_opts({}); my $info = [ @$info_arg ]; # copy because we can alter it my $last_info = $info->[-1]; if(ref $last_info eq 'HASH') { if(my $on_connect_do = delete $last_info->{on_connect_do}) { $self->on_connect_do($on_connect_do); } for my $sql_maker_opt (qw/limit_dialect quote_char name_sep/) { if(my $opt_val = delete $last_info->{$sql_maker_opt}) { $self->_sql_maker_opts->{$sql_maker_opt} = $opt_val; } } As the comment says, it copies $info_arg. But it only makes a shallow copy. So when it later deletes from the options hash, it modifies the original hash, not a copy. I suggest a fix of either: my $info = dclone( $info_arg ); # copy because we can alter it or (not as correct): my $last_info = $info->[-1]; if(ref $last_info eq 'HASH') { $last_info = { %$last_info }; Versions: ::Storage::DBI - 0.07006 perl - v5.8.8 built for i586-linux-thread-multi OpenSUSE 10.2 - kernel 2.6.18.8-0.3-default #1 SMP
fixed in trunk as of r3590, thanks for the report


This service is sponsored and maintained by Best Practical Solutions and runs on Perl.org infrastructure.

Please report any issues with rt.cpan.org to rt-cpan-admin@bestpractical.com.