]> git.mxchange.org Git - friendica.git/blobdiff - src/Database/DBA.php
Use ISO-639-1 for the language detection
[friendica.git] / src / Database / DBA.php
index 68fb32f9a27aa7b96fd76da5ef3ab842caa76781..0c0fd0f80d30839cf94261d08dfee5a0f9a63334 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * @copyright Copyright (C) 2010-2022, the Friendica project
+ * @copyright Copyright (C) 2010-2023, the Friendica project
  *
  * @license GNU AGPL version 3 or any later version
  *
@@ -42,6 +42,11 @@ class DBA
         */
        const NULL_DATETIME = '0001-01-01 00:00:00';
 
+       /**
+        * Lowest possible datetime(6) value
+        */
+       const NULL_DATETIME6 = '0001-01-01 00:00:00.000000';
+
        public static function connect(): bool
        {
                return DI::dba()->connect();
@@ -77,7 +82,7 @@ class DBA
         *
         * @return string with either "pdo" or "mysqli"
         */
-       public static function getDriver()
+       public static function getDriver(): string
        {
                return DI::dba()->getDriver();
        }
@@ -205,7 +210,7 @@ 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(string $sql): bool
@@ -218,7 +223,7 @@ class DBA
        /**
         * Check if data exists
         *
-        * @param string $table     Table name or array [schema => table]
+        * @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
@@ -289,7 +294,7 @@ class DBA
        /**
         * Insert a row into a table
         *
-        * @param string $table          Table name or array [schema => table]
+        * @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?
@@ -304,7 +309,7 @@ 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 $table Table name or array [schema => table]
+        * @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
@@ -329,7 +334,7 @@ class DBA
         *
         * This function can be extended in the future to accept a table array as well.
         *
-        * @param string $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
         */
@@ -414,13 +419,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 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, 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(string $table, array $fields, array $condition, $old_fields = [], array $params = []): bool
@@ -431,7 +436,7 @@ class DBA
        /**
         * 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
@@ -447,7 +452,7 @@ class DBA
        /**
         * Select rows from a table and fills an array with the data
         *
-        * @param string $table     Table name or array [schema => table]
+        * @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
@@ -464,7 +469,7 @@ class DBA
        /**
         * Select rows from a table
         *
-        * @param string $table     Table name or array [schema => table]
+        * @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
@@ -492,7 +497,7 @@ class DBA
        /**
         * Counts the rows from a table satisfying the provided condition
         *
-        * @param string $table     Table name or array [schema => table]
+        * @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
         *
@@ -517,7 +522,7 @@ 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, ...]
         *
@@ -526,32 +531,25 @@ class DBA
         */
        public static function buildTableString(array $tables): string
        {
-               $quotedTables = [];
-
-               foreach ($tables as $schema => $table) {
-                       if (is_numeric($schema)) {
-                               $str = '';
-                               foreach (explode('.', $table) as $part) {
-                                       $str .= self::quoteIdentifier($part) . '.';
-                               }
-                               $quotedTables[] = rtrim($str, '.');
-                       } 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(string $identifier): string
        {
-               return '`' . str_replace('`', '``', $identifier) . '`';
+               return implode(
+                       '.',
+                       array_map(
+                               function (string $identifier) { return '`' . str_replace('`', '``', $identifier) . '`'; },
+                               explode('.', $identifier)
+                       )
+               );
        }
 
        /**
@@ -575,7 +573,7 @@ class DBA
        public static function buildCondition(array &$condition = []): string
        {
                $condition = self::collapseCondition($condition);
-               
+
                $condition_string = '';
                if (count($condition) > 0) {
                        $condition_string = " WHERE (" . array_shift($condition) . ")";
@@ -724,7 +722,7 @@ class DBA
        {
                $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 = '';
@@ -828,6 +826,27 @@ class DBA
                return DI::dba()->processlist();
        }
 
+       /**
+        * Optimizes tables
+        *
+        * @param string $table a given table
+        *
+        * @return bool True, if successfully optimized, otherwise false
+        * @throws \Exception
+        */
+       public static function optimizeTable(string $table): bool
+       {
+               return DI::dba()->optimizeTable($table);
+       }
+
+       /**
+        * Kill sleeping database processes
+        */
+       public static function deleteSleepingProcesses()
+       {
+               DI::dba()->deleteSleepingProcesses();
+       }
+
        /**
         * Fetch a database variable
         *