]> git.mxchange.org Git - friendica.git/blobdiff - src/Database/DBA.php
Move "OPTIMIZE TABLE" to own Database function
[friendica.git] / src / Database / DBA.php
index 097f1b756a19367574c35352029e772d94e654ce..d609f108ebf0626506b28d251b99dabfb2de7706 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * @copyright Copyright (C) 2010-2021, the Friendica project
+ * @copyright Copyright (C) 2010-2023, the Friendica project
  *
  * @license GNU AGPL version 3 or any later version
  *
@@ -42,7 +42,7 @@ class DBA
         */
        const NULL_DATETIME = '0001-01-01 00:00:00';
 
-       public static function connect()
+       public static function connect(): bool
        {
                return DI::dba()->connect();
        }
@@ -58,7 +58,7 @@ class DBA
        /**
         * Perform a reconnect of an existing database connection
         */
-       public static function reconnect()
+       public static function reconnect(): bool
        {
                return DI::dba()->reconnect();
        }
@@ -77,7 +77,7 @@ class DBA
         *
         * @return string with either "pdo" or "mysqli"
         */
-       public static function getDriver()
+       public static function getDriver(): string
        {
                return DI::dba()->getDriver();
        }
@@ -90,7 +90,7 @@ class DBA
         *
         * @return string
         */
-       public static function serverInfo()
+       public static function serverInfo(): string
        {
                return DI::dba()->serverInfo();
        }
@@ -101,7 +101,7 @@ class DBA
         * @return string
         * @throws \Exception
         */
-       public static function databaseName()
+       public static function databaseName(): string
        {
                return DI::dba()->databaseName();
        }
@@ -112,7 +112,7 @@ class DBA
         * @param string $str
         * @return string escaped string
         */
-       public static function escape($str)
+       public static function escape(string $str): string
        {
                return DI::dba()->escape($str);
        }
@@ -122,7 +122,7 @@ class DBA
         *
         * @return boolean is the database connected?
         */
-       public static function connected()
+       public static function connected(): bool
        {
                return DI::dba()->connected();
        }
@@ -138,7 +138,7 @@ class DBA
         * @param string $sql An SQL string without the values
         * @return string The input SQL string modified if necessary.
         */
-       public static function anyValueFallback($sql)
+       public static function anyValueFallback(string $sql): string
        {
                return DI::dba()->anyValueFallback($sql);
        }
@@ -152,7 +152,7 @@ class DBA
         * @param string $sql An SQL string without the values
         * @return string The input SQL string modified if necessary.
         */
-       public static function cleanQuery($sql)
+       public static function cleanQuery(string $sql): string
        {
                $search = ["\t", "\n", "\r", "  "];
                $replace = [' ', ' ', ' ', ' '];
@@ -169,7 +169,7 @@ class DBA
         * @param array $args Parameter array
         * @return array universalized parameter array
         */
-       public static function getParam($args)
+       public static function getParam(array $args): array
        {
                unset($args[0]);
 
@@ -192,7 +192,7 @@ class DBA
         * @return bool|object statement object or result object
         * @throws \Exception
         */
-       public static function p($sql)
+       public static function p(string $sql)
        {
                $params = self::getParam(func_get_args());
 
@@ -205,11 +205,11 @@ class DBA
         * Please use DBA::delete, DBA::insert, DBA::update, ... instead
         *
         * @param string $sql SQL statement
-        * @return boolean Was the query successfull? False is returned only if an error occurred
+        * @return boolean Was the query successful? False is returned only if an error occurred
         * @throws \Exception
         */
-       public static function e($sql) {
-
+       public static function e(string $sql): bool
+       {
                $params = self::getParam(func_get_args());
 
                return DI::dba()->e($sql, $params);
@@ -218,13 +218,12 @@ class DBA
        /**
         * Check if data exists
         *
-        * @param string|array $table     Table name or array [schema => table]
-        * @param array        $condition array of fields for condition
-        *
+        * @param string $table     Table name in format schema.table (where schema is optional)
+        * @param array  $condition Array of fields for condition
         * @return boolean Are there rows for that condition?
         * @throws \Exception
         */
-       public static function exists($table, $condition)
+       public static function exists(string $table, array $condition): bool
        {
                return DI::dba()->exists($table, $condition);
        }
@@ -238,7 +237,7 @@ class DBA
         * @return array first row of query
         * @throws \Exception
         */
-       public static function fetchFirst($sql)
+       public static function fetchFirst(string $sql)
        {
                $params = self::getParam(func_get_args());
 
@@ -250,7 +249,7 @@ class DBA
         *
         * @return int Number of rows
         */
-       public static function affectedRows()
+       public static function affectedRows(): int
        {
                return DI::dba()->affectedRows();
        }
@@ -261,7 +260,7 @@ class DBA
         * @param object Statement object
         * @return int Number of columns
         */
-       public static function columnCount($stmt)
+       public static function columnCount($stmt): int
        {
                return DI::dba()->columnCount($stmt);
        }
@@ -271,7 +270,7 @@ class DBA
         * @param PDOStatement|mysqli_result|mysqli_stmt Statement object
         * @return int Number of rows
         */
-       public static function numRows($stmt)
+       public static function numRows($stmt): int
        {
                return DI::dba()->numRows($stmt);
        }
@@ -290,14 +289,13 @@ class DBA
        /**
         * Insert a row into a table
         *
-        * @param string|array $table          Table name or array [schema => table]
-        * @param array        $param          parameter array
-        * @param int          $duplicate_mode What to do on a duplicated entry
-        *
+        * @param string $table          Table name in format schema.table (where schema is optional)
+        * @param array  $param          parameter array
+        * @param int    $duplicate_mode What to do on a duplicated entry
         * @return boolean was the insert successful?
         * @throws \Exception
         */
-       public static function insert($table, array $param, int $duplicate_mode = Database::INSERT_DEFAULT)
+       public static function insert(string $table, array $param, int $duplicate_mode = Database::INSERT_DEFAULT): bool
        {
                return DI::dba()->insert($table, $param, $duplicate_mode);
        }
@@ -306,13 +304,12 @@ class DBA
         * Inserts a row with the provided data in the provided table.
         * If the data corresponds to an existing row through a UNIQUE or PRIMARY index constraints, it updates the row instead.
         *
-        * @param string|array $table Table name or array [schema => table]
-        * @param array        $param parameter array
-        *
+        * @param string $table Table name in format schema.table (where schema is optional)
+        * @param array  $param parameter array
         * @return boolean was the insert successful?
         * @throws \Exception
         */
-       public static function replace($table, $param)
+       public static function replace(string $table, array $param): bool
        {
                return DI::dba()->replace($table, $param);
        }
@@ -322,7 +319,7 @@ class DBA
         *
         * @return integer Last inserted id
         */
-       public static function lastInsertId()
+       public static function lastInsertId(): int
        {
                return DI::dba()->lastInsertId();
        }
@@ -332,12 +329,11 @@ class DBA
         *
         * This function can be extended in the future to accept a table array as well.
         *
-        * @param string|array $table Table name or array [schema => table]
-        *
+        * @param string $table Table name in format schema.table (where schema is optional)
         * @return boolean was the lock successful?
         * @throws \Exception
         */
-       public static function lock($table)
+       public static function lock(string $table): bool
        {
                return DI::dba()->lock($table);
        }
@@ -348,7 +344,7 @@ class DBA
         * @return boolean was the unlock successful?
         * @throws \Exception
         */
-       public static function unlock()
+       public static function unlock(): bool
        {
                return DI::dba()->unlock();
        }
@@ -358,7 +354,7 @@ class DBA
         *
         * @return boolean Was the command executed successfully?
         */
-       public static function transaction()
+       public static function transaction(): bool
        {
                return DI::dba()->transaction();
        }
@@ -368,7 +364,7 @@ class DBA
         *
         * @return boolean Was the command executed successfully?
         */
-       public static function commit()
+       public static function commit(): bool
        {
                return DI::dba()->commit();
        }
@@ -378,7 +374,7 @@ class DBA
         *
         * @return boolean Was the command executed successfully?
         */
-       public static function rollback()
+       public static function rollback(): bool
        {
                return DI::dba()->rollback();
        }
@@ -386,13 +382,13 @@ class DBA
        /**
         * Delete a row from a table
         *
-        * @param string|array $table      Table name
-        * @param array        $conditions Field condition(s)
+        * @param string $table      Table name
+        * @param array  $conditions Field condition(s)
         *
         * @return boolean was the delete successful?
         * @throws \Exception
         */
-       public static function delete($table, array $conditions, array $options = [])
+       public static function delete(string $table, array $conditions, array $options = []): bool
        {
                return DI::dba()->delete($table, $conditions, $options);
        }
@@ -418,23 +414,24 @@ 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|array  $table      Table name or array [schema => table]
+        * @param string        $table      Table name in format schema.table (where schema is optional)
         * @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)
+        * @param array|boolean $old_fields array with the old field values that are about to be replaced (true = update on duplicate, false = don't update identical fields)
+        * @param array         $params     Parameters: "ignore" If set to "true" then the update is done with the ignore parameter
         *
-        * @return boolean was the update successfull?
+        * @return boolean was the update successful?
         * @throws \Exception
         */
-       public static function update($table, $fields, $condition, $old_fields = [])
+       public static function update(string $table, array $fields, array $condition, $old_fields = [], array $params = []): bool
        {
-               return DI::dba()->update($table, $fields, $condition, $old_fields);
+               return DI::dba()->update($table, $fields, $condition, $old_fields, $params);
        }
 
        /**
         * Retrieve a single record from a table and returns it in an associative array
         *
-        * @param string|array $table     Table name or array [schema => table]
+        * @param string|array $table     Table name in format schema.table (where schema is optional)
         * @param array        $fields
         * @param array        $condition
         * @param array        $params
@@ -442,7 +439,7 @@ class DBA
         * @throws \Exception
         * @see   self::select
         */
-       public static function selectFirst($table, array $fields = [], array $condition = [], $params = [])
+       public static function selectFirst($table, array $fields = [], array $condition = [], array $params = [])
        {
                return DI::dba()->selectFirst($table, $fields, $condition, $params);
        }
@@ -450,16 +447,16 @@ class DBA
        /**
         * Select rows from a table and fills an array with the data
         *
-        * @param string|array $table     Table name or array [schema => table]
-        * @param array        $fields    Array of selected fields, empty for all
-        * @param array        $condition Array of fields for condition
-        * @param array        $params    Array of several parameters
+        * @param string $table     Table name in format schema.table (where schema is optional)
+        * @param array  $fields    Array of selected fields, empty for all
+        * @param array  $condition Array of fields for condition
+        * @param array  $params    Array of several parameters
         *
         * @return array Data array
         * @throws \Exception
         * @see   self::select
         */
-       public static function selectToArray($table, array $fields = [], array $condition = [], array $params = [])
+       public static function selectToArray(string $table, array $fields = [], array $condition = [], array $params = [])
        {
                return DI::dba()->selectToArray($table, $fields, $condition, $params);
        }
@@ -467,10 +464,10 @@ class DBA
        /**
         * Select rows from a table
         *
-        * @param string|array $table     Table name or array [schema => table]
-        * @param array        $fields    Array of selected fields, empty for all
-        * @param array        $condition Array of fields for condition
-        * @param array        $params    Array of several parameters
+        * @param string $table     Table name in format schema.table (where schema is optional)
+        * @param array  $fields    Array of selected fields, empty for all
+        * @param array  $condition Array of fields for condition
+        * @param array  $params    Array of several parameters
         *
         * @return boolean|object
         *
@@ -487,7 +484,7 @@ class DBA
         * $data = DBA::select($table, $fields, $condition, $params);
         * @throws \Exception
         */
-       public static function select($table, array $fields = [], array $condition = [], array $params = [])
+       public static function select(string $table, array $fields = [], array $condition = [], array $params = [])
        {
                return DI::dba()->select($table, $fields, $condition, $params);
        }
@@ -495,9 +492,9 @@ class DBA
        /**
         * Counts the rows from a table satisfying the provided condition
         *
-        * @param string|array $table     Table name or array [schema => table]
-        * @param array        $condition array of fields for condition
-        * @param array        $params    Array of several parameters
+        * @param string $table     Table name in format schema.table (where schema is optional)
+        * @param array  $condition array of fields for condition
+        * @param array  $params    Array of several parameters
         *
         * @return int
         *
@@ -511,7 +508,7 @@ class DBA
         * $count = DBA::count($table, $condition);
         * @throws \Exception
         */
-       public static function count($table, array $condition = [], array $params = [])
+       public static function count(string $table, array $condition = [], array $params = []): int
        {
                return DI::dba()->count($table, $condition, $params);
        }
@@ -520,41 +517,34 @@ class DBA
         * Build the table query substring from one or more tables, with or without a schema.
         *
         * Expected formats:
-        * - table
+        * - [table]
         * - [table1, table2, ...]
         * - [schema1 => table1, schema2 => table2, table3, ...]
         *
-        * @param string|array $tables
+        * @param array $tables Table names
         * @return string
         */
-       public static function buildTableString($tables)
+       public static function buildTableString(array $tables): string
        {
-               if (is_string($tables)) {
-                       $tables = [$tables];
-               }
-
-               $quotedTables = [];
-
-               foreach ($tables as $schema => $table) {
-                       if (is_numeric($schema)) {
-                               $quotedTables[] = self::quoteIdentifier($table);
-                       } else {
-                               $quotedTables[] = self::quoteIdentifier($schema) . '.' . self::quoteIdentifier($table);
-                       }
-               }
-
-               return implode(', ', $quotedTables);
+               // Quote each entry
+               return implode(',', array_map([self::class, 'quoteIdentifier'], $tables));
        }
 
        /**
-        * Escape an identifier (table or field name)
+        * Escape an identifier (table or field name) optional with a schema like ((schema.)table.)field
         *
-        * @param $identifier
-        * @return string
+        * @param string $identifier Table, field name
+        * @return string Quotes table or field name
         */
-       public static function quoteIdentifier($identifier)
+       public static function quoteIdentifier(string $identifier): string
        {
-               return '`' . str_replace('`', '``', $identifier) . '`';
+               return implode(
+                       '.',
+                       array_map(
+                               function (string $identifier) { return '`' . str_replace('`', '``', $identifier) . '`'; },
+                               explode('.', $identifier)
+                       )
+               );
        }
 
        /**
@@ -575,10 +565,10 @@ class DBA
         * @param array $condition
         * @return string
         */
-       public static function buildCondition(array &$condition = [])
+       public static function buildCondition(array &$condition = []): string
        {
                $condition = self::collapseCondition($condition);
-               
+
                $condition_string = '';
                if (count($condition) > 0) {
                        $condition_string = " WHERE (" . array_shift($condition) . ")";
@@ -599,7 +589,7 @@ class DBA
         * @param array $condition
         * @return array
         */
-       public static function collapseCondition(array $condition)
+       public static function collapseCondition(array $condition): array
        {
                // Ensures an always true condition is returned
                if (count($condition) < 1) {
@@ -674,7 +664,7 @@ class DBA
         * @return array A collapsed condition
         * @see DBA::collapseCondition() for the condition array formats
         */
-       public static function mergeConditions(array ...$conditions)
+       public static function mergeConditions(array ...$conditions): array
        {
                if (count($conditions) == 1) {
                        return current($conditions);
@@ -723,17 +713,17 @@ class DBA
         * @param array $params
         * @return string
         */
-       public static function buildParameter(array $params = [])
+       public static function buildParameter(array $params = []): string
        {
                $groupby_string = '';
                if (!empty($params['group_by'])) {
-                       $groupby_string = " GROUP BY " . implode(', ', array_map(['self', 'quoteIdentifier'], $params['group_by']));
+                       $groupby_string = " GROUP BY " . implode(', ', array_map([self::class, 'quoteIdentifier'], $params['group_by']));
                }
 
                $order_string = '';
                if (isset($params['order'])) {
                        $order_string = " ORDER BY ";
-                       foreach ($params['order'] AS $fields => $order) {
+                       foreach ($params['order'] as $fields => $order) {
                                if ($order === 'RAND()') {
                                        $order_string .= "RAND(), ";
                                } elseif (!is_int($fields)) {
@@ -770,7 +760,7 @@ class DBA
         *
         * @return array Data array
         */
-       public static function toArray($stmt, $do_close = true, int $count = 0)
+       public static function toArray($stmt, bool $do_close = true, int $count = 0): array
        {
                return DI::dba()->toArray($stmt, $do_close, $count);
        }
@@ -782,7 +772,7 @@ class DBA
         * @param array  $fields
         * @return array casted fields
         */
-       public static function castFields(string $table, array $fields)
+       public static function castFields(string $table, array $fields): array
        {
                return DI::dba()->castFields($table, $fields);
        }
@@ -792,7 +782,7 @@ class DBA
         *
         * @return string Error number (0 if no error)
         */
-       public static function errorNo()
+       public static function errorNo(): int
        {
                return DI::dba()->errorNo();
        }
@@ -802,7 +792,7 @@ class DBA
         *
         * @return string Error message ('' if no error)
         */
-       public static function errorMessage()
+       public static function errorMessage(): string
        {
                return DI::dba()->errorMessage();
        }
@@ -813,7 +803,7 @@ class DBA
         * @param object $stmt statement object
         * @return boolean was the close successful?
         */
-       public static function close($stmt)
+       public static function close($stmt): bool
        {
                return DI::dba()->close($stmt);
        }
@@ -826,7 +816,7 @@ class DBA
         *      'amount' => Number of concurrent database processes
         * @throws \Exception
         */
-       public static function processlist()
+       public static function processlist(): array
        {
                return DI::dba()->processlist();
        }
@@ -846,10 +836,9 @@ class DBA
         * Checks if $array is a filled array with at least one entry.
         *
         * @param mixed $array A filled array with at least one entry
-        *
         * @return boolean Whether $array is a filled array or an object with rows
         */
-       public static function isResult($array)
+       public static function isResult($array): bool
        {
                return DI::dba()->isResult($array);
        }
@@ -861,7 +850,7 @@ class DBA
         * @param boolean $add_quotation add quotation marks for string values
         * @return void
         */
-       public static function escapeArray(&$arr, $add_quotation = false)
+       public static function escapeArray(&$arr, bool $add_quotation = false)
        {
                DI::dba()->escapeArray($arr, $add_quotation);
        }