From 13bdd596e7a9fe4d1c39e3810c50be6803b0c4cf Mon Sep 17 00:00:00 2001 From: Stefan Kamsker Date: Wed, 6 Mar 2024 14:26:12 +0100 Subject: [PATCH] [Messenger] fix oracale sequence insert --- .../Bridge/Doctrine/Transport/Connection.php | 46 +++++++++++++------ 1 file changed, 33 insertions(+), 13 deletions(-) diff --git a/src/Symfony/Component/Messenger/Bridge/Doctrine/Transport/Connection.php b/src/Symfony/Component/Messenger/Bridge/Doctrine/Transport/Connection.php index e3030d3a1d55f..de3d661535ba4 100644 --- a/src/Symfony/Component/Messenger/Bridge/Doctrine/Transport/Connection.php +++ b/src/Symfony/Component/Messenger/Bridge/Doctrine/Transport/Connection.php @@ -127,32 +127,52 @@ public static function buildConfiguration(#[\SensitiveParameter] string $dsn, ar */ public function send(string $body, array $headers, int $delay = 0): string { + $now = new \DateTimeImmutable('UTC'); - $availableAt = $now->modify(sprintf('%+d seconds', $delay / 1000)); + $availableAt = $now->modify(sprintf('+%d seconds', $delay / 1000)); - $queryBuilder = $this->driverConnection->createQueryBuilder() - ->insert($this->configuration['table_name']) - ->values([ - 'body' => '?', - 'headers' => '?', - 'queue_name' => '?', - 'created_at' => '?', - 'available_at' => '?', - ]); + $values = [ + 'body' => '?', + 'headers' => '?', + 'queue_name' => '?', + 'created_at' => '?', + 'available_at' => '?', + ]; - return $this->executeInsert($queryBuilder->getSQL(), [ + $parameters = [ $body, json_encode($headers), $this->configuration['queue_name'], $now, $availableAt, - ], [ + ]; + + $types = [ Types::STRING, Types::STRING, Types::STRING, Types::DATETIME_IMMUTABLE, Types::DATETIME_IMMUTABLE, - ]); + ]; + + $id = null; + + if ($this->driverConnection->getDatabasePlatform() instanceof OraclePlatform) { + $sequence_name = $this->driverConnection->getDatabasePlatform()->getIdentitySequenceName($this->configuration['table_name'], 'id'); + $values['id'] = '?'; + $sql = $this->driverConnection->getDatabasePlatform()->getSequenceNextValSQL($sequence_name); + $id = (int) $this->driverConnection->fetchOne($sql); + $parameters[] = $id; + $types[] = Types::INTEGER; + } + + $queryBuilder = $this->driverConnection->createQueryBuilder() + ->insert($this->configuration['table_name']) + ->values($values); + + $this->executeStatement($queryBuilder->getSQL(), $parameters, $types); + + return $id ?? $this->driverConnection->lastInsertId(); } public function get(): ?array