X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=include%2Fdba.php;h=c0617af8e83524b74b7298ded87bbe68faac0c4d;hb=dd1e6dd4a5ac5b15764b7cc840b229a1119fa67c;hp=7861437834ae2ff12eea41f557954f7628fbc53a;hpb=f8230badba619b32de4c7ed7d07c403e6f21c16e;p=friendica.git diff --git a/include/dba.php b/include/dba.php index 7861437834..c0617af8e8 100644 --- a/include/dba.php +++ b/include/dba.php @@ -25,9 +25,13 @@ class dba { private static $in_transaction = false; private static $in_retrial = false; private static $relation = []; + private static $db_serveraddr = ''; + private static $db_user = ''; + private static $db_pass = ''; + private static $db_name = ''; public static function connect($serveraddr, $user, $pass, $db) { - if (!is_null(self::$db)) { + if (!is_null(self::$db) && self::connected()) { return true; } @@ -35,6 +39,12 @@ class dba { $stamp1 = microtime(true); + // We are storing these values for being able to perform a reconnect + self::$db_serveraddr = $serveraddr; + self::$db_user = $user; + self::$db_pass = $pass; + self::$db_name = $db; + $serveraddr = trim($serveraddr); $serverdata = explode(':', $serveraddr); @@ -50,20 +60,9 @@ class dba { $db = trim($db); if (!(strlen($server) && strlen($user))) { -echo "1"; return false; } - if ($a->mode == App::MODE_INSTALL) { - // server has to be a non-empty string that is not 'localhost' and not an IP - if (strlen($server) && ($server !== 'localhost') && filter_var($server, FILTER_VALIDATE_IP) === false) { - if (! dns_get_record($server, DNS_A + DNS_CNAME)) { - self::$error = L10n::t('Cannot locate DNS info for database server \'%s\'', $server); - return false; - } - } - } - if (class_exists('\PDO') && in_array('mysql', PDO::getAvailableDrivers())) { self::$driver = 'pdo'; $connect = "mysql:host=".$server.";dbname=".$db; @@ -104,21 +103,45 @@ echo "1"; 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__)); + /** + * Disconnects the current database connection + */ + public static function disconnect() + { + if (is_null(self::$db)) { + return; + } - // We have to the the variable to "null" to force a new connection - self::$db = null; - include '.htconfig.php'; + switch (self::$driver) { + case 'pdo': + self::$db = null; + break; + case 'mysqli': + self::$db->close(); + self::$db = null; + break; + } + } - $ret = self::connect($db_host, $db_user, $db_pass, $db_data); - unset($db_host, $db_user, $db_pass, $db_data); + /** + * Perform a reconnect of an existing database connection + */ + public static function reconnect() { + self::disconnect(); + $ret = self::connect(self::$db_serveraddr, self::$db_user, self::$db_pass, self::$db_name); return $ret; } + /** + * Return the database object. + * @return PDO|mysqli + */ + public static function get_db() + { + return self::$db; + } + /** * @brief Returns the MySQL server version string * @@ -494,13 +517,19 @@ echo "1"; if ($errorno == 2006) { if (self::$in_retrial || !self::reconnect()) { // It doesn't make sense to continue when the database connection was lost - logger('Giving up because of database error '.$errorno.': '.$error); + 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); + $ret = self::p($sql, $args); + self::$in_retrial = false; + return $ret; } } @@ -569,6 +598,13 @@ echo "1"; logger('DB Error '.self::$errorno.': '.self::$error."\n". System::callstack(8)."\n".self::replaceParameters($sql, $params)); + // On a lost connection we simply quit. + // A reconnect like in self::p could be dangerous with modifications + if ($errorno == 2006) { + logger('Giving up because of database error '.$errorno.': '.$error); + exit(1); + } + self::$error = $error; self::$errorno = $errorno; } @@ -1180,29 +1216,9 @@ echo "1"; $condition_string = self::buildCondition($condition); - $order_string = ''; - if (isset($params['order'])) { - $order_string = " ORDER BY "; - foreach ($params['order'] AS $fields => $order) { - if (!is_int($fields)) { - $order_string .= "`" . $fields . "` " . ($order ? "DESC" : "ASC") . ", "; - } else { - $order_string .= "`" . $order . "`, "; - } - } - $order_string = substr($order_string, 0, -2); - } - - $limit_string = ''; - if (isset($params['limit']) && is_int($params['limit'])) { - $limit_string = " LIMIT " . $params['limit']; - } + $param_string = self::buildParameter($params); - if (isset($params['limit']) && is_array($params['limit'])) { - $limit_string = " LIMIT " . intval($params['limit'][0]) . ", " . intval($params['limit'][1]); - } - - $sql = "SELECT " . $select_fields . " FROM `" . $table . "`" . $condition_string . $order_string . $limit_string; + $sql = "SELECT " . $select_fields . " FROM `" . $table . "`" . $condition_string . $param_string; $result = self::p($sql, $condition); @@ -1259,14 +1275,14 @@ echo "1"; * @param array $condition * @return string */ - private static function buildCondition(array &$condition = []) + public static function buildCondition(array &$condition = []) { $condition_string = ''; if (count($condition) > 0) { reset($condition); $first_key = key($condition); if (is_int($first_key)) { - $condition_string = " WHERE ".array_shift($condition); + $condition_string = " WHERE (" . array_shift($condition) . ")"; } else { $new_values = []; $condition_string = ""; @@ -1283,7 +1299,7 @@ echo "1"; $condition_string .= "`" . $field . "` = ?"; } } - $condition_string = " WHERE " . $condition_string; + $condition_string = " WHERE (" . $condition_string . ")"; $condition = $new_values; } } @@ -1291,6 +1307,39 @@ echo "1"; return $condition_string; } + /** + * @brief Returns the SQL parameter string built from the provided parameter array + * + * @param array $params + * @return string + */ + public static function buildParameter(array $params = []) + { + $order_string = ''; + if (isset($params['order'])) { + $order_string = " ORDER BY "; + foreach ($params['order'] AS $fields => $order) { + if (!is_int($fields)) { + $order_string .= "`" . $fields . "` " . ($order ? "DESC" : "ASC") . ", "; + } else { + $order_string .= "`" . $order . "`, "; + } + } + $order_string = substr($order_string, 0, -2); + } + + $limit_string = ''; + if (isset($params['limit']) && is_int($params['limit'])) { + $limit_string = " LIMIT " . $params['limit']; + } + + if (isset($params['limit']) && is_array($params['limit'])) { + $limit_string = " LIMIT " . intval($params['limit'][0]) . ", " . intval($params['limit'][1]); + } + + return $order_string.$limit_string; + } + /** * @brief Fills an array with data from a query *