]> git.mxchange.org Git - friendica.git/blobdiff - src/Database/Database.php
Add `hostname` to `Process` entity
[friendica.git] / src / Database / Database.php
index 8e347056326e57f552555746216461e53cccab3a..0e1cffb4ac95204ea2ea8d557917e5737a6d6d4a 100644 (file)
@@ -21,9 +21,9 @@
 
 namespace Friendica\Database;
 
-use Friendica\Core\Config\Cache;
+use Friendica\Core\Config\ValueObject\Cache;
 use Friendica\Core\System;
-use Friendica\Network\HTTPException\InternalServerErrorException;
+use Friendica\Network\HTTPException\ServiceUnavailableException;
 use Friendica\Util\DateTimeFormat;
 use Friendica\Util\Profiler;
 use mysqli;
@@ -49,7 +49,7 @@ class Database
        protected $connected = false;
 
        /**
-        * @var Cache
+        * @var \Friendica\Core\Config\ValueObject\Cache
         */
        protected $configCache;
        /**
@@ -434,7 +434,7 @@ class Database
        private function replaceParameters($sql, $args)
        {
                $offset = 0;
-               foreach ($args AS $param => $value) {
+               foreach ($args as $param => $value) {
                        if (is_int($args[$param]) || is_float($args[$param]) || is_bool($args[$param])) {
                                $replace = intval($args[$param]);
                        } elseif (is_null($args[$param])) {
@@ -468,6 +468,7 @@ class Database
        public function p($sql)
        {
 
+               $this->profiler->startRecording('database');
                $stamp1 = microtime(true);
 
                $params = DBA::getParam(func_get_args());
@@ -475,7 +476,7 @@ class Database
                // Renumber the array keys to be sure that they fit
                $i    = 0;
                $args = [];
-               foreach ($params AS $param) {
+               foreach ($params as $param) {
                        // Avoid problems with some MySQL servers and boolean values. See issue #3645
                        if (is_bool($param)) {
                                $param = (int)$param;
@@ -519,7 +520,7 @@ class Database
                $called_from_e = ($called_from['function'] == 'e');
 
                if (!isset($this->connection)) {
-                       throw new InternalServerErrorException('The Connection is empty, although connected is set true.');
+                       throw new ServiceUnavailableException('The Connection is empty, although connected is set true.');
                }
 
                switch ($this->driver) {
@@ -548,12 +549,14 @@ class Database
                                        break;
                                }
 
-                               foreach ($args AS $param => $value) {
+                               foreach (array_keys($args) as $param) {
+                                       $data_type = PDO::PARAM_STR;
                                        if (is_int($args[$param])) {
                                                $data_type = PDO::PARAM_INT;
-                                       } else {
-                                               $data_type = PDO::PARAM_STR;
+                                       } elseif ($args[$param] !== null) {
+                                               $args[$param] = (string)$args[$param];
                                        }
+
                                        $stmt->bindParam($param, $args[$param], $data_type);
                                }
 
@@ -604,13 +607,16 @@ class Database
 
                                $param_types = '';
                                $values      = [];
-                               foreach ($args AS $param => $value) {
+                               foreach (array_keys($args) as $param) {
                                        if (is_int($args[$param])) {
                                                $param_types .= 'i';
                                        } elseif (is_float($args[$param])) {
                                                $param_types .= 'd';
                                        } elseif (is_string($args[$param])) {
                                                $param_types .= 's';
+                                       } elseif (is_object($args[$param]) && method_exists($args[$param], '__toString')) {
+                                               $param_types .= 's';
+                                               $args[$param] = (string)$args[$param];
                                        } else {
                                                $param_types .= 'b';
                                        }
@@ -695,7 +701,7 @@ class Database
                        $this->errorno = $errorno;
                }
 
-               $this->profiler->saveTimestamp($stamp1, 'database');
+               $this->profiler->stopRecording();
 
                if ($this->configCache->get('system', 'db_log')) {
                        $stamp2   = microtime(true);
@@ -727,7 +733,7 @@ class Database
        public function e($sql)
        {
 
-               $stamp = microtime(true);
+               $this->profiler->startRecording('database_write');
 
                $params = DBA::getParam(func_get_args());
 
@@ -779,7 +785,7 @@ class Database
                        $this->errorno = $errorno;
                }
 
-               $this->profiler->saveTimestamp($stamp, "database_write");
+               $this->profiler->stopRecording();
 
                return $retval;
        }
@@ -908,13 +914,13 @@ class Database
        /**
         * Fetch a single row
         *
-        * @param PDOStatement|mysqli_stmt $stmt statement object
+        * @param bool|PDOStatement|mysqli_stmt $stmt statement object
         *
         * @return array|false current row
         */
        public function fetch($stmt)
        {
-               $stamp1 = microtime(true);
+               $this->profiler->startRecording('database');
 
                $columns = [];
 
@@ -957,18 +963,18 @@ class Database
                                $result = $stmt->result_metadata();
                                $fields = $result->fetch_fields();
 
-                               foreach ($cols_num AS $param => $col) {
+                               foreach ($cols_num as $param => $col) {
                                        $columns[$fields[$param]->name] = $col;
                                }
                }
 
-               $this->profiler->saveTimestamp($stamp1, 'database');
+               $this->profiler->stopRecording();
 
                return $columns;
        }
 
        /**
-        * Insert a row into a table
+        * Insert a row into a table. Field value objects will be cast as string.
         *
         * @param string|array $table          Table name or array [schema => table]
         * @param array        $param          parameter array
@@ -1243,9 +1249,9 @@ class Database
        }
 
        /**
-        * Updates rows
+        * Updates rows in the database. Field value objects will be cast as string.
         *
-        * Updates rows in the database. When $old_fields is set to an array,
+        * When $old_fields is set to an array,
         * the system will only do an update if the fields in that array changed.
         *
         * Attention:
@@ -1266,7 +1272,7 @@ class Database
         * @param string|array  $table      Table name or array [schema => table]
         * @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)
         *
         * @return boolean was the update successfull?
         * @throws \Exception
@@ -1292,7 +1298,7 @@ class Database
                        }
                }
 
-               foreach ($old_fields AS $fieldname => $content) {
+               foreach ($old_fields as $fieldname => $content) {
                        if (isset($fields[$fieldname]) && !is_null($content) && ($fields[$fieldname] == $content)) {
                                unset($fields[$fieldname]);
                        }
@@ -1460,8 +1466,12 @@ class Database
 
                $row = $this->fetchFirst($sql, $condition);
 
-               // Ensure to always return either a "null" or a numeric value
-               return is_numeric($row['count']) ? (int)$row['count'] : $row['count'];
+               if (!isset($row['count'])) {
+                       $this->logger->notice('Invalid count.', ['table' => $table, 'row' => $row, 'expression' => $expression, 'condition' => $condition_string, 'callstack' => System::callstack()]);
+                       return 0;
+               } else {
+                       return (int)$row['count'];
+               }
        }
 
        /**
@@ -1556,9 +1566,9 @@ class Database
                        }
                }
 
-               return $fields; 
+               return $fields;
        }
-       
+
        /**
         * Returns the error number of the last query
         *
@@ -1589,7 +1599,7 @@ class Database
        public function close($stmt)
        {
 
-               $stamp1 = microtime(true);
+               $this->profiler->startRecording('database');
 
                if (!is_object($stmt)) {
                        return false;
@@ -1615,7 +1625,7 @@ class Database
                                break;
                }
 
-               $this->profiler->saveTimestamp($stamp1, 'database');
+               $this->profiler->stopRecording();
 
                return $ret;
        }