8000 [Messenger] Fix function name in TriggerSql on postgresql bridge to s… · symfony/symfony@64e7c9b · GitHub
[go: up one dir, main page]

Skip to content

Commit 64e7c9b

Browse files
zimny9932fabpot
authored andcommitted
[Messenger] Fix function name in TriggerSql on postgresql bridge to support table name with schema
1 parent 2a4125f commit 64e7c9b

File tree

2 files changed

+30
-4
lines changed

2 files changed

+30
-4
lines changed

src/Symfony/Component/Messenger/Bridge/Doctrine/Tests/Transport/PostgreSqlConnectionTest.php

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,19 @@ public function testGetExtraSetupSql()
5858
$this->assertStringNotContainsString('COMMIT;', $sql);
5959
}
6060

61+
public function testTransformTableNameWithSchemaToValidProcedureName()
62+
{
63+
$driverConnection = $this->createMock(\Doctrine\DBAL\Connection::class);
64+
$connection = new PostgreSqlConnection(['table_name' => 'schema.queue_table'], $driverConnection);
65+
66+
$table = new Table('schema.queue_table');
67+
$table->addOption('_symfony_messenger_table_name', 'schema.queue_table');
68+
$sql = implode("\n", $connection->getExtraSetupSqlForTable($table));
69+
70+
$this->assertStringContainsString('CREATE OR REPLACE FUNCTION schema.notify_queue_table', $sql);
71+
$this->assertStringContainsString('FOR EACH ROW EXECUTE PROCEDURE schema.notify_queue_table()', $sql);
72+
}
73+
6174
public function testGetExtraSetupSqlWrongTable()
6275
{
6376
$driverConnection = $this->createMock(\Doctrine\DBAL\Connection::class);

src/Symfony/Component/Messenger/Bridge/Doctrine/Transport/PostgreSqlConnection.php

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -118,23 +118,36 @@ public function getExtraSetupSqlForTable(Table $createdTable): array
118118

119119
private function getTriggerSql(): array
120120
{
121+
$functionName = $this->createTriggerFunctionName();
122+
121123
return [
122124
// create trigger function
123125
sprintf(<<<'SQL'
124-
CREATE OR REPLACE FUNCTION notify_%1$s() RETURNS TRIGGER AS $$
126+
CREATE OR REPLACE FUNCTION %1$s() RETURNS TRIGGER AS $$
125127
BEGIN
126-
PERFORM pg_notify('%1$s', NEW.queue_name::text);
128+
PERFORM pg_notify('%2$s', NEW.queue_name::text);
127129
RETURN NEW;
128130
END;
129131
$$ LANGUAGE plpgsql;
130132
SQL
131-
, $this->configuration['table_name']),
133+
, $functionName, $this->configuration['table_name']),
132134
// register trigger
133135
sprintf('DROP TRIGGER IF EXISTS notify_trigger ON %s;', $this->configuration['table_name']),
134-
sprintf('CREATE TRIGGER notify_trigger AFTER INSERT OR UPDATE ON %1$s FOR EACH ROW EXECUTE PROCEDURE notify_%1$s();', $this->configuration['table_name']),
136+
sprintf('CREATE TRIGGER notify_trigger AFTER INSERT OR UPDATE ON %1$s FOR EACH ROW EXECUTE PROCEDURE %2$s();', $this->configuration['table_name'], $functionName),
135137
];
136138
}
137139

140+
private function createTriggerFunctionName(): string
141+
{
142+
$tableConfig = explode('.', $this->configuration['table_name']);
143+
144+
if (1 === \count($tableConfig)) {
145+
return sprintf('notify_%1$s', $tableConfig[0]);
146+
}
147+
148+
return sprintf('%1$s.notify_%2$s', $tableConfig[0], $tableConfig[1]);
149+
}
150+
138151
private function unlisten()
139152
{
140153
if (!$this->listening) {

0 commit comments

Comments
 (0)
0