diff --git a/src/Symfony/Bridge/Doctrine/SchemaListener/MessengerTransportDoctrineSchemaSubscriber.php b/src/Symfony/Bridge/Doctrine/SchemaListener/MessengerTransportDoctrineSchemaSubscriber.php index 96699cb130980..3311e63168259 100644 --- a/src/Symfony/Bridge/Doctrine/SchemaListener/MessengerTransportDoctrineSchemaSubscriber.php +++ b/src/Symfony/Bridge/Doctrine/SchemaListener/MessengerTransportDoctrineSchemaSubscriber.php @@ -64,8 +64,7 @@ public function onSchemaCreateTable(SchemaCreateTableEventArgs $event): void continue; } - $extraSql = $transport->getExtraSetupSqlForTable($table); - if (null === $extraSql) { + if (!$extraSql = $transport->getExtraSetupSqlForTable($table)) { continue; } @@ -79,7 +78,9 @@ public function onSchemaCreateTable(SchemaCreateTableEventArgs $event): void * the only way to inject some extra SQL. */ $event->addSql($createTableSql); - $event->addSql($extraSql); + foreach ($extraSql as $sql) { + $event->addSql($sql); + } $event->preventDefault(); return; diff --git a/src/Symfony/Bridge/Doctrine/Tests/SchemaListener/MessengerTransportDoctrineSchemaSubscriberTest.php b/src/Symfony/Bridge/Doctrine/Tests/SchemaListener/MessengerTransportDoctrineSchemaSubscriberTest.php index 6bff7c0d395d3..ff4ab2c27a19c 100644 --- a/src/Symfony/Bridge/Doctrine/Tests/SchemaListener/MessengerTransportDoctrineSchemaSubscriberTest.php +++ b/src/Symfony/Bridge/Doctrine/Tests/SchemaListener/MessengerTransportDoctrineSchemaSubscriberTest.php @@ -61,7 +61,7 @@ public function testOnSchemaCreateTable() $doctrineTransport->expects($this->once()) ->method('getExtraSetupSqlForTable') ->with($table) - ->willReturn('ALTER TABLE pizza ADD COLUMN extra_cheese boolean'); + ->willReturn(['ALTER TABLE pizza ADD COLUMN extra_cheese boolean']); // we use the platform to generate the full create table sql $platform->expects($this->once()) @@ -87,7 +87,7 @@ public function testOnSchemaCreateTableNoExtraSql() $doctrineTransport = $this->createMock(DoctrineTransport::class); $doctrineTransport->expects($this->once()) ->method('getExtraSetupSqlForTable') - ->willReturn(null); + ->willReturn([]); $platform->expects($this->never()) ->method('getCreateTableSQL'); diff --git a/src/Symfony/Component/Messenger/Bridge/Doctrine/Tests/Transport/PostgreSqlConnectionTest.php b/src/Symfony/Component/Messenger/Bridge/Doctrine/Tests/Transport/PostgreSqlConnectionTest.php index 3a3d780aef36d..e110b5136b0db 100644 --- a/src/Symfony/Component/Messenger/Bridge/Doctrine/Tests/Transport/PostgreSqlConnectionTest.php +++ b/src/Symfony/Component/Messenger/Bridge/Doctrine/Tests/Transport/PostgreSqlConnectionTest.php @@ -52,7 +52,7 @@ public function testGetExtraSetupSql() $table = new Table('queue_table'); $table->addOption('_symfony_messenger_table_name', 'queue_table'); - $this->assertStringContainsString('CREATE TRIGGER', $connection->getExtraSetupSqlForTable($table)); + $this->assertStringContainsString('CREATE TRIGGER', implode("\n", $connection->getExtraSetupSqlForTable($table))); } public function testGetExtraSetupSqlWrongTable() @@ -62,6 +62,6 @@ public function testGetExtraSetupSqlWrongTable() $table = new Table('queue_table'); // don't set the _symfony_messenger_table_name option - $this->assertNull($connection->getExtraSetupSqlForTable($table)); + $this->assertSame([], $connection->getExtraSetupSqlForTable($table)); } } diff --git a/src/Symfony/Component/Messenger/Bridge/Doctrine/Transport/Connection.php b/src/Symfony/Component/Messenger/Bridge/Doctrine/Transport/Connection.php index 3b61bdcbf0bd5..f99452ef3c85a 100644 --- a/src/Symfony/Component/Messenger/Bridge/Doctrine/Transport/Connection.php +++ b/src/Symfony/Component/Messenger/Bridge/Doctrine/Transport/Connection.php @@ -313,9 +313,9 @@ public function configureSchema(Schema $schema, DBALConnection $forConnection): /** * @internal */ - public function getExtraSetupSqlForTable(Table $createdTable): ?string + public function getExtraSetupSqlForTable(Table $createdTable): array { - return null; + return []; } private function createAvailableMessagesQueryBuilder(): QueryBuilder diff --git a/src/Symfony/Component/Messenger/Bridge/Doctrine/Transport/DoctrineTransport.php b/src/Symfony/Component/Messenger/Bridge/Doctrine/Transport/DoctrineTransport.php index 1974aa178bacd..9982d343e305d 100644 --- a/src/Symfony/Component/Messenger/Bridge/Doctrine/Transport/DoctrineTransport.php +++ b/src/Symfony/Component/Messenger/Bridge/Doctrine/Transport/DoctrineTransport.php @@ -111,8 +111,10 @@ public function configureSchema(Schema $schema, DbalConnection $forConnection): /** * Adds extra SQL if the given table was created by the Connection. + * + * @return string[] */ - public function getExtraSetupSqlForTable(Table $createdTable): ?string + public function getExtraSetupSqlForTable(Table $createdTable): array { return $this->connection->getExtraSetupSqlForTable($createdTable); } diff --git a/src/Symfony/Component/Messenger/Bridge/Doctrine/Transport/PostgreSqlConnection.php b/src/Symfony/Component/Messenger/Bridge/Doctrine/Transport/PostgreSqlConnection.php index 25dedcf4c8472..dfffdac4b7162 100644 --- a/src/Symfony/Component/Messenger/Bridge/Doctrine/Transport/PostgreSqlConnection.php +++ b/src/Symfony/Component/Messenger/Bridge/Doctrine/Transport/PostgreSqlConnection.php @@ -85,43 +85,43 @@ public function setup(): void { parent::setup(); - $this->driverConnection->exec($this->getTriggerSql()); + $this->driverConnection->exec(implode("\n", $this->getTriggerSql())); } - public function getExtraSetupSqlForTable(Table $createdTable): ?string + /** + * @return string[] + */ + public function getExtraSetupSqlForTable(Table $createdTable): array { if (!$createdTable->hasOption(self::TABLE_OPTION_NAME)) { - return null; + return []; } if ($createdTable->getOption(self::TABLE_OPTION_NAME) !== $this->configuration['table_name']) { - return null; + return []; } return $this->getTriggerSql(); } - private function getTriggerSql(): string + private function getTriggerSql(): array { - return sprintf(<<<'SQL' -LOCK TABLE %1$s; --- create trigger function + return [ + sprintf('LOCK TABLE %s;', $this->configuration['table_name']), + // create trigger function + sprintf(<<<'SQL' CREATE OR REPLACE FUNCTION notify_%1$s() RETURNS TRIGGER AS $$ - BEGIN - PERFORM pg_notify('%1$s', NEW.queue_name::text); - RETURN NEW; + BEGIN + PERFORM pg_notify('%1$s', NEW.queue_name::text); + RETURN NEW; END; $$ LANGUAGE plpgsql; - --- register trigger -DROP TRIGGER IF EXISTS notify_trigger ON %1$s; - -CREATE TRIGGER notify_trigger -AFTER INSERT -ON %1$s -FOR EACH ROW EXECUTE PROCEDURE notify_%1$s(); SQL - , $this->configuration['table_name']); + , $this->configuration['table_name']), + // register trigger + sprintf('DROP TRIGGER IF EXISTS notify_trigger ON %s;', $this->configuration['table_name']), + sprintf('CREATE TRIGGER notify_trigger AFTER INSERT ON %1$s FOR EACH ROW EXECUTE PROCEDURE notify_%1$s();', $this->configuration['table_name']), + ]; } private function unlisten()