Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit fca96ac

Browse filesBrowse files
committed
fix compatibility with Doctrine DBAL 4
1 parent 5611ed4 commit fca96ac
Copy full SHA for fca96ac

File tree

Expand file treeCollapse file tree

2 files changed

+33
-10
lines changed
Filter options
Expand file treeCollapse file tree

2 files changed

+33
-10
lines changed

‎src/Symfony/Component/Messenger/Bridge/Doctrine/Tests/Transport/ConnectionTest.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/Messenger/Bridge/Doctrine/Tests/Transport/ConnectionTest.php
+11-2Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,9 @@ public function testGetWithNoPendingMessageWillReturnNull()
8282
$queryBuilder
8383
->method('getParameterTypes')
8484
->willReturn([]);
85+
$queryBuilder
86+
->method('getSQL')
87+
->willReturn('SELECT FOR UPDATE');
8588
$driverConnection->expects($this->once())
8689
->method('createQueryBuilder')
8790
->willReturn($queryBuilder);
@@ -120,7 +123,11 @@ private function getDBALConnectionMock()
120123
{
121124
$driverConnection = $this->createMock(DBALConnection::class);
122125
$platform = $this->createMock(AbstractPlatform::class);
123-
$platform->method('getWriteLockSQL')->willReturn('FOR UPDATE');
126+
127+
if (!method_exists(QueryBuilder::class, 'forUpdate')) {
128+
$platform->method('getWriteLockSQL')->willReturn('FOR UPDATE');
129+
}
130+
124131
$configuration = $this->createMock(\Doctrine\DBAL\Configuration::class);
125132
$driverConnection->method('getDatabasePlatform')->willReturn($platform);
126133
$driverConnection->method('getConfiguration')->willReturn($configuration);
@@ -381,7 +388,9 @@ public function testGeneratedSql(AbstractPlatform $platform, string $expectedSql
381388
$driverConnection
382389
->expects($this->once())
383390
->method('executeQuery')
384-
->with($expectedSql)
391+
->with($this->callback(function ($sql) use ($expectedSql) {
392+
return trim($expectedSql) === trim($sql);
393+
}))
385394
->willReturn($result)
386395
;
387396
$driverConnection->expects($this->once())->method('commit');

‎src/Symfony/Component/Messenger/Bridge/Doctrine/Transport/Connection.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/Messenger/Bridge/Doctrine/Transport/Connection.php
+22-8Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,24 @@ public function get(): ?array
177177

178178
// Append pessimistic write lock to FROM clause if db platform supports it
179179
$sql = $query->getSQL();
180-
if (preg_match('/FROM (.+) WHERE/', (string) $sql, $matches)) {
180+
181+
// Wrap the rownum query in a sub-query to allow writelocks without ORA-02014 error
182+
if ($this->driverConnection->getDatabasePlatform() instanceof OraclePlatform) {
183+
$query = $this->createQueryBuilder('w')
184+
->where('w.id IN ('.str_replace('SELECT a.* FROM', 'SELECT a.id FROM', $sql).')');
185+
186+
if (method_exists(QueryBuilder::class, 'forUpdate')) {
187+
$query->forUpdate();
188+
}
189+
190+
$sql = $query->getSQL();
191+
} elseif (method_exists(QueryBuilder::class, 'forUpdate')) {
192+
$query->forUpdate();
193+
try {
194+
$sql = $query->getSQL();
195+
} catch (DBALException $e) {
196+
}
197+
} elseif (preg_match('/FROM (.+) WHERE/', (string) $sql, $matches)) {
181198
$fromClause = $matches[1];
182199
$sql = str_replace(
183200
sprintf('FROM %s WHERE', $fromClause),
@@ -186,16 +203,13 @@ public function get(): ?array
186203
);
187204
}
188205

189-
// Wrap the rownum query in a sub-query to allow writelocks without ORA-02014 error
190-
if ($this->driverConnection->getDatabasePlatform() instanceof OraclePlatform) {
191-
$sql = $this->createQueryBuilder('w')
192-
->where('w.id IN ('.str_replace('SELECT a.* FROM', 'SELECT a.id FROM', $sql).')')
193-
->getSQL();
206+
// use SELECT ... FOR UPDATE to lock table
207+
if (!method_exists(QueryBuilder::class, 'forUpdate')) {
208+
$sql .= ' '.$this->driverConnection->getDatabasePlatform()->getWriteLockSQL();
194209
}
195210

196-
// use SELECT ... FOR UPDATE to lock table
197211
$stmt = $this->executeQuery(
198-
$sql.' '.$this->driverConnection->getDatabasePlatform()->getWriteLockSQL(),
212+
$sql,
199213
$query->getParameters(),
200214
$query->getParameterTypes()
201215
);

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.