From: Rafael Kitover Date: Mon, 31 Aug 2009 15:30:37 +0000 (+0000) Subject: fix case where repelicant coderef dsn does not connect X-Git-Tag: v0.08111~43 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=ede99b9f99bb77ceda57e42d8046d4942e8a40fa;p=dbsrgits%2FDBIx-Class.git fix case where repelicant coderef dsn does not connect --- diff --git a/lib/DBIx/Class/Storage/DBI/Replicated/Pool.pm b/lib/DBIx/Class/Storage/DBI/Replicated/Pool.pm index ac943f6..e5fa1a1 100644 --- a/lib/DBIx/Class/Storage/DBI/Replicated/Pool.pm +++ b/lib/DBIx/Class/Storage/DBI/Replicated/Pool.pm @@ -138,6 +138,16 @@ has 'replicants' => ( }, ); +has next_unknown_replicant_id => ( + is => 'rw', + metaclass => 'Counter', + isa => Int, + default => 1, + provides => { + inc => 'inc_unknown_replicant_id' + }, +); + =head1 METHODS This class defines the following methods. @@ -166,7 +176,8 @@ sub connect_replicants { my $dsn; my $replicant = do { -# yes this is evil, but it only usually happens once +# yes this is evil, but it only usually happens once (for coderefs) +# this will fail if the coderef does not actually DBI::connect no warnings 'redefine'; my $connect = \&DBI::connect; local *DBI::connect = sub { @@ -176,15 +187,27 @@ sub connect_replicants { $self->connect_replicant($schema, $connect_info); }; - if (!$dsn && !$connect_coderef) { - $dsn = $connect_info->[0]; - $dsn = $dsn->{dsn} if (reftype($dsn)||'') eq 'HASH'; - } - $replicant->dsn($dsn); + my $key; - my ($key) = ($dsn =~ m/^dbi\:.+\:(.+)$/i); + if (!$dsn) { + if (!$connect_coderef) { + $dsn = $connect_info->[0]; + $dsn = $dsn->{dsn} if (reftype($dsn)||'') eq 'HASH'; + } + else { + # all attempts to get the DSN failed + $key = "UNKNOWN_" . $self->next_unknown_replicant_id; + $self->inc_unknown_replicant_id; + } + } + if ($dsn) { + $replicant->dsn($dsn); + ($key) = ($dsn =~ m/^dbi\:.+\:(.+)$/i); + } + $replicant->id($key); $self->set_replicant($key => $replicant); + push @newly_created, $replicant; } diff --git a/lib/DBIx/Class/Storage/DBI/Replicated/Replicant.pm b/lib/DBIx/Class/Storage/DBI/Replicated/Replicant.pm index 8825cae..08a95ef 100644 --- a/lib/DBIx/Class/Storage/DBI/Replicated/Replicant.pm +++ b/lib/DBIx/Class/Storage/DBI/Replicated/Replicant.pm @@ -52,10 +52,8 @@ has 'active' => ( default=>1, ); -has dsn => ( - is => 'rw', - isa => Str, -); +has dsn => (is => 'rw', isa => Str); +has id => (is => 'rw', isa => Str); =head1 METHODS diff --git a/lib/DBIx/Class/Storage/DBI/Replicated/WithDSN.pm b/lib/DBIx/Class/Storage/DBI/Replicated/WithDSN.pm index a6fe522..7cab9a9 100644 --- a/lib/DBIx/Class/Storage/DBI/Replicated/WithDSN.pm +++ b/lib/DBIx/Class/Storage/DBI/Replicated/WithDSN.pm @@ -41,6 +41,9 @@ around '_query_start' => sub { if ((reftype($dsn)||'') ne 'CODE') { "$op [DSN_$storage_type=$dsn]$rest"; } + elsif (my $id = eval { $self->id }) { + "$op [$storage_type=$id]$rest"; + } else { "$op [$storage_type]$rest"; }