X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FStorage%2FDBI%2FReplicated.pm;h=51fab902e54e236a444ecdb95a902e8c29fb4759;hb=1abccf54e92eefc27a8afb1db3878462b348157c;hp=1b50a46ebd49218cd2f0c5b51a4d3131cc2356d2;hpb=d7c37d66e40b2110e84773fa8fceaa8c245656bf;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/Storage/DBI/Replicated.pm b/lib/DBIx/Class/Storage/DBI/Replicated.pm index 1b50a46..51fab90 100644 --- a/lib/DBIx/Class/Storage/DBI/Replicated.pm +++ b/lib/DBIx/Class/Storage/DBI/Replicated.pm @@ -15,8 +15,8 @@ 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'; @@ -281,7 +281,6 @@ my $method_dispatch = { _prep_for_execute is_datatype_numeric _count_select - _subq_update_delete svp_rollback svp_begin svp_release @@ -299,17 +298,14 @@ my $method_dispatch = { transaction_depth _dbh _select_args - _dbh_execute_array + _dbh_execute_for_fetch _sql_maker - _per_row_update_delete _dbh_execute_inserts_with_no_binds _select_args_to_query _gen_sql_bind _svp_generate_name - _multipk_update_delete _normalize_connect_info _parse_connect_do - _execute_array savepoints _sql_maker_opts _conn_pid @@ -348,6 +344,10 @@ my $method_dispatch = { sql_name_sep _prefetch_autovalues + _perform_autoinc_retrieval + _autoinc_supplied_for_op + + _resolve_bindattrs _max_column_bytesize _is_lob_type @@ -478,24 +478,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); + 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); - DBIx::Class::Storage::DBI::Replicated::WithDSN->meta->apply($master); + DBIx::Class::Storage::DBI::Replicated::WithDSN->meta->apply($master); - # link pool back to master - $self->pool->master($master); - - wantarray ? @res : $res[0]; + # link pool back to master + $self->pool->master($master); + }; }; =head1 METHODS @@ -676,41 +671,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; + ## replace the current read handler for the remainder of the scope + local $self->{read_handler} = $self->master; - ##Get whatever the current read hander is - my $current = $self->read_handler; - - ##Set the read handler to master - $self->read_handler($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