Merge remote-tracking branch 'upstream/develop' into quit-on-error
authorMichael <heluecht@pirati.ca>
Mon, 11 Jun 2018 03:15:59 +0000 (03:15 +0000)
committerMichael <heluecht@pirati.ca>
Mon, 11 Jun 2018 03:15:59 +0000 (03:15 +0000)
include/dba.php

index 6b98f24..550fbe2 100644 (file)
@@ -23,6 +23,7 @@ class dba {
        private static $errorno = 0;
        private static $affected_rows = 0;
        private static $in_transaction = false;
+       private static $in_retrial = false;
        private static $relation = [];
 
        public static function connect($serveraddr, $user, $pass, $db) {
@@ -49,6 +50,7 @@ class dba {
                $db = trim($db);
 
                if (!(strlen($server) && strlen($user))) {
+echo "1";
                        return false;
                }
 
@@ -92,6 +94,21 @@ class dba {
                return self::$connected;
        }
 
+       public static function reconnect() {
+               // This variable is only defined here again to prevent warning messages
+               // It is a local variable and should hopefully not interfere with the global one.
+               $a = new App(dirname(__DIR__));
+
+               // We have to the the variable to "null" to force a new connection
+               self::$db = null;
+               include '.htconfig.php';
+
+               $ret = self::connect($db_host, $db_user, $db_pass, $db_data);
+               unset($db_host, $db_user, $db_pass, $db_data);
+
+               return $ret;
+       }
+
        /**
         * Disconnects the current database connection
         */
@@ -451,23 +468,23 @@ class dba {
                                        break;
                                }
 
-                               $params = '';
+                               $param_types = '';
                                $values = [];
                                foreach ($args AS $param => $value) {
                                        if (is_int($args[$param])) {
-                                               $params .= 'i';
+                                               $param_types .= 'i';
                                        } elseif (is_float($args[$param])) {
-                                               $params .= 'd';
+                                               $param_types .= 'd';
                                        } elseif (is_string($args[$param])) {
-                                               $params .= 's';
+                                               $param_types .= 's';
                                        } else {
-                                               $params .= 'b';
+                                               $param_types .= 'b';
                                        }
                                        $values[] = &$args[$param];
                                }
 
                                if (count($values) > 0) {
-                                       array_unshift($values, $params);
+                                       array_unshift($values, $param_types);
                                        call_user_func_array([$stmt, 'bind_param'], $values);
                                }
 
@@ -490,7 +507,25 @@ class dba {
                        $errorno = self::$errorno;
 
                        logger('DB Error '.self::$errorno.': '.self::$error."\n".
-                               System::callstack(8)."\n".self::replaceParameters($sql, $params));
+                               System::callstack(8)."\n".self::replaceParameters($sql, $args));
+
+                       // On a lost connection we try to reconnect - but only once.
+                       if ($errorno == 2006) {
+                               if (self::$in_retrial || !self::reconnect()) {
+                                       // It doesn't make sense to continue when the database connection was lost
+                                       if (self::$in_retrial) {
+                                               logger('Giving up retrial because of database error '.$errorno.': '.$error);
+                                       } else {
+                                               logger("Couldn't reconnect after database error ".$errorno.': '.$error);
+                                       }
+                                       exit(1);
+                               } else {
+                                       // We try it again
+                                       logger('Reconnected after database error '.$errorno.': '.$error);
+                                       self::$in_retrial = true;
+                                       return self::p($sql, $args);
+                               }
+                       }
 
                        self::$error = $error;
                        self::$errorno = $errorno;