mirror of
https://github.com/nextcloud/server.git
synced 2026-06-14 19:20:35 -04:00
fix(db): Doctrine Event Manager is removed
Signed-off-by: Joas Schilling <coding@schilljs.com>
This commit is contained in:
parent
2b83016a2b
commit
55a8f33873
10 changed files with 137 additions and 119 deletions
|
|
@ -1327,6 +1327,9 @@ return array(
|
|||
'OC\\DB\\ConnectionFactory' => $baseDir . '/lib/private/DB/ConnectionFactory.php',
|
||||
'OC\\DB\\DbDataCollector' => $baseDir . '/lib/private/DB/DbDataCollector.php',
|
||||
'OC\\DB\\Exceptions\\DbalException' => $baseDir . '/lib/private/DB/Exceptions/DbalException.php',
|
||||
'OC\\DB\\Middlewares\\SQLiteCaseSensitiveLike' => $baseDir . '/lib/private/DB/Middlewares/SQLiteCaseSensitiveLike.php',
|
||||
'OC\\DB\\Middlewares\\SQLiteJournalMode' => $baseDir . '/lib/private/DB/Middlewares/SQLiteJournalMode.php',
|
||||
'OC\\DB\\Middlewares\\SetTransactionIsolationLevel' => $baseDir . '/lib/private/DB/Middlewares/SetTransactionIsolationLevel.php',
|
||||
'OC\\DB\\MigrationException' => $baseDir . '/lib/private/DB/MigrationException.php',
|
||||
'OC\\DB\\MigrationService' => $baseDir . '/lib/private/DB/MigrationService.php',
|
||||
'OC\\DB\\Migrator' => $baseDir . '/lib/private/DB/Migrator.php',
|
||||
|
|
@ -1335,7 +1338,6 @@ return array(
|
|||
'OC\\DB\\MissingIndexInformation' => $baseDir . '/lib/private/DB/MissingIndexInformation.php',
|
||||
'OC\\DB\\MissingPrimaryKeyInformation' => $baseDir . '/lib/private/DB/MissingPrimaryKeyInformation.php',
|
||||
'OC\\DB\\MySqlTools' => $baseDir . '/lib/private/DB/MySqlTools.php',
|
||||
'OC\\DB\\OCSqlitePlatform' => $baseDir . '/lib/private/DB/OCSqlitePlatform.php',
|
||||
'OC\\DB\\ObjectParameter' => $baseDir . '/lib/private/DB/ObjectParameter.php',
|
||||
'OC\\DB\\OracleConnection' => $baseDir . '/lib/private/DB/OracleConnection.php',
|
||||
'OC\\DB\\OracleMigrator' => $baseDir . '/lib/private/DB/OracleMigrator.php',
|
||||
|
|
@ -1358,9 +1360,7 @@ return array(
|
|||
'OC\\DB\\QueryBuilder\\QuoteHelper' => $baseDir . '/lib/private/DB/QueryBuilder/QuoteHelper.php',
|
||||
'OC\\DB\\ResultAdapter' => $baseDir . '/lib/private/DB/ResultAdapter.php',
|
||||
'OC\\DB\\SQLiteMigrator' => $baseDir . '/lib/private/DB/SQLiteMigrator.php',
|
||||
'OC\\DB\\SQLiteSessionInit' => $baseDir . '/lib/private/DB/SQLiteSessionInit.php',
|
||||
'OC\\DB\\SchemaWrapper' => $baseDir . '/lib/private/DB/SchemaWrapper.php',
|
||||
'OC\\DB\\SetTransactionIsolationLevel' => $baseDir . '/lib/private/DB/SetTransactionIsolationLevel.php',
|
||||
'OC\\Dashboard\\Manager' => $baseDir . '/lib/private/Dashboard/Manager.php',
|
||||
'OC\\DatabaseException' => $baseDir . '/lib/private/DatabaseException.php',
|
||||
'OC\\DatabaseSetupException' => $baseDir . '/lib/private/DatabaseSetupException.php',
|
||||
|
|
|
|||
|
|
@ -1360,6 +1360,9 @@ class ComposerStaticInit749170dad3f5e7f9ca158f5a9f04f6a2
|
|||
'OC\\DB\\ConnectionFactory' => __DIR__ . '/../../..' . '/lib/private/DB/ConnectionFactory.php',
|
||||
'OC\\DB\\DbDataCollector' => __DIR__ . '/../../..' . '/lib/private/DB/DbDataCollector.php',
|
||||
'OC\\DB\\Exceptions\\DbalException' => __DIR__ . '/../../..' . '/lib/private/DB/Exceptions/DbalException.php',
|
||||
'OC\\DB\\Middlewares\\SQLiteCaseSensitiveLike' => __DIR__ . '/../../..' . '/lib/private/DB/Middlewares/SQLiteCaseSensitiveLike.php',
|
||||
'OC\\DB\\Middlewares\\SQLiteJournalMode' => __DIR__ . '/../../..' . '/lib/private/DB/Middlewares/SQLiteJournalMode.php',
|
||||
'OC\\DB\\Middlewares\\SetTransactionIsolationLevel' => __DIR__ . '/../../..' . '/lib/private/DB/Middlewares/SetTransactionIsolationLevel.php',
|
||||
'OC\\DB\\MigrationException' => __DIR__ . '/../../..' . '/lib/private/DB/MigrationException.php',
|
||||
'OC\\DB\\MigrationService' => __DIR__ . '/../../..' . '/lib/private/DB/MigrationService.php',
|
||||
'OC\\DB\\Migrator' => __DIR__ . '/../../..' . '/lib/private/DB/Migrator.php',
|
||||
|
|
@ -1368,7 +1371,6 @@ class ComposerStaticInit749170dad3f5e7f9ca158f5a9f04f6a2
|
|||
'OC\\DB\\MissingIndexInformation' => __DIR__ . '/../../..' . '/lib/private/DB/MissingIndexInformation.php',
|
||||
'OC\\DB\\MissingPrimaryKeyInformation' => __DIR__ . '/../../..' . '/lib/private/DB/MissingPrimaryKeyInformation.php',
|
||||
'OC\\DB\\MySqlTools' => __DIR__ . '/../../..' . '/lib/private/DB/MySqlTools.php',
|
||||
'OC\\DB\\OCSqlitePlatform' => __DIR__ . '/../../..' . '/lib/private/DB/OCSqlitePlatform.php',
|
||||
'OC\\DB\\ObjectParameter' => __DIR__ . '/../../..' . '/lib/private/DB/ObjectParameter.php',
|
||||
'OC\\DB\\OracleConnection' => __DIR__ . '/../../..' . '/lib/private/DB/OracleConnection.php',
|
||||
'OC\\DB\\OracleMigrator' => __DIR__ . '/../../..' . '/lib/private/DB/OracleMigrator.php',
|
||||
|
|
@ -1391,9 +1393,7 @@ class ComposerStaticInit749170dad3f5e7f9ca158f5a9f04f6a2
|
|||
'OC\\DB\\QueryBuilder\\QuoteHelper' => __DIR__ . '/../../..' . '/lib/private/DB/QueryBuilder/QuoteHelper.php',
|
||||
'OC\\DB\\ResultAdapter' => __DIR__ . '/../../..' . '/lib/private/DB/ResultAdapter.php',
|
||||
'OC\\DB\\SQLiteMigrator' => __DIR__ . '/../../..' . '/lib/private/DB/SQLiteMigrator.php',
|
||||
'OC\\DB\\SQLiteSessionInit' => __DIR__ . '/../../..' . '/lib/private/DB/SQLiteSessionInit.php',
|
||||
'OC\\DB\\SchemaWrapper' => __DIR__ . '/../../..' . '/lib/private/DB/SchemaWrapper.php',
|
||||
'OC\\DB\\SetTransactionIsolationLevel' => __DIR__ . '/../../..' . '/lib/private/DB/SetTransactionIsolationLevel.php',
|
||||
'OC\\Dashboard\\Manager' => __DIR__ . '/../../..' . '/lib/private/Dashboard/Manager.php',
|
||||
'OC\\DatabaseException' => __DIR__ . '/../../..' . '/lib/private/DatabaseException.php',
|
||||
'OC\\DatabaseSetupException' => __DIR__ . '/../../..' . '/lib/private/DatabaseSetupException.php',
|
||||
|
|
|
|||
|
|
@ -8,7 +8,6 @@ declare(strict_types=1);
|
|||
*/
|
||||
namespace OC\DB;
|
||||
|
||||
use Doctrine\Common\EventManager;
|
||||
use Doctrine\DBAL\Cache\QueryCacheProfile;
|
||||
use Doctrine\DBAL\Configuration;
|
||||
use Doctrine\DBAL\ConnectionException;
|
||||
|
|
@ -79,7 +78,6 @@ class Connection extends PrimaryReadReplicaConnection {
|
|||
private array $params,
|
||||
Driver $driver,
|
||||
?Configuration $config = null,
|
||||
?EventManager $eventManager = null
|
||||
) {
|
||||
if (!isset($params['adapter'])) {
|
||||
throw new \Exception('adapter not set');
|
||||
|
|
@ -90,7 +88,7 @@ class Connection extends PrimaryReadReplicaConnection {
|
|||
/**
|
||||
* @psalm-suppress InternalMethod
|
||||
*/
|
||||
parent::__construct($params, $driver, $config, $eventManager);
|
||||
parent::__construct($params, $driver, $config);
|
||||
$this->adapter = new $params['adapter']($this);
|
||||
$this->tablePrefix = $params['tablePrefix'];
|
||||
|
||||
|
|
@ -108,7 +106,7 @@ class Connection extends PrimaryReadReplicaConnection {
|
|||
$profiler->add($this->dbDataCollector);
|
||||
$debugStack = new BacktraceDebugStack();
|
||||
$this->dbDataCollector->setDebugStack($debugStack);
|
||||
$this->_config->setSQLLogger($debugStack);
|
||||
// FIXME $this->_config->setSQLLogger($debugStack);
|
||||
}
|
||||
|
||||
$this->setNestTransactionsWithSavepoints(true);
|
||||
|
|
|
|||
|
|
@ -7,10 +7,11 @@
|
|||
*/
|
||||
namespace OC\DB;
|
||||
|
||||
use Doctrine\Common\EventManager;
|
||||
use Doctrine\DBAL\Configuration;
|
||||
use Doctrine\DBAL\DriverManager;
|
||||
use Doctrine\DBAL\Event\Listeners\OracleSessionInit;
|
||||
use OC\DB\Middlewares\SetTransactionIsolationLevel;
|
||||
use OC\DB\Middlewares\SQLiteCaseSensitiveLike;
|
||||
use OC\DB\Middlewares\SQLiteJournalMode;
|
||||
use OC\SystemConfig;
|
||||
|
||||
/**
|
||||
|
|
@ -103,9 +104,12 @@ class ConnectionFactory {
|
|||
*/
|
||||
public function getConnection($type, $additionalConnectionParams) {
|
||||
$normalizedType = $this->normalizeType($type);
|
||||
// FIXME $eventManager = new EventManager();
|
||||
// FIXME $eventManager->addEventSubscriber(new SetTransactionIsolationLevel());
|
||||
$additionalConnectionParams = array_merge($this->createConnectionParams(), $additionalConnectionParams);
|
||||
|
||||
$doctrineConfiguration = new Configuration();
|
||||
$doctrineMiddlewares = $doctrineConfiguration->getMiddlewares();
|
||||
$doctrineMiddlewares[] = new SetTransactionIsolationLevel();
|
||||
|
||||
switch ($normalizedType) {
|
||||
case 'pgsql':
|
||||
// pg_connect used by Doctrine DBAL does not support URI notation (enclosed in brackets)
|
||||
|
|
@ -117,7 +121,8 @@ class ConnectionFactory {
|
|||
break;
|
||||
|
||||
case 'oci':
|
||||
// FIXME $eventManager->addEventSubscriber(new OracleSessionInit);
|
||||
$doctrineMiddlewares[] = new \Doctrine\DBAL\Driver\OCI8\Middleware\InitializeSession();
|
||||
|
||||
// the driverOptions are unused in dbal and need to be mapped to the parameters
|
||||
if (isset($additionalConnectionParams['driverOptions'])) {
|
||||
$additionalConnectionParams = array_merge($additionalConnectionParams, $additionalConnectionParams['driverOptions']);
|
||||
|
|
@ -137,16 +142,26 @@ class ConnectionFactory {
|
|||
|
||||
case 'sqlite3':
|
||||
$journalMode = $additionalConnectionParams['sqlite.journal_mode'];
|
||||
$additionalConnectionParams['platform'] = new OCSqlitePlatform();
|
||||
// FIXME $eventManager->addEventSubscriber(new SQLiteSessionInit(true, $journalMode));
|
||||
$doctrineMiddlewares[] = new \Doctrine\DBAL\Driver\AbstractSQLiteDriver\Middleware\EnableForeignKeys();
|
||||
$doctrineMiddlewares[] = new SQLiteCaseSensitiveLike();
|
||||
SQLiteJournalMode::$journalMode = $additionalConnectionParams['sqlite.journal_mode'];
|
||||
$doctrineMiddlewares[] = new SQLiteJournalMode();
|
||||
break;
|
||||
}
|
||||
|
||||
$doctrineConfiguration->setMiddlewares($doctrineMiddlewares);
|
||||
|
||||
/** @var Connection $connection */
|
||||
$connection = DriverManager::getConnection(
|
||||
$additionalConnectionParams,
|
||||
new Configuration(),
|
||||
// FIXME $eventManager
|
||||
$doctrineConfiguration,
|
||||
);
|
||||
|
||||
if ($normalizedType === 'sqlite3') {
|
||||
$pdo = $connection->getNativeConnection();
|
||||
$pdo->sqliteCreateFunction('md5', 'md5', 1);
|
||||
}
|
||||
|
||||
return $connection;
|
||||
}
|
||||
|
||||
|
|
|
|||
32
lib/private/DB/Middlewares/SQLiteCaseSensitiveLike.php
Normal file
32
lib/private/DB/Middlewares/SQLiteCaseSensitiveLike.php
Normal file
|
|
@ -0,0 +1,32 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
/**
|
||||
* SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
|
||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
*/
|
||||
|
||||
namespace OC\DB\Middlewares;
|
||||
|
||||
use Doctrine\DBAL\Driver;
|
||||
use Doctrine\DBAL\Driver\Connection;
|
||||
use Doctrine\DBAL\Driver\Middleware;
|
||||
use Doctrine\DBAL\Driver\Middleware\AbstractDriverMiddleware;
|
||||
|
||||
final class SQLiteCaseSensitiveLike implements Middleware {
|
||||
public function wrap(Driver $driver): Driver {
|
||||
return new class($driver) extends AbstractDriverMiddleware {
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function connect(
|
||||
#[\SensitiveParameter]
|
||||
array $params,
|
||||
): Connection {
|
||||
$connection = parent::connect($params);
|
||||
$connection->exec('PRAGMA case_sensitive_like = true');
|
||||
return $connection;
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
34
lib/private/DB/Middlewares/SQLiteJournalMode.php
Normal file
34
lib/private/DB/Middlewares/SQLiteJournalMode.php
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
/**
|
||||
* SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
|
||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
*/
|
||||
|
||||
namespace OC\DB\Middlewares;
|
||||
|
||||
use Doctrine\DBAL\Driver;
|
||||
use Doctrine\DBAL\Driver\Connection;
|
||||
use Doctrine\DBAL\Driver\Middleware;
|
||||
use Doctrine\DBAL\Driver\Middleware\AbstractDriverMiddleware;
|
||||
|
||||
class SQLiteJournalMode implements Middleware {
|
||||
public static string $journalMode = 'WAL';
|
||||
|
||||
public function wrap(Driver $driver): Driver {
|
||||
return new class($driver) extends AbstractDriverMiddleware {
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function connect(
|
||||
#[\SensitiveParameter]
|
||||
array $params,
|
||||
): Connection {
|
||||
$connection = parent::connect($params);
|
||||
$connection->exec('PRAGMA journal_mode = ' . SQLiteJournalMode::$journalMode);
|
||||
return $connection;
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
39
lib/private/DB/Middlewares/SetTransactionIsolationLevel.php
Normal file
39
lib/private/DB/Middlewares/SetTransactionIsolationLevel.php
Normal file
|
|
@ -0,0 +1,39 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
/**
|
||||
* SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
|
||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
*/
|
||||
|
||||
namespace OC\DB\Middlewares;
|
||||
|
||||
use Doctrine\DBAL\Connections\PrimaryReadReplicaConnection;
|
||||
use Doctrine\DBAL\Driver;
|
||||
use Doctrine\DBAL\Driver\Connection;
|
||||
use Doctrine\DBAL\Driver\Middleware;
|
||||
use Doctrine\DBAL\Driver\Middleware\AbstractDriverMiddleware;
|
||||
use Doctrine\DBAL\Platforms\MySQLPlatform;
|
||||
|
||||
final class SetTransactionIsolationLevel implements Middleware {
|
||||
public function wrap(Driver $driver): Driver {
|
||||
return new class($driver) extends AbstractDriverMiddleware {
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function connect(
|
||||
#[\SensitiveParameter]
|
||||
array $params,
|
||||
): Connection {
|
||||
$connection = parent::connect($params);
|
||||
if ($connection instanceof PrimaryReadReplicaConnection && $connection->isConnectedToPrimary()) {
|
||||
$connection->setTransactionIsolation(\Doctrine\DBAL\TransactionIsolationLevel::READ_COMMITTED);
|
||||
if ($connection->getDatabasePlatform() instanceof MySQLPlatform) {
|
||||
$connection->executeStatement('SET SESSION AUTOCOMMIT=1');
|
||||
}
|
||||
}
|
||||
return $connection;
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
|
@ -1,11 +0,0 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors
|
||||
* SPDX-FileCopyrightText: 2016 ownCloud, Inc.
|
||||
* SPDX-License-Identifier: AGPL-3.0-only
|
||||
*/
|
||||
namespace OC\DB;
|
||||
|
||||
class OCSqlitePlatform extends \Doctrine\DBAL\Platforms\SQLitePlatform {
|
||||
}
|
||||
|
|
@ -1,53 +0,0 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors
|
||||
* SPDX-FileCopyrightText: 2016 ownCloud, Inc.
|
||||
* SPDX-License-Identifier: AGPL-3.0-only
|
||||
*/
|
||||
namespace OC\DB;
|
||||
|
||||
use Doctrine\Common\EventSubscriber;
|
||||
use Doctrine\DBAL\Event\ConnectionEventArgs;
|
||||
use Doctrine\DBAL\Events;
|
||||
|
||||
class SQLiteSessionInit implements EventSubscriber {
|
||||
/**
|
||||
* @var bool
|
||||
*/
|
||||
private $caseSensitiveLike;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $journalMode;
|
||||
|
||||
/**
|
||||
* Configure case sensitive like for each connection
|
||||
*
|
||||
* @param bool $caseSensitiveLike
|
||||
* @param string $journalMode
|
||||
*/
|
||||
public function __construct($caseSensitiveLike, $journalMode) {
|
||||
$this->caseSensitiveLike = $caseSensitiveLike;
|
||||
$this->journalMode = $journalMode;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param ConnectionEventArgs $args
|
||||
* @return void
|
||||
*/
|
||||
public function postConnect(ConnectionEventArgs $args) {
|
||||
$sensitive = $this->caseSensitiveLike ? 'true' : 'false';
|
||||
$args->getConnection()->executeUpdate('PRAGMA case_sensitive_like = ' . $sensitive);
|
||||
$args->getConnection()->executeUpdate('PRAGMA journal_mode = ' . $this->journalMode);
|
||||
/** @var \Doctrine\DBAL\Driver\PDO\Connection $connection */
|
||||
$connection = $args->getConnection()->getWrappedConnection();
|
||||
$pdo = $connection->getWrappedConnection();
|
||||
$pdo->sqliteCreateFunction('md5', 'md5', 1);
|
||||
}
|
||||
|
||||
public function getSubscribedEvents() {
|
||||
return [Events::postConnect];
|
||||
}
|
||||
}
|
||||
|
|
@ -1,36 +0,0 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
/**
|
||||
* SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors
|
||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
*/
|
||||
namespace OC\DB;
|
||||
|
||||
use Doctrine\Common\EventSubscriber;
|
||||
use Doctrine\DBAL\Connections\PrimaryReadReplicaConnection;
|
||||
use Doctrine\DBAL\Event\ConnectionEventArgs;
|
||||
use Doctrine\DBAL\Events;
|
||||
use Doctrine\DBAL\Platforms\MySQLPlatform;
|
||||
use Doctrine\DBAL\TransactionIsolationLevel;
|
||||
|
||||
class SetTransactionIsolationLevel implements EventSubscriber {
|
||||
/**
|
||||
* @param ConnectionEventArgs $args
|
||||
* @return void
|
||||
*/
|
||||
public function postConnect(ConnectionEventArgs $args) {
|
||||
$connection = $args->getConnection();
|
||||
if ($connection instanceof PrimaryReadReplicaConnection && $connection->isConnectedToPrimary()) {
|
||||
$connection->setTransactionIsolation(TransactionIsolationLevel::READ_COMMITTED);
|
||||
if ($connection->getDatabasePlatform() instanceof MySQLPlatform) {
|
||||
$connection->executeStatement('SET SESSION AUTOCOMMIT=1');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function getSubscribedEvents() {
|
||||
return [Events::postConnect];
|
||||
}
|
||||
}
|
||||
Loading…
Reference in a new issue