]> git.mxchange.org Git - friendica.git/blobdiff - src/Database/DBA.php
BBCode - fixed syntax error
[friendica.git] / src / Database / DBA.php
index bf3004ead4761eebdc2d46fc026c8240597a47cf..e14d94ce04fc8cb5acb7e8fae7fb6965a66ece8d 100644 (file)
@@ -16,8 +16,6 @@ use PDO;
 use PDOException;
 use PDOStatement;
 
-require_once 'include/dba.php';
-
 /**
  * @class MySQL database class
  *
@@ -197,6 +195,7 @@ class DBA
         * @brief Returns the selected database name
         *
         * @return string
+        * @throws \Exception
         */
        public static function databaseName() {
                $ret = self::p("SELECT DATABASE() AS `db`");
@@ -208,9 +207,10 @@ class DBA
         * @brief Analyze a database query and log this if some conditions are met.
         *
         * @param string $query The database query that will be analyzed
+        * @throws \Exception
         */
        private static function logIndex($query) {
-               $a = get_app();
+               $a = \get_app();
 
                if (!$a->getConfigVariable('system', 'db_log_index')) {
                        return;
@@ -388,9 +388,10 @@ class DBA
         *
         * @param string $sql SQL statement
         * @return bool|object statement object or result object
+        * @throws \Exception
         */
        public static function p($sql) {
-               $a = get_app();
+               $a = \get_app();
 
                $stamp1 = microtime(true);
 
@@ -606,9 +607,10 @@ class DBA
         *
         * @param string $sql SQL statement
         * @return boolean Was the query successfull? False is returned only if an error occurred
+        * @throws \Exception
         */
        public static function e($sql) {
-               $a = get_app();
+               $a = \get_app();
 
                $stamp = microtime(true);
 
@@ -659,10 +661,11 @@ class DBA
        /**
         * @brief Check if data exists
         *
-        * @param string $table Table name
-        * @param array $condition array of fields for condition
+        * @param string $table     Table name
+        * @param array  $condition array of fields for condition
         *
         * @return boolean Are there rows for that condition?
+        * @throws \Exception
         */
        public static function exists($table, $condition) {
                if (empty($table)) {
@@ -702,6 +705,7 @@ class DBA
         * @brief Fetches the first row
         * @param string $sql SQL statement
         * @return array first row of query
+        * @throws \Exception
         */
        public static function fetchFirst($sql) {
                $params = self::getParam(func_get_args());
@@ -772,7 +776,7 @@ class DBA
         * @return array current row
         */
        public static function fetch($stmt) {
-               $a = get_app();
+               $a = \get_app();
 
                $stamp1 = microtime(true);
 
@@ -827,11 +831,12 @@ class DBA
        /**
         * @brief Insert a row into a table
         *
-        * @param string $table Table name
-        * @param array $param parameter array
-        * @param bool $on_duplicate_update Do an update on a duplicate entry
+        * @param string $table               Table name
+        * @param array  $param               parameter array
+        * @param bool   $on_duplicate_update Do an update on a duplicate entry
         *
         * @return boolean was the insert successful?
+        * @throws \Exception
         */
        public static function insert($table, $param, $on_duplicate_update = false) {
 
@@ -878,6 +883,7 @@ class DBA
         * @param string $table Table name
         *
         * @return boolean was the lock successful?
+        * @throws \Exception
         */
        public static function lock($table) {
                // See here: https://dev.mysql.com/doc/refman/5.7/en/lock-tables-and-transactions.html
@@ -910,6 +916,7 @@ class DBA
         * @brief Unlocks all locked tables
         *
         * @return boolean was the unlock successful?
+        * @throws \Exception
         */
        public static function unlock() {
                // See here: https://dev.mysql.com/doc/refman/5.7/en/lock-tables-and-transactions.html
@@ -1039,17 +1046,17 @@ class DBA
        /**
         * @brief Delete a row from a table
         *
-        * @param string  $table       Table name
-        * @param array   $conditions  Field condition(s)
-        * @param array   $options
-        *                - cascade: If true we delete records in other tables that depend on the one we're deleting through
+        * @param string $table      Table name
+        * @param array  $conditions Field condition(s)
+        * @param array  $options
+        *                           - cascade: If true we delete records in other tables that depend on the one we're deleting through
         *                           relations (default: true)
-        * @param boolean $in_process  Internal use: Only do a commit after the last delete
-        * @param array   $callstack   Internal use: prevent endless loops
+        * @param array  $callstack  Internal use: prevent endless loops
         *
-        * @return boolean|array was the delete successful? When $in_process is set: deletion data
+        * @return boolean was the delete successful?
+        * @throws \Exception
         */
-       public static function delete($table, array $conditions, array $options = [], $in_process = false, array &$callstack = [])
+       public static function delete($table, array $conditions, array $options = [], array &$callstack = [])
        {
                if (empty($table) || empty($conditions)) {
                        Logger::log('Table and conditions have to be set');
@@ -1098,22 +1105,18 @@ class DBA
                        if ((count($conditions) == 1) && ($field == array_keys($conditions)[0])) {
                                foreach ($rel_def AS $rel_table => $rel_fields) {
                                        foreach ($rel_fields AS $rel_field) {
-                                               $retval = self::delete($rel_table, [$rel_field => array_values($conditions)[0]], $options, true, $callstack);
-                                               $commands = array_merge($commands, $retval);
+                                               self::delete($rel_table, [$rel_field => array_values($conditions)[0]], $options, $callstack);
                                        }
                                }
                                // We quit when this key already exists in the callstack.
                        } elseif (!isset($callstack[$qkey])) {
-
                                $callstack[$qkey] = true;
 
                                // Fetch all rows that are to be deleted
                                $data = self::select($table, [$field], $conditions);
 
                                while ($row = self::fetch($data)) {
-                                       // Now we accumulate the delete commands
-                                       $retval = self::delete($table, [$field => $row[$field]], $options, true, $callstack);
-                                       $commands = array_merge($commands, $retval);
+                                       self::delete($table, [$field => $row[$field]], $options, $callstack);
                                }
 
                                self::close($data);
@@ -1123,74 +1126,70 @@ class DBA
                        }
                }
 
-               if (!$in_process) {
-                       // Now we finalize the process
-                       $do_transaction = !self::$in_transaction;
+               // Now we finalize the process
+               $do_transaction = !self::$in_transaction;
 
-                       if ($do_transaction) {
-                               self::transaction();
-                       }
+               if ($do_transaction) {
+                       self::transaction();
+               }
 
-                       $compacted = [];
-                       $counter = [];
+               $compacted = [];
+               $counter = [];
 
-                       foreach ($commands AS $command) {
-                               $conditions = $command['conditions'];
-                               reset($conditions);
-                               $first_key = key($conditions);
+               foreach ($commands AS $command) {
+                       $conditions = $command['conditions'];
+                       reset($conditions);
+                       $first_key = key($conditions);
 
-                               $condition_string = self::buildCondition($conditions);
+                       $condition_string = self::buildCondition($conditions);
 
-                               if ((count($command['conditions']) > 1) || is_int($first_key)) {
-                                       $sql = "DELETE FROM `" . $command['table'] . "`" . $condition_string;
-                                       Logger::log(self::replaceParameters($sql, $conditions), Logger::DATA);
+                       if ((count($command['conditions']) > 1) || is_int($first_key)) {
+                               $sql = "DELETE FROM `" . $command['table'] . "`" . $condition_string;
+                               Logger::log(self::replaceParameters($sql, $conditions), Logger::DATA);
 
-                                       if (!self::e($sql, $conditions)) {
-                                               if ($do_transaction) {
-                                                       self::rollback();
-                                               }
-                                               return false;
-                                       }
-                               } else {
-                                       $key_table = $command['table'];
-                                       $key_condition = array_keys($command['conditions'])[0];
-                                       $value = array_values($command['conditions'])[0];
-
-                                       // Split the SQL queries in chunks of 100 values
-                                       // We do the $i stuff here to make the code better readable
-                                       $i = isset($counter[$key_table][$key_condition]) ? $counter[$key_table][$key_condition] : 0;
-                                       if (isset($compacted[$key_table][$key_condition][$i]) && count($compacted[$key_table][$key_condition][$i]) > 100) {
-                                               ++$i;
+                               if (!self::e($sql, $conditions)) {
+                                       if ($do_transaction) {
+                                               self::rollback();
                                        }
-
-                                       $compacted[$key_table][$key_condition][$i][$value] = $value;
-                                       $counter[$key_table][$key_condition] = $i;
+                                       return false;
+                               }
+                       } else {
+                               $key_table = $command['table'];
+                               $key_condition = array_keys($command['conditions'])[0];
+                               $value = array_values($command['conditions'])[0];
+
+                               // Split the SQL queries in chunks of 100 values
+                               // We do the $i stuff here to make the code better readable
+                               $i = isset($counter[$key_table][$key_condition]) ? $counter[$key_table][$key_condition] : 0;
+                               if (isset($compacted[$key_table][$key_condition][$i]) && count($compacted[$key_table][$key_condition][$i]) > 100) {
+                                       ++$i;
                                }
+
+                               $compacted[$key_table][$key_condition][$i][$value] = $value;
+                               $counter[$key_table][$key_condition] = $i;
                        }
-                       foreach ($compacted AS $table => $values) {
-                               foreach ($values AS $field => $field_value_list) {
-                                       foreach ($field_value_list AS $field_values) {
-                                               $sql = "DELETE FROM `" . $table . "` WHERE `" . $field . "` IN (" .
-                                                       substr(str_repeat("?, ", count($field_values)), 0, -2) . ");";
+               }
+               foreach ($compacted AS $table => $values) {
+                       foreach ($values AS $field => $field_value_list) {
+                               foreach ($field_value_list AS $field_values) {
+                                       $sql = "DELETE FROM `" . $table . "` WHERE `" . $field . "` IN (" .
+                                               substr(str_repeat("?, ", count($field_values)), 0, -2) . ");";
 
-                                               Logger::log(self::replaceParameters($sql, $field_values), Logger::DATA);
+                                       Logger::log(self::replaceParameters($sql, $field_values), Logger::DATA);
 
-                                               if (!self::e($sql, $field_values)) {
-                                                       if ($do_transaction) {
-                                                               self::rollback();
-                                                       }
-                                                       return false;
+                                       if (!self::e($sql, $field_values)) {
+                                               if ($do_transaction) {
+                                                       self::rollback();
                                                }
+                                               return false;
                                        }
                                }
                        }
-                       if ($do_transaction) {
-                               self::commit();
-                       }
-                       return true;
                }
-
-               return $commands;
+               if ($do_transaction) {
+                       self::commit();
+               }
+               return true;
        }
 
        /**
@@ -1214,12 +1213,13 @@ class DBA
         * Only set $old_fields to a boolean value when you are sure that you will update a single row.
         * When you set $old_fields to "true" then $fields must contain all relevant fields!
         *
-        * @param string $table Table name
-        * @param array $fields contains the fields that are updated
-        * @param array $condition condition array with the key values
+        * @param string        $table      Table name
+        * @param array         $fields     contains the fields that are updated
+        * @param array         $condition  condition array with the key values
         * @param array|boolean $old_fields array with the old field values that are about to be replaced (true = update on duplicate)
         *
         * @return boolean was the update successfull?
+        * @throws \Exception
         */
        public static function update($table, $fields, $condition, $old_fields = []) {
 
@@ -1250,7 +1250,7 @@ class DBA
 
                foreach ($old_fields AS $fieldname => $content) {
                        if (isset($fields[$fieldname])) {
-                               if ($fields[$fieldname] == $content) {
+                               if (($fields[$fieldname] == $content) && !is_null($content)) {
                                        unset($fields[$fieldname]);
                                } else {
                                        $do_update = true;
@@ -1281,7 +1281,8 @@ class DBA
         * @param array  $condition
         * @param array  $params
         * @return bool|array
-        * @see self::select
+        * @throws \Exception
+        * @see   self::select
         */
        public static function selectFirst($table, array $fields = [], array $condition = [], $params = [])
        {
@@ -1318,6 +1319,7 @@ class DBA
         * $params = array("order" => array("id", "received" => true), "limit" => 10);
         *
         * $data = DBA::select($table, $fields, $condition, $params);
+        * @throws \Exception
         */
        public static function select($table, array $fields = [], array $condition = [], array $params = [])
        {
@@ -1347,8 +1349,8 @@ class DBA
        /**
         * @brief Counts the rows from a table satisfying the provided condition
         *
-        * @param string $table Table name
-        * @param array $condition array of fields for condition
+        * @param string $table     Table name
+        * @param array  $condition array of fields for condition
         *
         * @return int
         *
@@ -1360,6 +1362,7 @@ class DBA
         * $condition = ["`uid` = ? AND `network` IN (?, ?)", 1, 'dfrn', 'dspr'];
         *
         * $count = DBA::count($table, $condition);
+        * @throws \Exception
         */
        public static function count($table, array $condition = [])
        {
@@ -1487,6 +1490,7 @@ class DBA
         * @brief Fills an array with data from a query
         *
         * @param object $stmt statement object
+        * @param bool   $do_close
         * @return array Data array
         */
        public static function toArray($stmt, $do_close = true) {
@@ -1529,7 +1533,7 @@ class DBA
         * @return boolean was the close successful?
         */
        public static function close($stmt) {
-               $a = get_app();
+               $a = \get_app();
 
                $stamp1 = microtime(true);
 
@@ -1568,14 +1572,13 @@ class DBA
         * @return array
         *      'list' => List of processes, separated in their different states
         *      'amount' => Number of concurrent database processes
+        * @throws \Exception
         */
        public static function processlist()
        {
                $ret = self::p("SHOW PROCESSLIST");
                $data = self::toArray($ret);
 
-               $s = [];
-
                $processes = 0;
                $states = [];
                foreach ($data as $process) {