Skip to content

Commit 43dfb6f

Browse files
derrabusjwage
authored andcommitted
Fix calls to removed lock methods (doctrine#11061)
1 parent 398ab05 commit 43dfb6f

File tree

5 files changed

+74
-20
lines changed

5 files changed

+74
-20
lines changed

lib/Doctrine/ORM/Persisters/Entity/BasicEntityPersister.php

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
use Doctrine\ORM\Repository\Exception\InvalidFindByCall;
3232
use Doctrine\ORM\UnitOfWork;
3333
use Doctrine\ORM\Utility\IdentifierFlattener;
34+
use Doctrine\ORM\Utility\LockSqlHelper;
3435
use Doctrine\ORM\Utility\PersisterHelper;
3536
use LengthException;
3637

@@ -92,6 +93,8 @@
9293
*/
9394
class BasicEntityPersister implements EntityPersister
9495
{
96+
use LockSqlHelper;
97+
9598
/** @var array<string,string> */
9699
private static $comparisonMap = [
97100
Comparison::EQ => '= %s',
@@ -1116,11 +1119,11 @@ public function getSelectSQL($criteria, $assoc = null, $lockMode = null, $limit
11161119

11171120
switch ($lockMode) {
11181121
case LockMode::PESSIMISTIC_READ:
1119-
$lockSql = ' ' . $this->platform->getReadLockSQL();
1122+
$lockSql = ' ' . $this->getReadLockSQL($this->platform);
11201123
break;
11211124

11221125
case LockMode::PESSIMISTIC_WRITE:
1123-
$lockSql = ' ' . $this->platform->getWriteLockSQL();
1126+
$lockSql = ' ' . $this->getWriteLockSQL($this->platform);
11241127
break;
11251128
}
11261129

@@ -1578,11 +1581,11 @@ public function lock(array $criteria, $lockMode)
15781581

15791582
switch ($lockMode) {
15801583
case LockMode::PESSIMISTIC_READ:
1581-
$lockSql = $this->platform->getReadLockSQL();
1584+
$lockSql = $this->getReadLockSQL($this->platform);
15821585

15831586
break;
15841587
case LockMode::PESSIMISTIC_WRITE:
1585-
$lockSql = $this->platform->getWriteLockSQL();
1588+
$lockSql = $this->getWriteLockSQL($this->platform);
15861589
break;
15871590
}
15881591

lib/Doctrine/ORM/Persisters/Entity/JoinedSubclassPersister.php

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
use Doctrine\DBAL\Types\Types;
1111
use Doctrine\ORM\Internal\SQLResultCasing;
1212
use Doctrine\ORM\Mapping\ClassMetadata;
13+
use Doctrine\ORM\Utility\LockSqlHelper;
1314
use Doctrine\ORM\Utility\PersisterHelper;
1415
use LengthException;
1516

@@ -26,6 +27,7 @@
2627
*/
2728
class JoinedSubclassPersister extends AbstractEntityInheritancePersister
2829
{
30+
use LockSqlHelper;
2931
use SQLResultCasing;
3032

3133
/**
@@ -316,12 +318,12 @@ public function getSelectSQL($criteria, $assoc = null, $lockMode = null, $limit
316318

317319
switch ($lockMode) {
318320
case LockMode::PESSIMISTIC_READ:
319-
$lockSql = ' ' . $this->platform->getReadLockSQL();
321+
$lockSql = ' ' . $this->getReadLockSQL($this->platform);
320322

321323
break;
322324

323325
case LockMode::PESSIMISTIC_WRITE:
324-
$lockSql = ' ' . $this->platform->getWriteLockSQL();
326+
$lockSql = ' ' . $this->getWriteLockSQL($this->platform);
325327

326328
break;
327329
}

lib/Doctrine/ORM/Query/SqlWalker.php

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
use Doctrine\ORM\OptimisticLockException;
1717
use Doctrine\ORM\Query;
1818
use Doctrine\ORM\Utility\HierarchyDiscriminatorResolver;
19+
use Doctrine\ORM\Utility\LockSqlHelper;
1920
use Doctrine\ORM\Utility\PersisterHelper;
2021
use InvalidArgumentException;
2122
use LogicException;
@@ -48,6 +49,8 @@
4849
*/
4950
class SqlWalker implements TreeWalker
5051
{
52+
use LockSqlHelper;
53+
5154
public const HINT_DISTINCT = 'doctrine.distinct';
5255

5356
/**
@@ -577,11 +580,11 @@ public function walkSelectStatement(AST\SelectStatement $AST)
577580
}
578581

579582
if ($lockMode === LockMode::PESSIMISTIC_READ) {
580-
return $sql . ' ' . $this->platform->getReadLockSQL();
583+
return $sql . ' ' . $this->getReadLockSQL($this->platform);
581584
}
582585

583586
if ($lockMode === LockMode::PESSIMISTIC_WRITE) {
584-
return $sql . ' ' . $this->platform->getWriteLockSQL();
587+
return $sql . ' ' . $this->getWriteLockSQL($this->platform);
585588
}
586589

587590
if ($lockMode !== LockMode::OPTIMISTIC) {
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Doctrine\ORM\Utility;
6+
7+
use Doctrine\DBAL\Platforms\AbstractMySQLPlatform;
8+
use Doctrine\DBAL\Platforms\AbstractPlatform;
9+
use Doctrine\DBAL\Platforms\DB2Platform;
10+
use Doctrine\DBAL\Platforms\MySqlPlatform;
11+
use Doctrine\DBAL\Platforms\PostgreSqlPlatform;
12+
use Doctrine\DBAL\Platforms\SqlitePlatform;
13+
use Doctrine\DBAL\Platforms\SQLServerPlatform;
14+
15+
/** @internal */
16+
trait LockSqlHelper
17+
{
18+
private function getReadLockSQL(AbstractPlatform $platform): string
19+
{
20+
if ($platform instanceof AbstractMySQLPlatform || $platform instanceof MySqlPlatform) {
21+
return 'LOCK IN SHARE MODE';
22+
}
23+
24+
if ($platform instanceof PostgreSQLPlatform) {
25+
return 'FOR SHARE';
26+
}
27+
28+
return $this->getWriteLockSQL($platform);
29+
}
30+
31+
private function getWriteLockSQL(AbstractPlatform $platform): string
32+
{
33+
if ($platform instanceof DB2Platform) {
34+
return 'WITH RR USE AND KEEP UPDATE LOCKS';
35+
}
36+
37+
if ($platform instanceof SqlitePlatform) {
38+
return '';
39+
}
40+
41+
if ($platform instanceof SQLServerPlatform) {
42+
return '';
43+
}
44+
45+
return 'FOR UPDATE';
46+
}
47+
}

tests/Doctrine/Tests/ORM/Functional/Locking/LockTest.php

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
namespace Doctrine\Tests\ORM\Functional\Locking;
66

77
use Doctrine\DBAL\LockMode;
8+
use Doctrine\DBAL\Platforms\SQLitePlatform;
89
use Doctrine\ORM\OptimisticLockException;
910
use Doctrine\ORM\Query;
1011
use Doctrine\ORM\TransactionRequiredException;
@@ -168,9 +169,7 @@ public function testRefreshWithLockPessimisticWriteNoTransactionThrowsException(
168169
*/
169170
public function testLockPessimisticWrite(): void
170171
{
171-
$writeLockSql = $this->_em->getConnection()->getDatabasePlatform()->getWriteLockSQL();
172-
173-
if (! $writeLockSql) {
172+
if ($this->_em->getConnection()->getDatabasePlatform() instanceof SQLitePlatform) {
174173
self::markTestSkipped('Database Driver has no Write Lock support.');
175174
}
176175

@@ -195,17 +194,15 @@ public function testLockPessimisticWrite(): void
195194
$lastLoggedQuery = $this->getLastLoggedQuery(1)['sql'];
196195
}
197196

198-
self::assertStringContainsString($writeLockSql, $lastLoggedQuery);
197+
self::assertStringContainsString('FOR UPDATE', $lastLoggedQuery);
199198
}
200199

201200
/**
202201
* @group locking
203202
*/
204203
public function testRefreshWithLockPessimisticWrite(): void
205204
{
206-
$writeLockSql = $this->_em->getConnection()->getDatabasePlatform()->getWriteLockSQL();
207-
208-
if (! $writeLockSql) {
205+
if ($this->_em->getConnection()->getDatabasePlatform() instanceof SQLitePlatform) {
209206
self::markTestSkipped('Database Driver has no Write Lock support.');
210207
}
211208

@@ -230,15 +227,13 @@ public function testRefreshWithLockPessimisticWrite(): void
230227
$lastLoggedQuery = $this->getLastLoggedQuery(1)['sql'];
231228
}
232229

233-
self::assertStringContainsString($writeLockSql, $lastLoggedQuery);
230+
self::assertStringContainsString('FOR UPDATE', $lastLoggedQuery);
234231
}
235232

236233
/** @group DDC-178 */
237234
public function testLockPessimisticRead(): void
238235
{
239-
$readLockSql = $this->_em->getConnection()->getDatabasePlatform()->getReadLockSQL();
240-
241-
if (! $readLockSql) {
236+
if ($this->_em->getConnection()->getDatabasePlatform() instanceof SQLitePlatform) {
242237
self::markTestSkipped('Database Driver has no Write Lock support.');
243238
}
244239

@@ -264,7 +259,11 @@ public function testLockPessimisticRead(): void
264259
$lastLoggedQuery = $this->getLastLoggedQuery(1)['sql'];
265260
}
266261

267-
self::assertStringContainsString($readLockSql, $lastLoggedQuery);
262+
self::assertThat($lastLoggedQuery, self::logicalOr(
263+
self::stringContains('FOR UPDATE'),
264+
self::stringContains('FOR SHARE'),
265+
self::stringContains('LOCK IN SHARE MODE')
266+
));
268267
}
269268

270269
/** @group DDC-1693 */

0 commit comments

Comments
 (0)