diff --git a/lib/composer/composer/autoload_classmap.php b/lib/composer/composer/autoload_classmap.php index 958223bf2fc..01c8671f8ad 100644 --- a/lib/composer/composer/autoload_classmap.php +++ b/lib/composer/composer/autoload_classmap.php @@ -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', diff --git a/lib/composer/composer/autoload_static.php b/lib/composer/composer/autoload_static.php index df24fac3765..fc271f585d7 100644 --- a/lib/composer/composer/autoload_static.php +++ b/lib/composer/composer/autoload_static.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', diff --git a/lib/private/DB/Connection.php b/lib/private/DB/Connection.php index 9f0fa172f13..ccbd4633155 100644 --- a/lib/private/DB/Connection.php +++ b/lib/private/DB/Connection.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); diff --git a/lib/private/DB/ConnectionFactory.php b/lib/private/DB/ConnectionFactory.php index 2429bfdf7f8..7bada317f3d 100644 --- a/lib/private/DB/ConnectionFactory.php +++ b/lib/private/DB/ConnectionFactory.php @@ -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; } diff --git a/lib/private/DB/Middlewares/SQLiteCaseSensitiveLike.php b/lib/private/DB/Middlewares/SQLiteCaseSensitiveLike.php new file mode 100644 index 00000000000..b3605230021 --- /dev/null +++ b/lib/private/DB/Middlewares/SQLiteCaseSensitiveLike.php @@ -0,0 +1,32 @@ +exec('PRAGMA case_sensitive_like = true'); + return $connection; + } + }; + } +} diff --git a/lib/private/DB/Middlewares/SQLiteJournalMode.php b/lib/private/DB/Middlewares/SQLiteJournalMode.php new file mode 100644 index 00000000000..51a0a6fb992 --- /dev/null +++ b/lib/private/DB/Middlewares/SQLiteJournalMode.php @@ -0,0 +1,34 @@ +exec('PRAGMA journal_mode = ' . SQLiteJournalMode::$journalMode); + return $connection; + } + }; + } +} diff --git a/lib/private/DB/Middlewares/SetTransactionIsolationLevel.php b/lib/private/DB/Middlewares/SetTransactionIsolationLevel.php new file mode 100644 index 00000000000..10987ef0b91 --- /dev/null +++ b/lib/private/DB/Middlewares/SetTransactionIsolationLevel.php @@ -0,0 +1,39 @@ +isConnectedToPrimary()) { + $connection->setTransactionIsolation(\Doctrine\DBAL\TransactionIsolationLevel::READ_COMMITTED); + if ($connection->getDatabasePlatform() instanceof MySQLPlatform) { + $connection->executeStatement('SET SESSION AUTOCOMMIT=1'); + } + } + return $connection; + } + }; + } +} diff --git a/lib/private/DB/OCSqlitePlatform.php b/lib/private/DB/OCSqlitePlatform.php deleted file mode 100644 index b8bd8df5eb1..00000000000 --- a/lib/private/DB/OCSqlitePlatform.php +++ /dev/null @@ -1,11 +0,0 @@ -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]; - } -} diff --git a/lib/private/DB/SetTransactionIsolationLevel.php b/lib/private/DB/SetTransactionIsolationLevel.php deleted file mode 100644 index cd18c4255e3..00000000000 --- a/lib/private/DB/SetTransactionIsolationLevel.php +++ /dev/null @@ -1,36 +0,0 @@ -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]; - } -}