aboutsummaryrefslogtreecommitdiffstats
path: root/lib/private/DB/Connection.php
diff options
context:
space:
mode:
Diffstat (limited to 'lib/private/DB/Connection.php')
-rw-r--r--lib/private/DB/Connection.php55
1 files changed, 40 insertions, 15 deletions
diff --git a/lib/private/DB/Connection.php b/lib/private/DB/Connection.php
index 1b61cc83319..f86cbc341a4 100644
--- a/lib/private/DB/Connection.php
+++ b/lib/private/DB/Connection.php
@@ -16,6 +16,7 @@ use Doctrine\DBAL\Driver;
use Doctrine\DBAL\Driver\ServerInfoAwareConnection;
use Doctrine\DBAL\Exception;
use Doctrine\DBAL\Exception\ConnectionLost;
+use Doctrine\DBAL\Platforms\MariaDBPlatform;
use Doctrine\DBAL\Platforms\MySQLPlatform;
use Doctrine\DBAL\Platforms\OraclePlatform;
use Doctrine\DBAL\Platforms\PostgreSQLPlatform;
@@ -160,7 +161,7 @@ class Connection extends PrimaryReadReplicaConnection {
$this->_config->setSQLLogger($debugStack);
}
- /** @var array<string, array{shards: array[], mapper: ?string}> $shardConfig */
+ /** @var array<string, array{shards: array[], mapper: ?string, from_primary_key: ?int, from_shard_key: ?int}> $shardConfig */
$shardConfig = $this->params['sharding'] ?? [];
$shardNames = array_keys($shardConfig);
$this->shards = array_map(function (array $config, string $name) {
@@ -180,7 +181,9 @@ class Connection extends PrimaryReadReplicaConnection {
self::SHARD_PRESETS[$name]['shard_key'],
$shardMapper,
self::SHARD_PRESETS[$name]['companion_tables'],
- $config['shards']
+ $config['shards'],
+ $config['from_primary_key'] ?? 0,
+ $config['from_shard_key'] ?? 0,
);
}, $shardConfig, $shardNames);
$this->shards = array_combine($shardNames, $this->shards);
@@ -199,8 +202,10 @@ class Connection extends PrimaryReadReplicaConnection {
if ($this->isShardingEnabled) {
foreach ($this->shards as $shardDefinition) {
foreach ($shardDefinition->getAllShards() as $shard) {
- /** @var ConnectionAdapter $connection */
- $connections[] = $this->shardConnectionManager->getConnection($shardDefinition, $shard);
+ if ($shard !== ShardDefinition::MIGRATION_SHARD) {
+ /** @var ConnectionAdapter $connection */
+ $connections[] = $this->shardConnectionManager->getConnection($shardDefinition, $shard);
+ }
}
}
}
@@ -218,8 +223,6 @@ class Connection extends PrimaryReadReplicaConnection {
return parent::connect();
}
- $this->lastConnectionCheck[$this->getConnectionName()] = time();
-
// Only trigger the event logger for the initial connect call
$eventLogger = Server::get(IEventLogger::class);
$eventLogger->start('connect:db', 'db connection opened');
@@ -227,6 +230,8 @@ class Connection extends PrimaryReadReplicaConnection {
$status = parent::connect();
$eventLogger->end('connect:db');
+ $this->lastConnectionCheck[$this->getConnectionName()] = time();
+
return $status;
} catch (Exception $e) {
// throw a new exception to prevent leaking info from the stacktrace
@@ -410,7 +415,7 @@ class Connection extends PrimaryReadReplicaConnection {
$sql = $this->finishQuery($sql);
$this->queriesExecuted++;
- $this->logQueryToFile($sql);
+ $this->logQueryToFile($sql, $params);
try {
return parent::executeQuery($sql, $params, $types, $qcp);
} catch (\Exception $e) {
@@ -457,7 +462,7 @@ class Connection extends PrimaryReadReplicaConnection {
}
$sql = $this->finishQuery($sql);
$this->queriesExecuted++;
- $this->logQueryToFile($sql);
+ $this->logQueryToFile($sql, $params);
try {
return (int)parent::executeStatement($sql, $params, $types);
} catch (\Exception $e) {
@@ -466,14 +471,19 @@ class Connection extends PrimaryReadReplicaConnection {
}
}
- protected function logQueryToFile(string $sql): void {
+ protected function logQueryToFile(string $sql, array $params): void {
$logFile = $this->systemConfig->getValue('query_log_file');
if ($logFile !== '' && is_writable(dirname($logFile)) && (!file_exists($logFile) || is_writable($logFile))) {
$prefix = '';
if ($this->systemConfig->getValue('query_log_file_requestid') === 'yes') {
$prefix .= Server::get(IRequestId::class)->getId() . "\t";
}
+
$postfix = '';
+ if ($this->systemConfig->getValue('query_log_file_parameters') === 'yes') {
+ $postfix .= '; ' . json_encode($params);
+ }
+
if ($this->systemConfig->getValue('query_log_file_backtrace') === 'yes') {
$trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS);
array_pop($trace);
@@ -695,6 +705,19 @@ class Connection extends PrimaryReadReplicaConnection {
}
/**
+ * Truncate a table data if it exists
+ *
+ * @param string $table table name without the prefix
+ * @param bool $cascade whether to truncate cascading
+ *
+ * @throws Exception
+ */
+ public function truncateTable(string $table, bool $cascade) {
+ $this->executeStatement($this->getDatabasePlatform()
+ ->getTruncateTableSQL($this->tablePrefix . trim($table), $cascade));
+ }
+
+ /**
* Check if a table exists
*
* @param string $table table name without the prefix
@@ -872,9 +895,9 @@ class Connection extends PrimaryReadReplicaConnection {
private function reconnectIfNeeded(): void {
if (
- !isset($this->lastConnectionCheck[$this->getConnectionName()]) ||
- time() <= $this->lastConnectionCheck[$this->getConnectionName()] + 30 ||
- $this->isTransactionActive()
+ !isset($this->lastConnectionCheck[$this->getConnectionName()])
+ || time() <= $this->lastConnectionCheck[$this->getConnectionName()] + 30
+ || $this->isTransactionActive()
) {
return;
}
@@ -893,11 +916,13 @@ class Connection extends PrimaryReadReplicaConnection {
}
/**
- * @return IDBConnection::PLATFORM_MYSQL|IDBConnection::PLATFORM_ORACLE|IDBConnection::PLATFORM_POSTGRES|IDBConnection::PLATFORM_SQLITE
+ * @return IDBConnection::PLATFORM_MYSQL|IDBConnection::PLATFORM_ORACLE|IDBConnection::PLATFORM_POSTGRES|IDBConnection::PLATFORM_SQLITE|IDBConnection::PLATFORM_MARIADB
*/
- public function getDatabaseProvider(): string {
+ public function getDatabaseProvider(bool $strict = false): string {
$platform = $this->getDatabasePlatform();
- if ($platform instanceof MySQLPlatform) {
+ if ($strict && $platform instanceof MariaDBPlatform) {
+ return IDBConnection::PLATFORM_MARIADB;
+ } elseif ($platform instanceof MySQLPlatform) {
return IDBConnection::PLATFORM_MYSQL;
} elseif ($platform instanceof OraclePlatform) {
return IDBConnection::PLATFORM_ORACLE;