X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FStorage%2FDBI%2FReplicated%2FPool.pm;h=6fe704626a35a3bc34d8bb5b64f5fc216ad5bc7b;hb=c354902c20a8459162b76a4006cb6091af5bf6d4;hp=123cc47521d05d62264b9ac8a5481bb69760c662;hpb=17b05c131035f73964c434c1a9c8b28e46aebeeb;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 123cc47..6fe7046 100644 --- a/lib/DBIx/Class/Storage/DBI/Replicated/Pool.pm +++ b/lib/DBIx/Class/Storage/DBI/Replicated/Pool.pm @@ -13,7 +13,7 @@ DBIx::Class::Storage::DBI::Replicated::Pool; Manage a pool of replicants This class is used internally by L. You shouldn't need to create instances of this class. - + =head1 DESCRIPTION In a replicated storage type, there is at least one replicant to handle the @@ -36,11 +36,11 @@ return a number of seconds that the replicating database is lagging. =cut has 'maximum_lag' => ( - is=>'rw', - isa=>'Num', - required=>1, - lazy=>1, - default=>0, + is=>'rw', + isa=>'Num', + required=>1, + lazy=>1, + default=>0, ); =head2 last_validated @@ -52,14 +52,12 @@ builtin. =cut has 'last_validated' => ( - is=>'rw', - isa=>'Int', - reader=>'last_validated', - writer=>'_last_validated', - lazy=>1, - default=>sub { - time; - }, + is=>'rw', + isa=>'Int', + reader=>'last_validated', + writer=>'_last_validated', + lazy=>1, + default=>0, ); =head2 replicant_type ($classname) @@ -71,13 +69,13 @@ just leave this alone. =cut has 'replicant_type' => ( - is=>'ro', - isa=>'ClassName', - required=>1, - default=>'DBIx::Class::Storage::DBI', - handles=>{ - 'create_replicant' => 'new', - }, + is=>'ro', + isa=>'ClassName', + required=>1, + default=>'DBIx::Class::Storage::DBI', + handles=>{ + 'create_replicant' => 'new', + }, ); =head2 replicants @@ -85,13 +83,13 @@ has 'replicant_type' => ( A hashref of replicant, with the key being the dsn and the value returning the actual replicant storage. For example if the $dsn element is something like: - "dbi:SQLite:dbname=dbfile" - + "dbi:SQLite:dbname=dbfile" + You could access the specific replicant via: - $schema->storage->replicants->{'dbname=dbfile'} - -This attributes also supports the following helper methods + $schema->storage->replicants->{'dbname=dbfile'} + +This attributes also supports the following helper methods: =over 4 @@ -120,17 +118,17 @@ removes the replicant under $key from the pool =cut has 'replicants' => ( - is=>'rw', - metaclass => 'Collection::Hash', - isa=>'HashRef[DBIx::Class::Storage::DBI]', - default=>sub {{}}, - provides => { - 'set' => 'set_replicant', - 'get' => 'get_replicant', - 'empty' => 'has_replicants', - 'count' => 'num_replicants', - 'delete' => 'delete_replicant', - }, + is=>'rw', + metaclass => 'Collection::Hash', + isa=>'HashRef[DBIx::Class::Storage::DBI]', + default=>sub {{}}, + provides => { + 'set' => 'set_replicant', + 'get' => 'get_replicant', + 'empty' => 'has_replicants', + 'count' => 'num_replicants', + 'delete' => 'delete_replicant', + }, ); =head1 METHODS @@ -146,23 +144,36 @@ L attribute. =cut sub connect_replicants { - my $self = shift @_; - my $schema = shift @_; - - my @newly_created = (); - foreach my $connect_info (@_) { - - my $replicant = $self->create_replicant($schema); - $replicant->connect_info($connect_info); - $replicant->ensure_connected; - DBIx::Class::Storage::DBI::Replicated::Replicant->meta->apply($replicant); - - my ($key) = ($connect_info->[0]=~m/^dbi\:.+\:(.+)$/); - $self->set_replicant( $key => $replicant); - push @newly_created, $replicant; - } - - return @newly_created; + my $self = shift @_; + my $schema = shift @_; + + my @newly_created = (); + foreach my $connect_info (@_) { + my $replicant = $self->connect_replicant($schema, $connect_info); + my ($key) = ($connect_info->[0]=~m/^dbi\:.+\:(.+)$/); + $self->set_replicant( $key => $replicant); + push @newly_created, $replicant; + } + + return @newly_created; +} + +=head2 connect_replicant ($schema, $connect_info) + +Given a schema object and a hashref of $connect_info, connect the replicant +and return it. + +=cut + +sub connect_replicant { + my ($self, $schema, $connect_info) = @_; + my $replicant = $self->create_replicant($schema); + + $replicant->connect_info($connect_info); + $replicant->ensure_connected; + DBIx::Class::Storage::DBI::Replicated::Replicant->meta->apply($replicant); + + return $replicant; } =head2 connected_replicants @@ -170,11 +181,11 @@ sub connect_replicants { Returns true if there are connected replicants. Actually is overloaded to return the number of replicants. So you can do stuff like: - if( my $num_connected = $storage->has_connected_replicants ) { - print "I have $num_connected connected replicants"; - } else { - print "Sorry, no replicants."; - } + if( my $num_connected = $storage->has_connected_replicants ) { + print "I have $num_connected connected replicants"; + } else { + print "Sorry, no replicants."; + } This method will actually test that each replicant in the L hashref is actually connected, try not to hit this 10 times a second. @@ -182,10 +193,10 @@ is actually connected, try not to hit this 10 times a second. =cut sub connected_replicants { - my $self = shift @_; - return sum( map { - $_->connected ? 1:0 - } $self->all_replicants ); + my $self = shift @_; + return sum( map { + $_->connected ? 1:0 + } $self->all_replicants ); } =head2 active_replicants @@ -197,10 +208,10 @@ should automatically reconnect them for us when we hit them with a query. =cut sub active_replicants { - my $self = shift @_; - return ( grep {$_} map { - $_->active ? $_:0 - } $self->all_replicants ); + my $self = shift @_; + return ( grep {$_} map { + $_->active ? $_:0 + } $self->all_replicants ); } =head2 all_replicants @@ -211,8 +222,8 @@ array is given, nor should any meaning be derived. =cut sub all_replicants { - my $self = shift @_; - return values %{$self->replicants}; + my $self = shift @_; + return values %{$self->replicants}; } =head2 validate_replicants @@ -234,23 +245,20 @@ not recommended that you run them very often. =cut sub validate_replicants { - my $self = shift @_; - foreach my $replicant($self->all_replicants) { - if( - $replicant->is_replicating && - $replicant->lag_behind_master <= $self->maximum_lag && - $replicant->ensure_connected - ) { - ## TODO:: Hook debug for this - $replicant->active(1) - } else { - ## TODO:: Hook debug for this - $replicant->active(0); - } + my $self = shift @_; + foreach my $replicant($self->all_replicants) { + if( + $replicant->is_replicating && + $replicant->lag_behind_master <= $self->maximum_lag && + $replicant->ensure_connected + ) { + $replicant->active(1) + } else { + $replicant->active(0); } - - ## Mark that we completed this validation. - $self->_last_validated(time); + } + ## Mark that we completed this validation. + $self->_last_validated(time); } =head1 AUTHOR @@ -263,4 +271,6 @@ You may distribute this code under the same terms as Perl itself. =cut +__PACKAGE__->meta->make_immutable; + 1;