Code cleanup, removed redundant (old) snippets.
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / Storage / DBI / Replication.pm
CommitLineData
325e3466 1package DBIx::Class::Storage::DBI::Replication;
2
3use strict;
4use warnings;
5
6use DBIx::Class::Storage::DBI;
7use DBD::Multi;
8use base qw/Class::Accessor::Fast/;
9
10__PACKAGE__->mk_accessors( qw/read_source write_source/ );
11
12=head1 NAME
13
14DBIx::Class::Storage::DBI::Replication - Replicated database support
15
16=head1 SYNOPSIS
17
18 # change storage_type in your schema class
19 $schema->storage_type( '::DBI::Replication' );
20 $schema->connect_info( [
21 [ "dbi:mysql:database=test;hostname=master", "username", "password", { AutoCommit => 1 } ], # master
22 [ "dbi:mysql:database=test;hostname=slave1", "username", "password", { priority => 10 } ], # slave1
23 [ "dbi:mysql:database=test;hostname=slave2", "username", "password", { priority => 10 } ], # slave2
24 <...>
25 ] );
26
27=head1 DESCRIPTION
28
29This class implements replicated data store for DBI. Currently you can define one master and numerous slave database
30connections. All write-type queries (INSERT, UPDATE, DELETE and even LAST_INSERT_ID) are routed to master database,
31all read-type queries (SELECTs) go to the slave database.
32
33For every slave database you can define a priority value, which controls data source usage pattern. It uses
34L<DBD::Multi>, so first the lower priority data sources used (if they have the same priority, the are used
35randomized), than if all low priority data sources fail, higher ones tried in order.
36
37=cut
38
39sub new {
40 my $proto = shift;
41 my $class = ref( $proto ) || $proto;
dbc6d854 42 my $self = {};
325e3466 43
44 bless( $self, $class );
45
46 $self->write_source( DBIx::Class::Storage::DBI->new );
47 $self->read_source( DBIx::Class::Storage::DBI->new );
48
49 return $self;
50}
51
52sub all_sources {
53 my $self = shift;
54
dbc6d854 55 my @sources = ($self->read_source, $self->write_source);
325e3466 56
57 return wantarray ? @sources : \@sources;
58}
59
60sub connect_info {
61 my( $self, $source_info ) = @_;
62
63 $self->write_source->connect_info( $source_info->[0] );
64
65 my @dsns = map { ($_->[3]->{priority} || 10) => $_ } @{$source_info}[1..@$source_info-1];
66 $self->read_source->connect_info( [ 'dbi:Multi:', undef, undef, { dsns => \@dsns } ] );
67}
68
69sub select {
dbc6d854 70 shift->read_source->select( @_ );
325e3466 71}
72sub select_single {
dbc6d854 73 shift->read_source->select_single( @_ );
325e3466 74}
75sub throw_exception {
dbc6d854 76 shift->read_source->throw_exception( @_ );
325e3466 77}
78sub sql_maker {
dbc6d854 79 shift->read_source->sql_maker( @_ );
325e3466 80}
81sub columns_info_for {
dbc6d854 82 shift->read_source->columns_info_for( @_ );
325e3466 83}
84sub sqlt_type {
dbc6d854 85 shift->read_source->sqlt_type( @_ );
325e3466 86}
87sub create_ddl_dir {
dbc6d854 88 shift->read_source->create_ddl_dir( @_ );
325e3466 89}
90sub deployment_statements {
dbc6d854 91 shift->read_source->deployment_statements( @_ );
325e3466 92}
93sub datetime_parser {
dbc6d854 94 shift->read_source->datetime_parser( @_ );
325e3466 95}
96sub datetime_parser_type {
dbc6d854 97 shift->read_source->datetime_parser_type( @_ );
325e3466 98}
99sub build_datetime_parser {
dbc6d854 100 shift->read_source->build_datetime_parser( @_ );
325e3466 101}
102
103sub limit_dialect {
104 my $self = shift;
dbc6d854 105 $self->$_->limit_dialect( @_ ) for( $self->all_sources );
325e3466 106}
107sub quote_char {
108 my $self = shift;
dbc6d854 109 $self->$_->quote_char( @_ ) for( $self->all_sources );
325e3466 110}
111sub name_sep {
112 my $self = shift;
dbc6d854 113 $self->$_->quote_char( @_ ) for( $self->all_sources );
325e3466 114}
115sub disconnect {
116 my $self = shift;
dbc6d854 117 $self->$_->disconnect( @_ ) for( $self->all_sources );
325e3466 118}
119sub DESTROY {
120 my $self = shift;
121
dbc6d854 122 undef $self->{write_source};
123 undef $self->{read_sources};
325e3466 124}
125
126sub last_insert_id {
dbc6d854 127 shift->write_source->last_insert_id( @_ );
325e3466 128}
129sub insert {
dbc6d854 130 shift->write_source->insert( @_ );
325e3466 131}
132sub update {
dbc6d854 133 shift->write_source->update( @_ );
325e3466 134}
135sub update_all {
dbc6d854 136 shift->write_source->update_all( @_ );
325e3466 137}
138sub delete {
dbc6d854 139 shift->write_source->delete( @_ );
325e3466 140}
141sub delete_all {
dbc6d854 142 shift->write_source->delete_all( @_ );
325e3466 143}
144sub create {
dbc6d854 145 shift->write_source->create( @_ );
325e3466 146}
147sub find_or_create {
dbc6d854 148 shift->write_source->find_or_create( @_ );
325e3466 149}
150sub update_or_create {
dbc6d854 151 shift->write_source->update_or_create( @_ );
325e3466 152}
153sub connected {
dbc6d854 154 shift->write_source->connected( @_ );
325e3466 155}
156sub ensure_connected {
dbc6d854 157 shift->write_source->ensure_connected( @_ );
325e3466 158}
159sub dbh {
dbc6d854 160 shift->write_source->dbh( @_ );
325e3466 161}
162sub txn_begin {
dbc6d854 163 shift->write_source->txn_begin( @_ );
325e3466 164}
165sub txn_commit {
dbc6d854 166 shift->write_source->txn_commit( @_ );
325e3466 167}
168sub txn_rollback {
dbc6d854 169 shift->write_source->txn_rollback( @_ );
325e3466 170}
171sub sth {
dbc6d854 172 shift->write_source->sth( @_ );
325e3466 173}
174sub deploy {
dbc6d854 175 shift->write_source->deploy( @_ );
325e3466 176}
177
178
179sub debugfh { shift->_not_supported( 'debugfh' ) };
180sub debugcb { shift->_not_supported( 'debugcb' ) };
181
182sub _not_supported {
183 my( $self, $method ) = @_;
184
185 die "This Storage does not support $method method.";
186}
187
188=head1 SEE ALSO
189
190L<DBI::Class::Storage::DBI>, L<DBD::Multi>, L<DBI>
191
192=head1 AUTHOR
193
194Norbert Csongrádi <bert@cpan.org>
195
dbc6d854 196Peter Siklósi <einon@einon.hu>
325e3466 197
198=head1 LICENSE
199
200You may distribute this code under the same terms as Perl itself.
201
202=cut
203
2041;