move connection tests into _ping()
Rafael Kitover [Wed, 1 Jul 2009 15:39:18 +0000 (15:39 +0000)]
lib/DBIx/Class/Storage/DBI.pm
lib/DBIx/Class/Storage/DBI/Oracle/Generic.pm
lib/DBIx/Class/Storage/DBI/Sybase/Base.pm

index 3d9a200..63d41e4 100644 (file)
@@ -669,12 +669,20 @@ sub connected {
           $self->_verify_pid;
           return 0 if !$self->_dbh;
       }
-      return ($dbh->FETCH('Active') && $dbh->ping);
+      return ($dbh->FETCH('Active') && $self->_ping);
   }
 
   return 0;
 }
 
+sub _ping {
+  my $self = shift;
+
+  my $dbh = $self->_dbh or return 0;
+
+  return $dbh->ping;
+}
+
 # handle pid changes correctly
 #  NOTE: assumes $self->_dbh is a valid $dbh
 sub _verify_pid {
index ee356aa..46b76df 100644 (file)
@@ -83,33 +83,18 @@ sub _sequence_fetch {
   return $id;
 }
 
-=head2 connected
-
-Returns true if we have an open (and working) database connection, false if it is not (yet)
-open (or does not work). (Executes a simple SELECT to make sure it works.)
-
-The reason this is needed is that L<DBD::Oracle>'s ping() does not do a real
-OCIPing but just gets the server version, which doesn't help if someone killed
-your session.
-
-=cut
-
-sub connected {
+sub _ping {
   my $self = shift;
 
-  if (not $self->next::method(@_)) {
-    return 0;
-  } else {
-    my $dbh = $self->_dbh;
+  my $dbh = $self->_dbh or return 0;
 
-    local $dbh->{RaiseError} = 1;
+  local $dbh->{RaiseError} = 1;
 
-    eval {
-      $dbh->do("select 1 from dual");
-    };
+  eval {
+    $dbh->do("select 1 from dual");
+  };
 
-    return $@ ? 0 : 1;
-  }
+  return $@ ? 0 : 1;
 }
 
 sub _dbh_execute {
index 29265fb..9ce130f 100644 (file)
@@ -1,4 +1,5 @@
-package DBIx::Class::Storage::DBI::Sybase::Base;
+package # hide from PAUSE
+    DBIx::Class::Storage::DBI::Sybase::Base;
 
 use strict;
 use warnings;
@@ -8,24 +9,12 @@ use warnings;
 DBIx::Class::Storage::DBI::Sybase::Base - Common functionality for drivers using
 DBD::Sybase
 
-=head1 METHODS
-
-=head2 connected
-
-Returns true if we have an open (and working) database connection, false if it
-is not (yet) open (or does not work). (Executes a simple SELECT to make sure it
-works.)
-
-The reason this is needed is that L<DBD::Sybase>'s ping() does not work with an
-active statement handle, leading to masked database errors.
-
 =cut
 
-sub connected {
+sub _ping {
   my $self = shift;
 
   my $dbh = $self->_dbh or return 0;
-  $dbh->FETCH('Active') or return 0;
 
   local $dbh->{RaiseError} = 1;
   eval {