From 9a642467783f03562389a07f3c2566f686bcff6f Mon Sep 17 00:00:00 2001 From: Matthias Pigulla Date: Mon, 16 Mar 2026 08:50:49 +0100 Subject: [PATCH 1/5] Add Doctrine DBAL 4 compatibility --- composer.json | 2 +- composer.lock | 2 +- src/Webfactory/Slimdump/Database/Dumper.php | 2 +- src/Webfactory/Slimdump/DumpTask.php | 3 ++- src/Webfactory/Slimdump/SlimdumpCommand.php | 20 ++++++++++++++++++-- 5 files changed, 23 insertions(+), 6 deletions(-) diff --git a/composer.json b/composer.json index 57b91d7..3e444ab 100644 --- a/composer.json +++ b/composer.json @@ -19,7 +19,7 @@ "ext-SimpleXML": "*", "ext-libxml": "*", "ext-pdo": "*", - "doctrine/dbal": "^2.13 || ^3.0", + "doctrine/dbal": "^3.3 || ^4.0", "doctrine/event-manager": "^1.0 || ^2.0", "fakerphp/faker": "^1.14", "symfony/console": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0", diff --git a/composer.lock b/composer.lock index 6653f33..54dc3fd 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "4cf5759aa590c81b6a6506738f148a3d", + "content-hash": "ad6a3db8527ee1b99c37da1364c3180b", "packages": [ { "name": "doctrine/dbal", diff --git a/src/Webfactory/Slimdump/Database/Dumper.php b/src/Webfactory/Slimdump/Database/Dumper.php index 1c92895..e3365cf 100644 --- a/src/Webfactory/Slimdump/Database/Dumper.php +++ b/src/Webfactory/Slimdump/Database/Dumper.php @@ -126,7 +126,7 @@ private function dumpData(Schema\Table $asset, Table $tableConfig): void $progress->setRedrawFrequency((int) max($numRows / 100, 1)); $progress->start(); - $wrappedConnection = $this->connection->getWrappedConnection(); + $wrappedConnection = $this->connection->getNativeConnection(); if ($wrappedConnection instanceof PDO) { $pdo = $wrappedConnection; } elseif ($wrappedConnection instanceof \Doctrine\DBAL\Driver\PDO\Connection) { diff --git a/src/Webfactory/Slimdump/DumpTask.php b/src/Webfactory/Slimdump/DumpTask.php index b5f1858..c7c954e 100644 --- a/src/Webfactory/Slimdump/DumpTask.php +++ b/src/Webfactory/Slimdump/DumpTask.php @@ -3,6 +3,7 @@ namespace Webfactory\Slimdump; use Doctrine\DBAL\Connection; +use Doctrine\DBAL\Platforms\AbstractPlatform; use Symfony\Component\Console\Output\OutputInterface; use Webfactory\Slimdump\Config\Config; use Webfactory\Slimdump\Database\Dumper; @@ -45,7 +46,7 @@ public function dump() $db = $this->connection; - $manager = $db->getSchemaManager(); + $manager = $db->createSchemaManager(); foreach (array_merge($manager->listTables(), $manager->listViews()) as $asset) { $tableConfig = $this->config->findTable($asset->getName()); diff --git a/src/Webfactory/Slimdump/SlimdumpCommand.php b/src/Webfactory/Slimdump/SlimdumpCommand.php index e9ae626..7646962 100644 --- a/src/Webfactory/Slimdump/SlimdumpCommand.php +++ b/src/Webfactory/Slimdump/SlimdumpCommand.php @@ -5,6 +5,7 @@ use Doctrine\DBAL\Connection; use Doctrine\DBAL\Driver\PDO\MySQL\Driver as PDOMySqlDriver; use Doctrine\DBAL\DriverManager; +use Doctrine\DBAL\Tools\DsnParser; use RuntimeException; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputArgument; @@ -69,7 +70,14 @@ protected function execute(InputInterface $input, OutputInterface $output): int $progressOutput = $this->createProgressOutput($input, $output); $connection = $this->createConnection($input); - $connection->getEventManager()->addEventSubscriber(new DummyTypeRegistrationEventSubscriber($connection->getSchemaManager())); + + // In DBAL 3, the SchemaManager parses DC2Type column comments and throws when encountering + // unknown types. We register a DummyType for any unknown type to work around this. + // In DBAL 4, the DC2Type comment mechanism was removed entirely, so this is no longer needed. + if (class_exists(\Doctrine\DBAL\Events::class)) { + $connection->getEventManager()->addEventSubscriber(new DummyTypeRegistrationEventSubscriber($connection->createSchemaManager())); + } + $this->setMaxExecutionTimeUnlimited($connection, $progressOutput); $config = ConfigBuilder::createConfigurationFromConsecutiveFiles($input->getArgument('config')); @@ -146,8 +154,16 @@ private function createConnection(InputInterface $input): Connection } $mysqliIndependentDsn = preg_replace('_^mysqli:_', 'mysql:', $dsn); + + if (class_exists(DsnParser::class)) { + // DBAL 4: the 'url' connection parameter was removed in favour of DsnParser + $params = (new DsnParser(['mysql' => 'pdo_mysql']))->parse($mysqliIndependentDsn); + } else { + $params = ['url' => $mysqliIndependentDsn]; + } + $connection = DriverManager::getConnection( - ['url' => $mysqliIndependentDsn, 'charset' => 'utf8', 'driverClass' => PDOMySqlDriver::class] + array_merge($params, ['charset' => 'utf8', 'driverClass' => PDOMySqlDriver::class]) ); return $connection; From 922f707337cd84259c29d1f87da65777906b4e9b Mon Sep 17 00:00:00 2001 From: Matthias Pigulla Date: Mon, 16 Mar 2026 08:58:05 +0100 Subject: [PATCH 2/5] Avoid Composer-Require-Checker tripping over the ::class reference --- src/Webfactory/Slimdump/SlimdumpCommand.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Webfactory/Slimdump/SlimdumpCommand.php b/src/Webfactory/Slimdump/SlimdumpCommand.php index 7646962..c717661 100644 --- a/src/Webfactory/Slimdump/SlimdumpCommand.php +++ b/src/Webfactory/Slimdump/SlimdumpCommand.php @@ -74,7 +74,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int // In DBAL 3, the SchemaManager parses DC2Type column comments and throws when encountering // unknown types. We register a DummyType for any unknown type to work around this. // In DBAL 4, the DC2Type comment mechanism was removed entirely, so this is no longer needed. - if (class_exists(\Doctrine\DBAL\Events::class)) { + if (class_exists('\Doctrine\DBAL\Events')) { $connection->getEventManager()->addEventSubscriber(new DummyTypeRegistrationEventSubscriber($connection->createSchemaManager())); } From 080d6b51ddaaf997648bcc4fee1842cf6937b0cc Mon Sep 17 00:00:00 2001 From: Matthias Pigulla Date: Mon, 16 Mar 2026 09:00:36 +0100 Subject: [PATCH 3/5] Update Composer-Require-Checker to a more recent version --- .github/workflows/dependencies.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/dependencies.yml b/.github/workflows/dependencies.yml index 4b10b26..f7f71f3 100644 --- a/.github/workflows/dependencies.yml +++ b/.github/workflows/dependencies.yml @@ -33,4 +33,4 @@ jobs: composer update --no-interaction --no-scripts --no-progress composer show - name: ComposerRequireChecker - uses: docker://ghcr.io/webfactory/composer-require-checker:4.8.0 + uses: docker://ghcr.io/webfactory/composer-require-checker:4.18.0 From 91211d3b363d9f2e277d812e1bc4e54696827c15 Mon Sep 17 00:00:00 2001 From: Matthias Pigulla Date: Mon, 16 Mar 2026 09:14:02 +0100 Subject: [PATCH 4/5] Whitelist DBAL 3 symbols for composer-require-checker --- .composer-require-checker.json | 7 ++++ .github/workflows/dependencies.yml | 2 + composer.lock | 42 +++++++++------------ src/Webfactory/Slimdump/SlimdumpCommand.php | 2 +- 4 files changed, 27 insertions(+), 26 deletions(-) create mode 100644 .composer-require-checker.json diff --git a/.composer-require-checker.json b/.composer-require-checker.json new file mode 100644 index 0000000..3cce1e9 --- /dev/null +++ b/.composer-require-checker.json @@ -0,0 +1,7 @@ +{ + "symbol-whitelist": [ + "Doctrine\\Common\\EventSubscriber", + "Doctrine\\DBAL\\Event\\SchemaColumnDefinitionEventArgs", + "Doctrine\\DBAL\\Events" + ] +} diff --git a/.github/workflows/dependencies.yml b/.github/workflows/dependencies.yml index f7f71f3..f1c66ad 100644 --- a/.github/workflows/dependencies.yml +++ b/.github/workflows/dependencies.yml @@ -34,3 +34,5 @@ jobs: composer show - name: ComposerRequireChecker uses: docker://ghcr.io/webfactory/composer-require-checker:4.18.0 + with: + args: --config-file=.composer-require-checker.json diff --git a/composer.lock b/composer.lock index 54dc3fd..8123691 100644 --- a/composer.lock +++ b/composer.lock @@ -4,52 +4,44 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "ad6a3db8527ee1b99c37da1364c3180b", + "content-hash": "1c5f9a5614a883bf1fadf8cf7bb39f87", "packages": [ { "name": "doctrine/dbal", - "version": "3.10.5", + "version": "4.2.5", "source": { "type": "git", "url": "https://github.com/doctrine/dbal.git", - "reference": "95d84866bf3c04b2ddca1df7c049714660959aef" + "reference": "acb68b388b2577bb211bb26dc22d20a8ad93d97d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/95d84866bf3c04b2ddca1df7c049714660959aef", - "reference": "95d84866bf3c04b2ddca1df7c049714660959aef", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/acb68b388b2577bb211bb26dc22d20a8ad93d97d", + "reference": "acb68b388b2577bb211bb26dc22d20a8ad93d97d", "shasum": "" }, "require": { - "composer-runtime-api": "^2", "doctrine/deprecations": "^0.5.3|^1", - "doctrine/event-manager": "^1|^2", - "php": "^7.4 || ^8.0", + "php": "^8.1", "psr/cache": "^1|^2|^3", "psr/log": "^1|^2|^3" }, - "conflict": { - "doctrine/cache": "< 1.11" - }, "require-dev": { - "doctrine/cache": "^1.11|^2.0", - "doctrine/coding-standard": "14.0.0", + "doctrine/coding-standard": "13.0.0", "fig/log-test": "^1", - "jetbrains/phpstorm-stubs": "2023.1", - "phpstan/phpstan": "2.1.30", + "jetbrains/phpstorm-stubs": "2023.2", + "phpstan/phpstan": "2.1.17", + "phpstan/phpstan-phpunit": "2.0.6", "phpstan/phpstan-strict-rules": "^2", - "phpunit/phpunit": "9.6.34", - "slevomat/coding-standard": "8.27.1", - "squizlabs/php_codesniffer": "4.0.1", - "symfony/cache": "^5.4|^6.0|^7.0|^8.0", - "symfony/console": "^4.4|^5.4|^6.0|^7.0|^8.0" + "phpunit/phpunit": "10.5.46", + "slevomat/coding-standard": "8.16.2", + "squizlabs/php_codesniffer": "3.13.1", + "symfony/cache": "^6.3.8|^7.0", + "symfony/console": "^5.4|^6.3|^7.0" }, "suggest": { "symfony/console": "For helpful console commands such as SQL execution and import of files." }, - "bin": [ - "bin/doctrine-dbal" - ], "type": "library", "autoload": { "psr-4": { @@ -102,7 +94,7 @@ ], "support": { "issues": "https://github.com/doctrine/dbal/issues", - "source": "https://github.com/doctrine/dbal/tree/3.10.5" + "source": "https://github.com/doctrine/dbal/tree/4.2.5" }, "funding": [ { @@ -118,7 +110,7 @@ "type": "tidelift" } ], - "time": "2026-02-24T08:03:57+00:00" + "time": "2025-06-26T22:51:46+00:00" }, { "name": "doctrine/deprecations", diff --git a/src/Webfactory/Slimdump/SlimdumpCommand.php b/src/Webfactory/Slimdump/SlimdumpCommand.php index c717661..7646962 100644 --- a/src/Webfactory/Slimdump/SlimdumpCommand.php +++ b/src/Webfactory/Slimdump/SlimdumpCommand.php @@ -74,7 +74,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int // In DBAL 3, the SchemaManager parses DC2Type column comments and throws when encountering // unknown types. We register a DummyType for any unknown type to work around this. // In DBAL 4, the DC2Type comment mechanism was removed entirely, so this is no longer needed. - if (class_exists('\Doctrine\DBAL\Events')) { + if (class_exists(\Doctrine\DBAL\Events::class)) { $connection->getEventManager()->addEventSubscriber(new DummyTypeRegistrationEventSubscriber($connection->createSchemaManager())); } From 03111c3c1a00dbe841bf61f4053659f2d11a4c4c Mon Sep 17 00:00:00 2001 From: mpdude <1202333+mpdude@users.noreply.github.com> Date: Mon, 16 Mar 2026 08:21:43 +0000 Subject: [PATCH 5/5] Fix CS with PHP-CS-Fixer --- src/Webfactory/Slimdump/DumpTask.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Webfactory/Slimdump/DumpTask.php b/src/Webfactory/Slimdump/DumpTask.php index c7c954e..03d094b 100644 --- a/src/Webfactory/Slimdump/DumpTask.php +++ b/src/Webfactory/Slimdump/DumpTask.php @@ -3,7 +3,6 @@ namespace Webfactory\Slimdump; use Doctrine\DBAL\Connection; -use Doctrine\DBAL\Platforms\AbstractPlatform; use Symfony\Component\Console\Output\OutputInterface; use Webfactory\Slimdump\Config\Config; use Webfactory\Slimdump\Database\Dumper;