X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FStorage%2FDBI%2FReplicated%2FPool.pm;h=a7a1dfa333b4301baded6542530b7f8b212629de;hb=c4d78acbeb6e3f3d4a33d457f4b8a6fef342cc49;hp=c31cd4d8c6e9bc8c4e612dc07c670d968bd165b3;hpb=0bd8e0585b592d2583f28b6922b47afa78559cf4;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/Storage/DBI/Replicated/Pool.pm b/lib/DBIx/Class/Storage/DBI/Replicated/Pool.pm index c31cd4d..a7a1dfa 100644 --- a/lib/DBIx/Class/Storage/DBI/Replicated/Pool.pm +++ b/lib/DBIx/Class/Storage/DBI/Replicated/Pool.pm @@ -1,7 +1,6 @@ package DBIx::Class::Storage::DBI::Replicated::Pool; use Moose; -use MooseX::AttributeHelpers; use DBIx::Class::Storage::DBI::Replicated::Replicant; use List::Util 'sum'; use Scalar::Util 'reftype'; @@ -125,16 +124,31 @@ removes the replicant under $key from the pool has 'replicants' => ( is=>'rw', - metaclass => 'Collection::Hash', + traits => ['Hash'], isa=>HashRef['Object'], default=>sub {{}}, - provides => { - 'set' => 'set_replicant', - 'get' => 'get_replicant', - 'empty' => 'has_replicants', - 'count' => 'num_replicants', - 'delete' => 'delete_replicant', - 'values' => 'all_replicant_storages', + handles => { + 'set_replicant' => 'set', + 'get_replicant' => 'get', + 'has_replicants' => 'is_empty', + 'num_replicants' => 'count', + 'delete_replicant' => 'delete', + 'all_replicant_storages' => 'values', + }, +); + +around has_replicants => sub { + my ($orig, $self) = @_; + return !$self->$orig; +}; + +has next_unknown_replicant_id => ( + is => 'rw', + traits => ['Counter'], + isa => Int, + default => 1, + handles => { + 'inc_unknown_replicant_id' => 'inc', }, ); @@ -159,32 +173,45 @@ sub connect_replicants { $connect_info = [ $connect_info ] if reftype $connect_info ne 'ARRAY'; - my $replicant = $self->connect_replicant($schema, $connect_info); - my $connect_coderef = (reftype($connect_info->[0])||'') eq 'CODE' ? $connect_info->[0] : (reftype($connect_info->[0])||'') eq 'HASH' && $connect_info->[0]->{dbh_maker}; my $dsn; - if (not $connect_coderef) { - $dsn = $connect_info->[0]; - $dsn = $dsn->{dsn} if (reftype($dsn)||'') eq 'HASH'; - } - else { -# yes this is evil, but it only usually happens once + my $replicant = do { +# 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 { $dsn = $_[1]; goto $connect; }; - $connect_coderef->(); + $self->connect_replicant($schema, $connect_info); + }; + + my $key; + + 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->dsn($dsn); - my ($key) = ($dsn =~ m/^dbi\:.+\:(.+)$/i); + $replicant->id($key); $self->set_replicant($key => $replicant); + push @newly_created, $replicant; }