diff --git a/src/Database/Database.php b/src/Database/Database.php index 79c39e9af..a34b17adb 100644 --- a/src/Database/Database.php +++ b/src/Database/Database.php @@ -43,12 +43,12 @@ use Psr\Log\NullLogger; */ class Database { - const PDO = 'pdo'; + const PDO = 'pdo'; const MYSQLI = 'mysqli'; const INSERT_DEFAULT = 0; - const INSERT_UPDATE = 1; - const INSERT_IGNORE = 2; + const INSERT_UPDATE = 1; + const INSERT_IGNORE = 2; protected $connected = false; @@ -64,18 +64,18 @@ class Database * @var LoggerInterface */ protected $logger; - protected $server_info = ''; + protected $server_info = ''; /** @var PDO|mysqli */ protected $connection; protected $driver = ''; protected $pdo_emulate_prepares = false; - private $error = ''; - private $errorno = 0; - private $affected_rows = 0; + private $error = ''; + private $errorno = 0; + private $affected_rows = 0; protected $in_transaction = false; - protected $in_retrial = false; - protected $testmode = false; - private $relation = []; + protected $in_retrial = false; + protected $testmode = false; + private $relation = []; /** @var DbaDefinition */ protected $dbaDefinition; /** @var ViewDefinition */ @@ -112,23 +112,22 @@ class Database $port = 0; $serveraddr = trim($this->configCache->get('database', 'hostname')); $serverdata = explode(':', $serveraddr); - $server = $serverdata[0]; + $host = trim($serverdata[0]); if (count($serverdata) > 1) { $port = trim($serverdata[1]); } - if (!empty(trim($this->configCache->get('database', 'port')))) { - $port = trim($this->configCache->get('database', 'port')); + if (trim($this->configCache->get('database', 'port') ?? 0)) { + $port = trim($this->configCache->get('database', 'port') ?? 0); } - $server = trim($server); - $user = trim($this->configCache->get('database', 'username')); - $pass = trim($this->configCache->get('database', 'password')); - $db = trim($this->configCache->get('database', 'database')); - $charset = trim($this->configCache->get('database', 'charset')); - $socket = trim($this->configCache->get('database', 'socket')); + $user = trim($this->configCache->get('database', 'username')); + $pass = trim($this->configCache->get('database', 'password')); + $database = trim($this->configCache->get('database', 'database')); + $charset = trim($this->configCache->get('database', 'charset')); + $socket = trim($this->configCache->get('database', 'socket')); - if (!(strlen($server) && strlen($user))) { + if (!$host && !$socket || !$user) { return false; } @@ -138,19 +137,20 @@ class Database if (!$this->configCache->get('database', 'disable_pdo') && class_exists('\PDO') && in_array('mysql', PDO::getAvailableDrivers())) { $this->driver = self::PDO; - $connect = "mysql:host=" . $server . ";dbname=" . $db; - - if ($port > 0) { - $connect .= ";port=" . $port; + if ($socket) { + $connect = 'mysql:unix_socket=' . $socket; + } else { + $connect = 'mysql:host=' . $host; + if ($port > 0) { + $connect .= ';port=' . $port; + } } if ($charset) { - $connect .= ";charset=" . $charset; + $connect .= ';charset=' . $charset; } - if ($socket) { - $connect .= ";$unix_socket=" . $socket; - } + $connect .= ';dbname=' . $database; try { $this->connection = @new PDO($connect, $user, $pass, [PDO::ATTR_PERSISTENT => $persistent]); @@ -165,10 +165,12 @@ class Database if (!$this->connected && class_exists('\mysqli')) { $this->driver = self::MYSQLI; - if ($port > 0) { - $this->connection = @new mysqli($server, $user, $pass, $db, $port); + if ($socket) { + $this->connection = @new mysqli(null, $user, $pass, $database, null, $socket); + } elseif ($port > 0) { + $this->connection = @new mysqli($host, $user, $pass, $database, $port); } else { - $this->connection = @new mysqli($server, $user, $pass, $db); + $this->connection = @new mysqli($host, $user, $pass, $database); } if (!mysqli_connect_errno()) { @@ -177,11 +179,6 @@ class Database if ($charset) { $this->connection->set_charset($charset); } - - if ($socket) { - $this->connection->set_socket($socket); - } - } } @@ -198,6 +195,7 @@ class Database { $this->testmode = $test; } + /** * Sets the logger for DBA * @@ -222,6 +220,7 @@ class Database { $this->profiler = $profiler; } + /** * Disconnects the current database connection */ @@ -338,12 +337,12 @@ class Database } $watchlist = explode(',', $this->configCache->get('system', 'db_log_index_watch')); - $denylist = explode(',', $this->configCache->get('system', 'db_log_index_denylist')); + $denylist = explode(',', $this->configCache->get('system', 'db_log_index_denylist')); while ($row = $this->fetch($r)) { if ((intval($this->configCache->get('system', 'db_loglimit_index')) > 0)) { $log = (in_array($row['key'], $watchlist) && - ($row['rows'] >= intval($this->configCache->get('system', 'db_loglimit_index')))); + ($row['rows'] >= intval($this->configCache->get('system', 'db_loglimit_index')))); } else { $log = false; } @@ -358,11 +357,15 @@ class Database if ($log) { $backtrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS); - @file_put_contents($this->configCache->get('system', 'db_log_index'), DateTimeFormat::utcNow() . "\t" . - $row['key'] . "\t" . $row['rows'] . "\t" . $row['Extra'] . "\t" . - basename($backtrace[1]["file"]) . "\t" . - $backtrace[1]["line"] . "\t" . $backtrace[2]["function"] . "\t" . - substr($query, 0, 4000) . "\n", FILE_APPEND); + @file_put_contents( + $this->configCache->get('system', 'db_log_index'), + DateTimeFormat::utcNow() . "\t" . + $row['key'] . "\t" . $row['rows'] . "\t" . $row['Extra'] . "\t" . + basename($backtrace[1]["file"]) . "\t" . + $backtrace[1]["line"] . "\t" . $backtrace[2]["function"] . "\t" . + substr($query, 0, 4000) . "\n", + FILE_APPEND + ); } } } @@ -449,7 +452,7 @@ class Database { $server_info = $this->serverInfo(); if (version_compare($server_info, '5.7.5', '<') || - (stripos($server_info, 'MariaDB') !== false)) { + (stripos($server_info, 'MariaDB') !== false)) { $sql = str_ireplace('ANY_VALUE(', 'MIN(', $sql); } return $sql; @@ -647,7 +650,7 @@ class Database } elseif (is_string($args[$param])) { $param_types .= 's'; } elseif (is_object($args[$param]) && method_exists($args[$param], '__toString')) { - $param_types .= 's'; + $param_types .= 's'; $args[$param] = (string)$args[$param]; } else { $param_types .= 'b'; @@ -743,10 +746,14 @@ class Database $duration = round($duration, 3); $backtrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS); - @file_put_contents($this->configCache->get('system', 'db_log'), DateTimeFormat::utcNow() . "\t" . $duration . "\t" . - basename($backtrace[1]["file"]) . "\t" . - $backtrace[1]["line"] . "\t" . $backtrace[2]["function"] . "\t" . - substr($this->replaceParameters($sql, $args), 0, 4000) . "\n", FILE_APPEND); + @file_put_contents( + $this->configCache->get('system', 'db_log'), + DateTimeFormat::utcNow() . "\t" . $duration . "\t" . + basename($backtrace[1]["file"]) . "\t" . + $backtrace[1]["line"] . "\t" . $backtrace[2]["function"] . "\t" . + substr($this->replaceParameters($sql, $args), 0, 4000) . "\n", + FILE_APPEND + ); } } return $retval; @@ -1365,7 +1372,7 @@ class Database . $condition_string; // Combines the updated fields parameter values with the condition parameter values - $params = array_merge(array_values($fields), $condition); + $params = array_merge(array_values($fields), $condition); return $this->e($sql, $params); } @@ -1415,8 +1422,8 @@ class Database /** * Escape fields, adding special treatment for "group by" handling * - * @param array $fields - * @param array $options + * @param array $fields + * @param array $options * @return array Escaped fields */ private function escapeFields(array $fields, array $options): array @@ -1438,8 +1445,7 @@ class Database } } - array_walk($fields, function(&$value, $key) use ($options) - { + array_walk($fields, function (&$value, $key) use ($options) { $field = $value; $value = DBA::quoteIdentifier($field); @@ -1487,7 +1493,7 @@ class Database } if (count($fields) > 0) { - $fields = $this->escapeFields($fields, $params); + $fields = $this->escapeFields($fields, $params); $select_string = implode(', ', $fields); } else { $select_string = '*'; @@ -1827,16 +1833,16 @@ class Database /** * Replaces a string in the provided fields of the provided table * - * @param string $table Table name - * @param array $fields List of field names in the provided table - * @param string $search String to search for + * @param string $table Table name + * @param array $fields List of field names in the provided table + * @param string $search String to search for * @param string $replace String to replace with * @return void * @throws \Exception */ public function replaceInTableFields(string $table, array $fields, string $search, string $replace) { - $search = $this->escape($search); + $search = $this->escape($search); $replace = $this->escape($replace); $upd = []; diff --git a/static/defaults.config.php b/static/defaults.config.php index a6c98abd1..a8fe5f868 100644 --- a/static/defaults.config.php +++ b/static/defaults.config.php @@ -38,12 +38,12 @@ return [ 'port' => null, // socket (String) - // Socket of the database server. - // Can be used instead of adding a socket location to the hostname - 'socket' => '', + // Socket of the database server. + // Can be used instead of adding a socket location to the hostname + 'socket' => '', // user (String) - // Database user name. Please don't use "root". + // Database username. Please don't use "root". 'username' => '', // pass (String) @@ -64,7 +64,7 @@ return [ 'pdo_emulate_prepares' => true, // disable_pdo (Boolean) - // PDO is used by default (if available). Otherwise MySQLi will be used. + // PDO is used by default (if available). Otherwise, MySQLi will be used. 'disable_pdo' => false, // persistent (Boolean) @@ -145,7 +145,7 @@ return [ 'block_local_dir' => false, // blocked_tags (String) - // Comma separated list of hash tags that shouldn't be displayed in the trending tags + // Comma separated list of hashtags that shouldn't be displayed in the trending tags 'blocked_tags' => '', // community_no_sharer (Boolean) @@ -153,7 +153,7 @@ return [ 'community_no_sharer' => false, // contact_update_limit (Integer) - // How much contacts should be checked at a time? + // How many contacts should be checked at a time? 'contact_update_limit' => 100, // cron_interval (Integer) @@ -259,7 +259,7 @@ return [ 'disable_implicit_mentions' => false, // disable_url_validation (Boolean) - // Disables the DNS lookup of an URL. + // Disables the DNS lookup of a URL. 'disable_url_validation' => false, // disable_password_exposed (Boolean) @@ -283,7 +283,7 @@ return [ 'dlogip' => '', // expire-notify-priority (integer) - // Priority for the expirary notification + // Priority for the expirary notification 'expire-notify-priority' => Friendica\Core\Worker::PRIORITY_LOW, // fetch_by_worker (Boolean) @@ -300,11 +300,11 @@ return [ // groupedit_image_limit (Integer) // Number of contacts at which the group editor should switch from display the profile pictures of the contacts to only display the names. - // This can alternatively be set on a per account basis in the pconfig table. + // This can alternatively be set on a per-account basis in the pconfig table. 'groupedit_image_limit' => 400, // gserver_update_limit (Integer) - // How much servers should be checked at a time? + // How many servers should be checked at a time? 'gserver_update_limit' => 100, // hsts (Boolean) @@ -330,7 +330,7 @@ return [ 'ipv4_resolve' => false, // invitation_only (Boolean) - // If set true registration is only possible after a current member of the node has send an invitation. + // If set true registration is only possible after a current member of the node has sent an invitation. 'invitation_only' => false, // itemspage_network (Integer) @@ -343,7 +343,7 @@ return [ 'itemspage_network_mobile' => 20, // jpeg_quality (Integer) - // + // // Lower numbers save space at cost of image detail // where n is between 1 and 100, and with very poor results below about 50 'jpeg_quality' => 100, @@ -415,13 +415,13 @@ return [ // max_image_length (Integer) // An alternate way of limiting picture upload sizes. - // Specify the maximum pixel length that pictures are allowed to be (for non-square pictures, it will apply to the longest side). + // Specify the maximum pixel length that pictures are allowed to be (for non-square pictures, it will apply to the longest side). // Pictures longer than this length will be resized to be this length (on the longest side, the other side will be scaled appropriately). // If you don't want to set a maximum length, set to -1. 'max_image_length' => -1, // max_likers (Integer) - // Maximum number of "people who like (or don't like) this" that we will list by name + // Maximum number of "people who like (or don't like) this" that we will list by name 'max_likers' => 75, // max_processes_backend (Integer) @@ -471,7 +471,7 @@ return [ 'no_oembed' => false, // no_redirect_list (Array) - // List of domains where HTTP redirects should be ignored. + // List of domains where HTTP redirects should be ignored. 'no_redirect_list' => [], // no_smilies (Boolean) @@ -483,7 +483,7 @@ return [ 'paranoia' => false, // permit_crawling (Boolean) - // Restricts the search for not logged in users to one search per minute. + // Restricts the search for not logged-in users to one search per minute. 'permit_crawling' => false, // pidfile (Path) @@ -491,7 +491,7 @@ return [ 'pidfile' => '', // png_quality (Integer) - // Sets the ImageMagick compression level for PNG images. Values ranges from 0 (uncompressed) to 9 (most compressed). + // Sets the ImageMagick compression level for PNG images. Values range from 0 (uncompressed) to 9 (most compressed). 'png_quality' => 8, // profiler (Boolean) @@ -568,11 +568,11 @@ return [ 'set_creation_date' => false, // show_global_community_hint (Boolean) - // When the global community page is enabled, use this option to display a hint above the stream, that this is a collection of all public top-level postings that arrive on your node. + // When the global community page is enabled, use this option to display a hint above the stream, that this is a collection of all public top-level postings that arrive at your node. 'show_global_community_hint' => false, // show_received (Boolean) - // Show the receive data along with the post creation date + // Show the received date along with the post creation date 'show_received' => true, // show_received_seconds (Integer) @@ -609,13 +609,13 @@ return [ // username_min_length (Integer) // The minimum character length a username can be. - // This length is check once the username has been trimmed and multiple spaces have been collapsed into one. + // This length is checked once the username has been trimmed and multiple spaces have been collapsed into one. // Minimum for this config value is 1. Maximum is 64 as the resulting profile URL mustn't be longer than 255 chars. 'username_min_length' => 3, // username_max_length (Integer) // The maximum character length a username can be. - // This length is check once the username has been trimmed and multiple spaces have been collapsed into one. + // This length is checked once the username has been trimmed and multiple spaces have been collapsed into one. // Minimum for this config value is 1. Maximum is 64 as the resulting profile URL mustn't be longer than 255 chars. 'username_max_length' => 48, @@ -738,8 +738,7 @@ return [ 'config_dir' => 'view/smarty3', // use_sub_dirs (Boolean) - // By default the template cache is stored in several sub directories. - // + // By default the template cache is stored in several subdirectories. 'use_sub_dirs' => true, ], ];