X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FCatalyst%2FTraitFor%2FModel%2FDBIC%2FSchema%2FReplicated.pm;h=a978d1deaea9eab69b8daeaaf94d2822a0b1134f;hb=45b101914d8e7130178e9f9748deda25992b6317;hp=e6540b68b92762fd206ac89ec6daab14c11e5ac3;hpb=fb691af97ffd7b3043d2d536db478af6219896f4;p=catagits%2FCatalyst-Model-DBIC-Schema.git diff --git a/lib/Catalyst/TraitFor/Model/DBIC/Schema/Replicated.pm b/lib/Catalyst/TraitFor/Model/DBIC/Schema/Replicated.pm index e6540b6..a978d1d 100644 --- a/lib/Catalyst/TraitFor/Model/DBIC/Schema/Replicated.pm +++ b/lib/Catalyst/TraitFor/Model/DBIC/Schema/Replicated.pm @@ -2,10 +2,12 @@ package Catalyst::TraitFor::Model::DBIC::Schema::Replicated; use namespace::autoclean; use Moose::Role; -use Moose::Autobox; use Carp::Clan '^Catalyst::Model::DBIC::Schema'; -use Catalyst::Model::DBIC::Schema::Types 'ConnectInfos'; +use Catalyst::Model::DBIC::Schema::Types qw/ConnectInfos LoadableClass/; +use MooseX::Types::Moose qw/Str HashRef/; + +use Module::Runtime qw/use_module/; =head1 NAME @@ -16,7 +18,7 @@ L __PACKAGE__->config({ traits => ['Replicated'] - connect_info => + connect_info => ['dbi:mysql:master', 'user', 'pass'], replicants => [ ['dbi:mysql:slave1', 'user', 'pass'], @@ -48,12 +50,37 @@ you do from replicants. Set to C<0> to turn off reads from master. Array of connect_info settings for every replicant. +The following can be set via L, or +as their own parameters. If set via separate parameters, they will override the +settings in C. + +=head2 pool_type + +See L. + +=head2 pool_args + +See L. + +=head2 balancer_type + +See L. + +=head2 balancer_args + +See L. + =cut has replicants => ( is => 'ro', isa => ConnectInfos, coerce => 1, required => 1 ); +has pool_type => (is => 'ro', isa => LoadableClass); +has pool_args => (is => 'ro', isa => HashRef); +has balancer_type => (is => 'ro', isa => Str); +has balancer_args => (is => 'ro', isa => HashRef); + after setup => sub { my $self = shift; @@ -63,40 +90,57 @@ after setup => sub { "DBIx::Class::Storage$storage_type" : $storage_type; + use_module($class); + croak "This storage_type cannot be used with replication" unless $class->isa('DBIx::Class::Storage::DBI::Replicated'); } else { $self->storage_type('::DBI::Replicated'); } - $self->connect_info->{balancer_type} ||= '::Random' - unless $self->connect_info->{balancer_type}; + my $connect_info = $self->connect_info; - unless ($self->connect_info->{balancer_args} && - exists $self->connect_info->{balancer_args}{master_read_weight}) { - $self->connect_info->{balancer_args}{master_read_weight} = 1; - } + $connect_info->{pool_type} = $self->pool_type + if $self->pool_type; + + $connect_info->{pool_args} = $self->pool_args + if $self->pool_args; + + $connect_info->{balancer_type} = $self->balancer_type || + $connect_info->{balancer_type} || '::Random'; + + $connect_info->{balancer_args} = $self->balancer_args || + $connect_info->{balancer_args} || {}; + + $connect_info->{balancer_args}{master_read_weight} = 1 + unless exists $connect_info->{balancer_args}{master_read_weight}; }; sub BUILD {} + after BUILD => sub { my $self = shift; - $self->storage->connect_replicants(map [ $_ ], $self->replicants->flatten); + $self->storage->connect_replicants(map [ $_ ], @{ $self->replicants }); }; =head1 SEE ALSO L, L, L, -L, L +L =head1 AUTHOR -Rafael Kitover, C +See L and +L. =head1 COPYRIGHT +See L. + +=head1 LICENSE + This program is free software, you can redistribute it and/or modify it under the same terms as Perl itself.