switch to MX::Traits, document attributes
[catagits/Catalyst-Model-DBIC-Schema.git] / lib / Catalyst / Model / DBIC / Schema / Trait / Replicated.pm
1 package Catalyst::Model::DBIC::Schema::Trait::Replicated;
2
3 use Moose::Role;
4 use Moose::Autobox;
5 use Carp::Clan '^Catalyst::Model::DBIC::Schema';
6
7 use Catalyst::Model::DBIC::Schema::Types 'ConnectInfos';
8
9 use namespace::clean -except => 'meta';
10
11 =head1 NAME
12
13 Catalyst::Model::DBIC::Schema::Trait::Replicated - Replicated storage support for
14 L<Catalyst::Model::DBIC::Schema>
15
16 =head1 SYNOPSiS
17
18     __PACKAGE__->config({
19         traits => ['Replicated']
20         connect_info => 
21             ['dbi:mysql:master', 'user', 'pass'],
22         replicants => [
23             ['dbi:mysql:slave1', 'user', 'pass'],
24             ['dbi:mysql:slave2', 'user', 'pass'],
25             ['dbi:mysql:slave3', 'user', 'pass'],
26         ],
27         balancer_args => {
28           master_read_weight => 0.3
29         }
30     });
31
32 =head1 DESCRIPTION
33
34 Sets your storage_type to L<DBIx::Class::Storage::DBI::Replicated> and connects
35 replicants provided in config. See that module for supported resultset
36 attributes.
37
38 The default L<DBIx::Class::Storage::DBI::Replicated/balancer_type> is
39 C<::Random>.
40
41 Sets the
42 L<DBIx::Class::Storage::DBI::Replicated::Balancer::Random/master_read_weight> to
43 C<1> by default, meaning that you have the same chance of reading from master as
44 you do from replicants. Set to C<0> to turn off reads from master.
45
46 =head1 CONFIG PARAMETERS
47
48 =head2 replicants
49
50 Array of connect_info settings for every replicant.
51
52 =cut
53
54 has replicants => (
55     is => 'ro', isa => ConnectInfos, coerce => 1, required => 1
56 );
57
58 after setup => sub {
59     my $self = shift;
60
61 # check storage_type compatibility (if configured)
62     if (my $storage_type = $self->storage_type) {
63         my $class = $storage_type =~ /^::/ ?
64             "DBIx::Class::Storage$storage_type"
65             : $storage_type;
66
67         croak "This storage_type cannot be used with replication"
68             unless $class->isa('DBIx::Class::Storage::DBI::Replicated');
69     } else {
70         $self->storage_type('::DBI::Replicated');
71     }
72
73     $self->connect_info->{balancer_type} ||= '::Random'
74         unless $self->connect_info->{balancer_type};
75
76     unless ($self->connect_info->{balancer_args} &&
77             exists $self->connect_info->{balancer_args}{master_read_weight}) {
78         $self->connect_info->{balancer_args}{master_read_weight} = 1;
79     }
80 };
81
82 my $build = sub {
83     my $self = shift;
84
85     $self->storage->connect_replicants(map [ $_ ], $self->replicants->flatten);
86 };
87 after BUILD => $build;
88 sub BUILD { goto $build }
89
90 =head1 SEE ALSO
91
92 L<Catalyst::Model::DBIC::Schema>, L<DBIx::Class>,
93 L<DBIx::Class::Storage::DBI::Replicated>,
94 L<Cache::FastMmap>, L<DBIx::Class::Cursor::Cached>
95
96 =head1 AUTHOR
97
98 Rafael Kitover, C<rkitover at cpan.org>
99
100 =head1 COPYRIGHT
101
102 This program is free software, you can redistribute it and/or modify it
103 under the same terms as Perl itself.
104
105 =cut
106
107 1;