]> git.mxchange.org Git - friendica.git/blobdiff - include/dba.php
notify admin when user deletes account
[friendica.git] / include / dba.php
index f6bab9e3c58e0eb85a6ebae86495da91652dd9cd..b24d9b409d00125ad7349848d822089a5e908aff 100644 (file)
@@ -6,8 +6,6 @@ use Friendica\Database\DBM;
 use Friendica\Database\DBStructure;
 use Friendica\Util\DateTimeFormat;
 
-require_once('include/datetime.php');
-
 /**
  * @class MySQL database class
  *
@@ -15,7 +13,7 @@ require_once('include/datetime.php');
  */
 
 class dba {
-       public static $connected = true;
+       public static $connected = false;
 
        private static $_server_info = '';
        private static $db;
@@ -50,17 +48,14 @@ class dba {
                $db = trim($db);
 
                if (!(strlen($server) && strlen($user))) {
-                       self::$connected = false;
-                       self::$db = null;
                        return false;
                }
 
                if ($install) {
-                       if (strlen($server) && ($server !== 'localhost') && ($server !== '127.0.0.1')) {
-                               if (! dns_get_record($server, DNS_A + DNS_CNAME + DNS_PTR)) {
+                       // 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);
-                                       self::$connected = false;
-                                       self::$db = null;
                                        return false;
                                }
                        }
@@ -81,7 +76,6 @@ class dba {
                                self::$db = @new PDO($connect, $user, $pass);
                                self::$connected = true;
                        } catch (PDOException $e) {
-                               self::$connected = false;
                        }
                }
 
@@ -100,13 +94,10 @@ class dba {
                // No suitable SQL driver was found.
                if (!self::$connected) {
                        self::$db = null;
-                       if (!$install) {
-                               System::unavailable();
-                       }
                }
                $a->save_timestamp($stamp1, "network");
 
-               return true;
+               return self::$connected;
        }
 
        /**
@@ -147,7 +138,7 @@ class dba {
         *
         * @param string $query The database query that will be analyzed
         */
-       private static function log_index($query) {
+       private static function logIndex($query) {
                $a = get_app();
 
                if (empty($a->config["system"]["db_log_index"])) {
@@ -274,7 +265,7 @@ class dba {
         * @param array $args The parameters that are to replace the ? placeholders
         * @return string The replaced SQL query
         */
-       private static function replace_parameters($sql, $args) {
+       private static function replaceParameters($sql, $args) {
                $offset = 0;
                foreach ($args AS $param => $value) {
                        if (is_int($args[$param]) || is_float($args[$param])) {
@@ -415,7 +406,7 @@ class dba {
 
                                // The fallback routine is called as well when there are no arguments
                                if (!$can_be_prepared || (count($args) == 0)) {
-                                       $retval = self::$db->query(self::replace_parameters($sql, $args));
+                                       $retval = self::$db->query(self::replaceParameters($sql, $args));
                                        if (self::$db->errno) {
                                                self::$error = self::$db->error;
                                                self::$errorno = self::$db->errno;
@@ -478,7 +469,7 @@ class dba {
                        $errorno = self::$errorno;
 
                        logger('DB Error '.self::$errorno.': '.self::$error."\n".
-                               System::callstack(8)."\n".self::replace_parameters($sql, $params));
+                               System::callstack(8)."\n".self::replaceParameters($sql, $params));
 
                        self::$error = $error;
                        self::$errorno = $errorno;
@@ -498,7 +489,7 @@ class dba {
                                @file_put_contents($a->config["system"]["db_log"], DateTimeFormat::utcNow()."\t".$duration."\t".
                                                basename($backtrace[1]["file"])."\t".
                                                $backtrace[1]["line"]."\t".$backtrace[2]["function"]."\t".
-                                               substr(self::replace_parameters($sql, $args), 0, 2000)."\n", FILE_APPEND);
+                                               substr(self::replaceParameters($sql, $args), 0, 2000)."\n", FILE_APPEND);
                        }
                }
                return $retval;
@@ -543,7 +534,7 @@ class dba {
                        $errorno = self::$errorno;
 
                        logger('DB Error '.self::$errorno.': '.self::$error."\n".
-                               System::callstack(8)."\n".self::replace_parameters($sql, $params));
+                               System::callstack(8)."\n".self::replaceParameters($sql, $params));
 
                        self::$error = $error;
                        self::$errorno = $errorno;
@@ -569,10 +560,10 @@ class dba {
 
                $fields = [];
 
-               $array_element = each($condition);
-               $array_key = $array_element['key'];
-               if (!is_int($array_key)) {
-                       $fields = [$array_key];
+               reset($condition);
+               $first_key = key($condition);
+               if (!is_int($first_key)) {
+                       $fields = [$first_key];
                }
 
                $stmt = self::select($table, $fields, $condition, ['limit' => 1]);
@@ -666,16 +657,24 @@ class dba {
         * @return array current row
         */
        public static function fetch($stmt) {
+               $a = get_app();
+
+               $stamp1 = microtime(true);
+
+               $columns = [];
+
                if (!is_object($stmt)) {
                        return false;
                }
 
                switch (self::$driver) {
                        case 'pdo':
-                               return $stmt->fetch(PDO::FETCH_ASSOC);
+                               $columns = $stmt->fetch(PDO::FETCH_ASSOC);
+                               break;
                        case 'mysqli':
                                if (get_class($stmt) == 'mysqli_result') {
-                                       return $stmt->fetch_assoc();
+                                       $columns = $stmt->fetch_assoc();
+                                       break;
                                }
 
                                // This code works, but is slow
@@ -700,12 +699,14 @@ class dba {
                                $result = $stmt->result_metadata();
                                $fields = $result->fetch_fields();
 
-                               $columns = [];
                                foreach ($cols_num AS $param => $col) {
                                        $columns[$fields[$param]->name] = $col;
                                }
-                               return $columns;
                }
+
+               $a->save_timestamp($stamp1, 'database');
+
+               return $columns;
        }
 
        /**
@@ -838,7 +839,7 @@ class dba {
         *
         * This process must only be started once, since the value is cached.
         */
-       private static function build_relation_data() {
+       private static function buildRelationData() {
                $definition = DBStructure::definition();
 
                foreach ($definition AS $table => $structure) {
@@ -887,7 +888,7 @@ class dba {
 
                // To speed up the whole process we cache the table relations
                if (count(self::$relation) == 0) {
-                       self::build_relation_data();
+                       self::buildRelationData();
                }
 
                // Is there a relation entry for the table?
@@ -942,17 +943,14 @@ class dba {
 
                        foreach ($commands AS $command) {
                                $conditions = $command['conditions'];
-                               $array_element = each($conditions);
-                               $array_key = $array_element['key'];
-                               if (is_int($array_key)) {
-                                       $condition_string = " WHERE " . array_shift($conditions);
-                               } else {
-                                       $condition_string = " WHERE `" . implode("` = ? AND `", array_keys($conditions)) . "` = ?";
-                               }
+                               reset($conditions);
+                               $first_key = key($conditions);
 
-                               if ((count($command['conditions']) > 1) || is_int($array_key)) {
+                               $condition_string = self::buildCondition($conditions);
+
+                               if ((count($command['conditions']) > 1) || is_int($first_key)) {
                                        $sql = "DELETE FROM `" . $command['table'] . "`" . $condition_string;
-                                       logger(self::replace_parameters($sql, $conditions), LOGGER_DATA);
+                                       logger(self::replaceParameters($sql, $conditions), LOGGER_DATA);
 
                                        if (!self::e($sql, $conditions)) {
                                                if ($do_transaction) {
@@ -982,7 +980,7 @@ class dba {
                                                $sql = "DELETE FROM `" . $table . "` WHERE `" . $field . "` IN (" .
                                                        substr(str_repeat("?, ", count($field_values)), 0, -2) . ");";
 
-                                               logger(self::replace_parameters($sql, $field_values), LOGGER_DATA);
+                                               logger(self::replaceParameters($sql, $field_values), LOGGER_DATA);
 
                                                if (!self::e($sql, $field_values)) {
                                                        if ($do_transaction) {
@@ -1039,13 +1037,7 @@ class dba {
 
                $table = self::escape($table);
 
-               $array_element = each($condition);
-               $array_key = $array_element['key'];
-               if (is_int($array_key)) {
-                       $condition_string = " WHERE ".array_shift($condition);
-               } else {
-                       $condition_string = " WHERE `".implode("` = ? AND `", array_keys($condition))."` = ?";
-               }
+               $condition_string = self::buildCondition($condition);
 
                if (is_bool($old_fields)) {
                        $do_insert = $old_fields;
@@ -1140,6 +1132,8 @@ class dba {
                        return false;
                }
 
+               $table = self::escape($table);
+
                if (count($fields) > 0) {
                        $select_fields = "`" . implode("`, `", array_values($fields)) . "`";
                } else {
@@ -1231,12 +1225,28 @@ class dba {
        {
                $condition_string = '';
                if (count($condition) > 0) {
-                       $array_element = each($condition);
-                       $array_key = $array_element['key'];
-                       if (is_int($array_key)) {
+                       reset($condition);
+                       $first_key = key($condition);
+                       if (is_int($first_key)) {
                                $condition_string = " WHERE ".array_shift($condition);
                        } else {
-                               $condition_string = " WHERE `".implode("` = ? AND `", array_keys($condition))."` = ?";
+                               $new_values = [];
+                               $condition_string = "";
+                               foreach ($condition as $field => $value) {
+                                       if ($condition_string != "") {
+                                               $condition_string .= " AND ";
+                                       }
+                                       if (is_array($value)) {
+                                               $new_values = array_merge($new_values, array_values($value));
+                                               $placeholders = substr(str_repeat("?, ", count($value)), 0, -2);
+                                               $condition_string .= "`" . $field . "` IN (" . $placeholders . ")";
+                                       } else {
+                                               $new_values[$field] = $value;
+                                               $condition_string .= "`" . $field . "` = ?";
+                                       }
+                               }
+                               $condition_string = " WHERE " . $condition_string;
+                               $condition = $new_values;
                        }
                }
 
@@ -1289,17 +1299,27 @@ class dba {
         * @return boolean was the close successful?
         */
        public static function close($stmt) {
+               $a = get_app();
+
+               $stamp1 = microtime(true);
+
                if (!is_object($stmt)) {
                        return false;
                }
 
                switch (self::$driver) {
                        case 'pdo':
-                               return $stmt->closeCursor();
+                               $ret = $stmt->closeCursor();
+                               break;
                        case 'mysqli':
                                $stmt->free_result();
-                               return $stmt->close();
+                               $ret = $stmt->close();
+                               break;
                }
+
+               $a->save_timestamp($stamp1, 'database');
+
+               return $ret;
        }
 }