X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FStorage%2FDBI%2FReplicated.pm;h=c6b7b1285eb094e2a4c67c0d3f61b5e964b8818d;hb=ab0b0a09ce7fa52d1cf35f91199093460dec9d2c;hp=5e02e7d6acc5f7847b7a7679f5e972f9425444fd;hpb=be64931c710bcde7abe7334349b4c8a123645332;p=dbsrgits%2FDBIx-Class-Historic.git diff --git a/lib/DBIx/Class/Storage/DBI/Replicated.pm b/lib/DBIx/Class/Storage/DBI/Replicated.pm index 5e02e7d..c6b7b12 100644 --- a/lib/DBIx/Class/Storage/DBI/Replicated.pm +++ b/lib/DBIx/Class/Storage/DBI/Replicated.pm @@ -15,11 +15,13 @@ use MooseX::Types::Moose qw/ClassName HashRef Object/; use Scalar::Util 'reftype'; use Hash::Merge; use List::Util qw/min max reduce/; +use Context::Preserve 'preserve_context'; use Try::Tiny; -use namespace::clean; use namespace::clean -except => 'meta'; +=encoding utf8 + =head1 NAME DBIx::Class::Storage::DBI::Replicated - BETA Replicated database support @@ -315,8 +317,6 @@ my $method_dispatch = { sql_maker_class _execute _do_query - _sth - _dbh_sth _dbh_execute /, Class::MOP::Class->initialize('DBIx::Class::Storage::DBIHacks')->get_method_list ], reader => [qw/ @@ -330,8 +330,6 @@ my $method_dispatch = { _arm_global_destructor _verify_pid - source_bind_attributes - get_use_dbms_capability set_use_dbms_capability get_dbms_capability @@ -339,20 +337,28 @@ my $method_dispatch = { _dbh_details _dbh_get_info + _determine_connector_driver + _describe_connection + _warn_undetermined_driver + sql_limit_dialect sql_quote_char sql_name_sep _prefetch_autovalues + _perform_autoinc_retrieval + _autoinc_supplied_for_op _resolve_bindattrs _max_column_bytesize _is_lob_type _is_binary_lob_type + _is_binary_type _is_text_lob_type - sth + _prepare_sth + _bind_sth_params /,( # the capability framework # not sure if CMOP->initialize does evil things to DBIC::S::DBI, fix if a problem @@ -391,7 +397,7 @@ if (DBIx::Class::_ENV_::DBICTEST) { for my $method (@{$method_dispatch->{unimplemented}}) { __PACKAGE__->meta->add_method($method, sub { my $self = shift; - $self->throw_exception("$method must not be called on ".(blessed $self).' objects'); + $self->throw_exception("$method() must not be called on ".(blessed $self).' objects'); }); } @@ -440,6 +446,11 @@ C, C, C and C. around connect_info => sub { my ($next, $self, $info, @extra) = @_; + $self->throw_exception( + 'connect_info can not be retrieved from a replicated storage - ' + . 'accessor must be called on a specific pool instance' + ) unless defined $info; + my $merge = Hash::Merge->new('LEFT_PRECEDENT'); my %opts; @@ -476,24 +487,19 @@ around connect_info => sub { $self->_master_connect_info_opts(\%opts); - my @res; - if (wantarray) { - @res = $self->$next($info, @extra); - } else { - $res[0] = $self->$next($info, @extra); - } - - # Make sure master is blessed into the correct class and apply role to it. - my $master = $self->master; - $master->_determine_driver; - Moose::Meta::Class->initialize(ref $master); - - DBIx::Class::Storage::DBI::Replicated::WithDSN->meta->apply($master); + return preserve_context { + $self->$next($info, @extra); + } after => sub { + # Make sure master is blessed into the correct class and apply role to it. + my $master = $self->master; + $master->_determine_driver; + Moose::Meta::Class->initialize(ref $master); - # link pool back to master - $self->pool->master($master); + DBIx::Class::Storage::DBI::Replicated::WithDSN->meta->apply($master); - wantarray ? @res : $res[0]; + # link pool back to master + $self->pool->master($master); + }; }; =head1 METHODS @@ -674,41 +680,22 @@ inserted something and need to get a resultset including it, etc. =cut sub execute_reliably { - my ($self, $coderef, @args) = @_; + my $self = shift; + my $coderef = shift; unless( ref $coderef eq 'CODE') { $self->throw_exception('Second argument must be a coderef'); } - ##Get copy of master storage - my $master = $self->master; - - ##Get whatever the current read hander is - my $current = $self->read_handler; - - ##Set the read handler to master - $self->read_handler($master); + ## replace the current read handler for the remainder of the scope + local $self->{read_handler} = $self->master; - ## do whatever the caller needs - my @result; - my $want_array = wantarray; - - try { - if($want_array) { - @result = $coderef->(@args); - } elsif(defined $want_array) { - ($result[0]) = ($coderef->(@args)); - } else { - $coderef->(@args); - } + my $args = \@_; + return try { + $coderef->(@$args); } catch { $self->throw_exception("coderef returned an error: $_"); - } finally { - ##Reset to the original state - $self->read_handler($current); }; - - return wantarray ? @result : $result[0]; } =head2 set_reliable_storage