From ed5df5d61c5b398a5ab3296b0077b344524523b5 Mon Sep 17 00:00:00 2001 From: Willem-Jan Date: Mon, 11 Mar 2024 10:36:44 +0100 Subject: [PATCH] Added DBALv4 support --- composer.json | 2 +- .../DoctrineMessageRepositoryTestCase.php | 5 +++- .../DoctrineOutboxRepository.php | 14 +++++++++-- ...rineTransactionalMessageRepositoryTest.php | 20 +++++++++------ src/TestTooling/DoctrineConnectionTrait.php | 25 +++++++++++++++++++ 5 files changed, 54 insertions(+), 12 deletions(-) create mode 100644 src/TestTooling/DoctrineConnectionTrait.php diff --git a/composer.json b/composer.json index 44090e6..48620dd 100644 --- a/composer.json +++ b/composer.json @@ -11,7 +11,7 @@ "require": { "eventsauce/eventsauce": "^3.0", "eventsauce/backoff": "^1.0", - "doctrine/dbal": "^2.11|^3.1" + "doctrine/dbal": "^2.11|^3.1|^4.0" }, "require-dev": { "phpunit/phpunit": "^9.5", diff --git a/src/DoctrineMessageRepository/DoctrineMessageRepositoryTestCase.php b/src/DoctrineMessageRepository/DoctrineMessageRepositoryTestCase.php index c6fb6f7..06fe22e 100644 --- a/src/DoctrineMessageRepository/DoctrineMessageRepositoryTestCase.php +++ b/src/DoctrineMessageRepository/DoctrineMessageRepositoryTestCase.php @@ -6,6 +6,7 @@ use Doctrine\DBAL\Driver\ResultStatement; use Doctrine\DBAL\DriverManager; use EventSauce\EventSourcing\AggregateRootId; +use EventSauce\MessageOutbox\TestTooling\DoctrineConnectionTrait; use EventSauce\MessageRepository\TestTooling\MessageRepositoryTestCase; use Ramsey\Uuid\Uuid; @@ -15,6 +16,8 @@ abstract class DoctrineMessageRepositoryTestCase extends MessageRepositoryTestCase { + use DoctrineConnectionTrait; + protected Connection $connection; protected function setUp(): void @@ -24,7 +27,7 @@ protected function setUp(): void } parent::setUp(); - $connection = DriverManager::getConnection(['url' => $this->formatDsn()]); + $connection = DriverManager::getConnection($this->getConnectionParams()); $this->connection = $connection; $this->truncateTable(); } diff --git a/src/DoctrineOutbox/DoctrineOutboxRepository.php b/src/DoctrineOutbox/DoctrineOutboxRepository.php index 102c551..56007fa 100644 --- a/src/DoctrineOutbox/DoctrineOutboxRepository.php +++ b/src/DoctrineOutbox/DoctrineOutboxRepository.php @@ -2,6 +2,7 @@ namespace EventSauce\MessageOutbox\DoctrineOutbox; +use Doctrine\DBAL\ArrayParameterType; use Doctrine\DBAL\Connection; use Doctrine\DBAL\ParameterType; use EventSauce\EventSourcing\Message; @@ -69,7 +70,7 @@ public function markConsumed(Message ...$messages): void $this->connection->executeQuery($sqlStatement, [ 'ids' => $ids, ], [ - 'ids' => Connection::PARAM_INT_ARRAY, + 'ids' => $this->intArrayType(), ]); } @@ -88,7 +89,7 @@ public function deleteMessages(Message ...$messages): void $this->connection->executeQuery($sqlStatement, [ 'ids' => $ids, ], [ - 'ids' => Connection::PARAM_INT_ARRAY, + 'ids' => $this->intArrayType(), ]); } @@ -129,4 +130,13 @@ private function idFromMessage(Message $message): int return (int) $id; } + + private function intArrayType(): mixed + { + if (class_exists(ArrayParameterType::class)) { + return ArrayParameterType::INTEGER; + } + + return Connection::PARAM_INT_ARRAY; + } } diff --git a/src/DoctrineOutbox/DoctrineTransactionalMessageRepositoryTest.php b/src/DoctrineOutbox/DoctrineTransactionalMessageRepositoryTest.php index e4096dd..6f6cab4 100644 --- a/src/DoctrineOutbox/DoctrineTransactionalMessageRepositoryTest.php +++ b/src/DoctrineOutbox/DoctrineTransactionalMessageRepositoryTest.php @@ -9,6 +9,7 @@ use EventSauce\EventSourcing\MessageRepository; use EventSauce\EventSourcing\Serialization\ConstructingMessageSerializer; use EventSauce\MessageOutbox\OutboxRepository; +use EventSauce\MessageOutbox\TestTooling\DoctrineConnectionTrait; use EventSauce\MessageOutbox\TestTooling\TransactionalMessageRepositoryTestCase; use EventSauce\MessageRepository\DoctrineMessageRepository\DoctrineUuidV4MessageRepository; use EventSauce\MessageRepository\DoctrineMessageRepository\DummyAggregateRootId; @@ -18,6 +19,8 @@ class DoctrineTransactionalMessageRepositoryTest extends TransactionalMessageRepositoryTestCase { + use DoctrineConnectionTrait; + private Connection $connection; protected function setUp(): void @@ -28,19 +31,20 @@ protected function setUp(): void parent::setUp(); - $host = getenv('EVENTSAUCE_TESTING_MYSQL_HOST') ?: '127.0.0.1'; - $port = getenv('EVENTSAUCE_TESTING_MYSQL_PORT') ?: '3306'; - - $this->connection = DriverManager::getConnection( - [ - 'url' => "mysql://username:password@$host:$port/outbox_messages", - ] - ); + $this->connection = DriverManager::getConnection($this->getConnectionParams()); $this->connection->executeQuery('TRUNCATE TABLE '.$this->repositoryTable); $this->connection->executeQuery('TRUNCATE TABLE '.$this->outboxTable); } + protected function formatDsn(): string + { + $host = getenv('EVENTSAUCE_TESTING_MYSQL_HOST') ?: '127.0.0.1'; + $port = getenv('EVENTSAUCE_TESTING_MYSQL_PORT') ?: '3306'; + + return "mysql://username:password@$host:$port/outbox_messages"; + } + protected function messageRepository(): MessageRepository { return new DoctrineUuidV4MessageRepository( diff --git a/src/TestTooling/DoctrineConnectionTrait.php b/src/TestTooling/DoctrineConnectionTrait.php new file mode 100644 index 0000000..dc4c032 --- /dev/null +++ b/src/TestTooling/DoctrineConnectionTrait.php @@ -0,0 +1,25 @@ +formatDsn(); + if (class_exists(DsnParser::class)) { + if (str_starts_with($this->formatDsn(), 'mysql')) { + $parserParams = ['mysql' => 'pdo_mysql']; + } else { + $parserParams = ['pgsql' => 'pdo_pgsql']; + } + $parser = new DsnParser($parserParams); + return $parser->parse($dsn); + } + return ['url' => $dsn]; + } +}