Refactor sth preparation/binding - no functional changes
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / Storage / DBI / Replicated.pm
index 5e02e7d..c6b7b12 100644 (file)
@@ -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<pool_type>, C<pool_args>, C<balancer_type> and C<balancer_args>.
 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