- reconnect database when connection failed
authorAndreas Scherbaum <andreas@scherbaum.biz>
Sat, 15 Dec 2012 22:50:51 +0000 (23:50 +0100)
committerAndreas Scherbaum <andreas@scherbaum.biz>
Sat, 15 Dec 2012 22:50:51 +0000 (23:50 +0100)
- works as reliable as DBD::Pg::ping() works

db.pm

diff --git a/db.pm b/db.pm
index f95231b490e86bfb24e858fa74842e3fb6dedd05..fbaa0b5e63d7adc13c5308a2d89248f2b112e34a 100644 (file)
--- a/db.pm
+++ b/db.pm
@@ -260,14 +260,17 @@ sub verify_tables {
 sub ping {
     my $self = shift;
 
-    my $query = 'SELECT 1';
-    if (!$self->do($query)) {
-        # ping failed, reconnect the database
+    if (!$self->{db_connection}->ping()) {
+        # ping failed
+        main::print_msg("Database connection failed, trying to reconnect", WARN);
+        # reconnect the database
         $self->reconnect_db_connection();
-        if (!$self->do($query)) {
+        if (!$self->{db_connection}->ping()) {
             # reconnect failed
+            main::print_msg("Database reconnect failed", ERROR);
             return 0;
         }
+        main::print_msg("Database reconnected", INFO);
     }
 
     return 1;
@@ -294,6 +297,11 @@ sub do {
         return 0;
     }
 
+    if (!$self->ping()) {
+        main::print_msg("Database connection failed", ERROR);
+        return 0;
+    }
+
     my $result = $self->{db_connection}->do($query);
     if (!$result) {
         main::print_msg("Could not execute database query: $DBI::errstr", ERROR);
@@ -329,6 +337,11 @@ sub query {
         return undef;
     }
 
+    if (!$self->ping()) {
+        main::print_msg("Database connection failed", ERROR);
+        return 0;
+    }
+
     my $st = $self->{db_connection}->prepare($query);
     if (!$st->execute(@param)) {
         main::print_msg("Could not execute database query: $DBI::errstr", ERROR);