Merge pull request #8649 from annando/annando/issue8550

Issue 8550: New experimental database configurations
This commit is contained in:
Hypolite Petovan 2020-05-17 09:11:30 -04:00 committed by GitHub
commit 90b1355555
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 23 additions and 5 deletions

View File

@ -135,8 +135,9 @@ class Database
} }
$this->emulate_prepares = (bool)$this->configCache->get('database', 'emulate_prepares'); $this->emulate_prepares = (bool)$this->configCache->get('database', 'emulate_prepares');
$this->pdo_emulate_prepares = (bool)$this->configCache->get('database', 'pdo_emulate_prepares');
if (class_exists('\PDO') && in_array('mysql', PDO::getAvailableDrivers())) { if (!$this->configCache->get('database', 'disable_pdo') && class_exists('\PDO') && in_array('mysql', PDO::getAvailableDrivers())) {
$this->driver = 'pdo'; $this->driver = 'pdo';
$connect = "mysql:host=" . $server . ";dbname=" . $db; $connect = "mysql:host=" . $server . ";dbname=" . $db;
@ -150,7 +151,7 @@ class Database
try { try {
$this->connection = @new PDO($connect, $user, $pass); $this->connection = @new PDO($connect, $user, $pass);
$this->connection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); $this->connection->setAttribute(PDO::ATTR_EMULATE_PREPARES, $this->pdo_emulate_prepares);
$this->connected = true; $this->connected = true;
} catch (PDOException $e) { } catch (PDOException $e) {
$this->connected = false; $this->connected = false;
@ -1046,7 +1047,7 @@ class Database
$success = $this->e("LOCK TABLES " . DBA::buildTableString($table) . " WRITE"); $success = $this->e("LOCK TABLES " . DBA::buildTableString($table) . " WRITE");
if ($this->driver == 'pdo') { if ($this->driver == 'pdo') {
$this->connection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); $this->connection->setAttribute(PDO::ATTR_EMULATE_PREPARES, $this->pdo_emulate_prepares);
} }
if (!$success) { if (!$success) {
@ -1079,7 +1080,7 @@ class Database
$success = $this->e("UNLOCK TABLES"); $success = $this->e("UNLOCK TABLES");
if ($this->driver == 'pdo') { if ($this->driver == 'pdo') {
$this->connection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); $this->connection->setAttribute(PDO::ATTR_EMULATE_PREPARES, $this->pdo_emulate_prepares);
$this->e("SET autocommit=1"); $this->e("SET autocommit=1");
} else { } else {
$this->connection->autocommit(true); $this->connection->autocommit(true);

View File

@ -45,8 +45,23 @@ return [
'database' => '', 'database' => '',
// charset (String) // charset (String)
// Database connexion charset. Changing this value will likely corrupt special characters. // Database connection charset. Changing this value will likely corrupt special characters.
'charset' => 'utf8mb4', 'charset' => 'utf8mb4',
// emulate_prepares (Boolean) (Experimental)
// If enabled, prepared statements will be emulated.
// In combination with MySQLi this will cast all return values to strings.
'emulate_prepares' => false,
// pdo_emulate_prepares (Boolean) (Experimental)
// If enabled, the builtin emulation for prepared statements is used.
// Due to limitations of that emulation (all return values are casted as strings)
// this will most likely cause issues and should not be used on production systems.
'pdo_emulate_prepares' => false,
// disable_pdo (Boolean)
// PDO is used by default (if available). Otherwise MySQLi will be used.
'disable_pdo' => false,
], ],
'config' => [ 'config' => [
// admin_email (Comma-separated list) // admin_email (Comma-separated list)

View File

@ -56,6 +56,8 @@ class StaticDatabase extends Database
$this->driver = 'pdo'; $this->driver = 'pdo';
$this->connection = self::$staticConnection; $this->connection = self::$staticConnection;
$this->connected = true; $this->connected = true;
$this->emulate_prepares = false;
$this->pdo_emulate_prepares = false;
return $this->connected; return $this->connected;
} }