changes to replication so that if a replicant is offline when we do the initial conne...
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / Storage / DBI / Replicated / Balancer.pm
index 186e483..5021ed9 100644 (file)
@@ -5,7 +5,7 @@ requires 'next_storage';
 
 =head1 NAME
 
-DBIx::Class::Storage::DBI::Replicated::Balancer; A Software Load Balancer 
+DBIx::Class::Storage::DBI::Replicated::Balancer - A Software Load Balancer 
 
 =head1 SYNOPSIS
 
@@ -136,8 +136,11 @@ around 'next_storage' => sub {
   }
     
   ## Get a replicant, or the master if none
-  my $next = $self->$next_storage(@args);
-  return $next ? $next:$self->master; 
+  if(my $next = $self->$next_storage(@args)) {
+    return $next;
+  } else {
+    return $self->master;
+  }
 };
 
 =head2 increment_storage
@@ -163,8 +166,9 @@ the load evenly (hopefully) across existing capacity.
 around 'select' => sub {
   my ($select, $self, @args) = @_;
   
-  if ($args[-1]->{execute_reliably}) {
-    return $self->master->select(@args);
+  if (my $forced_pool = $args[-1]->{force_pool}) {
+    delete $args[-1]->{force_pool};
+    return $self->_get_forced_pool($forced_pool)->select(@args); 
   } else {
     $self->increment_storage;
     return $self->$select(@args);
@@ -182,10 +186,11 @@ the load evenly (hopefully) across existing capacity.
 around 'select_single' => sub {
   my ($select_single, $self, @args) = @_;
   
-  if ($args[-1]->{execute_reliably}) {
-    return $self->master->select_single(@args);
+  if (my $forced_pool = $args[-1]->{force_pool}) {
+    delete $args[-1]->{force_pool};
+    return $self->_get_forced_pool($forced_pool)->select_single(@args); 
   } else {
-       $self->increment_storage;
+    $self->increment_storage;
     return $self->$select_single(@args);
   }
 };
@@ -203,6 +208,25 @@ before 'columns_info_for' => sub {
   $self->increment_storage;
 };
 
+=head2 _get_forced_pool ($name)
+
+Given an identifier, find the most correct storage object to handle the query.
+
+=cut
+
+sub _get_forced_pool {
+  my ($self, $forced_pool) = @_;
+  if(blessed $forced_pool) {
+    return $forced_pool;
+  } elsif($forced_pool eq 'master') {
+    return $self->master;
+  } elsif(my $replicant = $self->pool->replicants($forced_pool)) {
+    return $replicant;
+  } else {
+    $self->master->throw_exception("$forced_pool is not a named replicant.");
+  }   
+}
+
 =head1 AUTHOR
 
 John Napiorkowski <john.napiorkowski@takkle.com>