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) {
$db = trim($db);
if (!(strlen($server) && strlen($user))) {
+echo "1";
return false;
}
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
*/
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);
}
$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;