Skip to content

Commit 60085ad

Browse files
authored
Continue API improvement (#7)
1 parent 2fff9f9 commit 60085ad

10 files changed

+279
-247
lines changed

README.md

Lines changed: 39 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,11 @@
77
<a href="https://github.com/cybercog/php-db-locker/blob/master/LICENSE"><img src="https://img.shields.io/github/license/cybercog/php-db-locker.svg?style=flat-square" alt="License"></a>
88
</p>
99

10+
## Things to decide
11+
12+
- [ ] Should wait mode be blocking or non-blocking by default?
13+
- [ ] Should callback for session lock be at the end of the params (after optional ones)?
14+
1015
## Introduction
1116

1217
> WARNING! This library is currently under development and may not be stable. Use in your services at your own risk.
@@ -38,7 +43,7 @@ $locker = new \Cog\DbLocker\Postgres\PostgresAdvisoryLocker();
3843
$lockId = \Cog\DbLocker\Postgres\PostgresLockKey::create('user', '4');
3944

4045
$dbConnection->beginTransaction();
41-
$lock = $locker->acquireSessionLevelLockHandler(
46+
$lock = $locker->acquireSessionLevelLock(
4247
$dbConnection,
4348
$lockId,
4449
\Cog\DbLocker\Postgres\Enum\PostgresLockWaitModeEnum::NonBlocking,
@@ -54,18 +59,45 @@ $dbConnection->commit();
5459

5560
#### Session-level advisory lock
5661

62+
Callback API
63+
5764
```php
5865
$dbConnection = new PDO($dsn, $username, $password);
5966

6067
$locker = new \Cog\DbLocker\Postgres\PostgresAdvisoryLocker();
61-
$lockId = \Cog\DbLocker\Postgres\PostgresLockKey::create('user', '4');
68+
$lockKey = \Cog\DbLocker\Postgres\PostgresLockKey::create('user', '4');
69+
70+
$payment = $locker->withinSessionLevelLock(
71+
dbConnection: $dbConnection,
72+
key: $lockKey,
73+
callback: function (
74+
\Cog\DbLocker\Postgres\LockHandle\SessionLevelLockHandle $lock,
75+
): Payment { // Define a type of $payment variable, so it will be resolved by analyzers
76+
if ($lock->wasAcquired) {
77+
// Execute logic if lock was successful
78+
} else {
79+
// Execute logic if lock acquisition has been failed
80+
}
81+
},
82+
waitMode: \Cog\DbLocker\Postgres\Enum\PostgresLockWaitModeEnum::NonBlocking,
83+
accessMode: \Cog\DbLocker\Postgres\Enum\PostgresLockAccessModeEnum::Exclusive,
84+
);
85+
```
86+
87+
Low-level API
88+
89+
```php
90+
$dbConnection = new PDO($dsn, $username, $password);
91+
92+
$locker = new \Cog\DbLocker\Postgres\PostgresAdvisoryLocker();
93+
$lockKey = \Cog\DbLocker\Postgres\PostgresLockKey::create('user', '4');
6294

6395
try {
64-
$lock = $locker->acquireSessionLevelLockHandler(
65-
$dbConnection,
66-
$lockId,
67-
\Cog\DbLocker\Postgres\Enum\PostgresLockWaitModeEnum::NonBlocking,
68-
\Cog\DbLocker\Postgres\Enum\PostgresLockAccessModeEnum::Exclusive,
96+
$lock = $locker->acquireSessionLevelLock(
97+
dbConnection: $dbConnection,
98+
key: $lockKey,
99+
waitMode: \Cog\DbLocker\Postgres\Enum\PostgresLockWaitModeEnum::NonBlocking,
100+
accessMode: \Cog\DbLocker\Postgres\Enum\PostgresLockAccessModeEnum::Exclusive,
69101
);
70102
if ($lock->wasAcquired) {
71103
// Execute logic if lock was successful

src/Postgres/Enum/PostgresLockAccessModeEnum.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,10 @@
77
/**
88
* PostgresLockAccessModeEnum defines the access mode of advisory lock acquisition.
99
*
10-
* TODO: Need string values only for tests, should add match to tests instead.
10+
* TODO: Write details about access mode.
1111
*/
12-
enum PostgresLockAccessModeEnum: string
12+
enum PostgresLockAccessModeEnum
1313
{
14-
case Exclusive = 'ExclusiveLock';
15-
case Share = 'ShareLock';
14+
case Exclusive;
15+
case Share;
1616
}

src/Postgres/Enum/PostgresLockLevelEnum.php

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,19 @@
77
/**
88
* PostgresLockLevelEnum defines the level of advisory lock acquisition.
99
*
10+
* - Transaction. Transaction-level (recommended) advisory lock (with _XACT_):
11+
* - PG_ADVISORY_XACT_LOCK
12+
* - PG_ADVISORY_XACT_LOCK_SHARED
13+
* - PG_TRY_ADVISORY_XACT_LOCK
14+
* - PG_TRY_ADVISORY_XACT_LOCK_SHARED
1015
* - Session. Session-level advisory lock (without _XACT_):
1116
* - PG_ADVISORY_LOCK
1217
* - PG_ADVISORY_LOCK_SHARED
1318
* - PG_TRY_ADVISORY_LOCK
1419
* - PG_TRY_ADVISORY_LOCK_SHARED
15-
* - Transaction. Transaction-level advisory lock (with _XACT_):
16-
* - PG_ADVISORY_XACT_LOCK
17-
* - PG_ADVISORY_XACT_LOCK_SHARED
18-
* - PG_TRY_ADVISORY_XACT_LOCK
19-
* - PG_TRY_ADVISORY_XACT_LOCK_SHARED
2020
*/
2121
enum PostgresLockLevelEnum
2222
{
23-
case Session;
2423
case Transaction;
24+
case Session;
2525
}

src/Postgres/Enum/PostgresLockWaitModeEnum.php

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,16 @@
77
/**
88
* PostgresLockWaitModeEnum defines the type of advisory lock acquisition.
99
*
10-
* - NonBlocking. Attempt to acquire the lock without blocking (with _TRY_):
11-
* - PG_TRY_ADVISORY_LOCK
12-
* - PG_TRY_ADVISORY_LOCK_SHARED
13-
* - PG_TRY_ADVISORY_XACT_LOCK
14-
* - PG_TRY_ADVISORY_XACT_LOCK_SHARED
1510
* - Blocking. Acquire the lock, blocking until it becomes available (without _TRY_):
1611
* - PG_ADVISORY_LOCK
1712
* - PG_ADVISORY_LOCK_SHARED
1813
* - PG_ADVISORY_XACT_LOCK
1914
* - PG_ADVISORY_XACT_LOCK_SHARED
15+
* - NonBlocking. Attempt to acquire the lock without blocking (with _TRY_):
16+
* - PG_TRY_ADVISORY_LOCK
17+
* - PG_TRY_ADVISORY_LOCK_SHARED
18+
* - PG_TRY_ADVISORY_XACT_LOCK
19+
* - PG_TRY_ADVISORY_XACT_LOCK_SHARED
2020
*/
2121
enum PostgresLockWaitModeEnum
2222
{

src/Postgres/LockHandle/SessionLevelLockHandle.php

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ final class SessionLevelLockHandle
2828
public function __construct(
2929
private readonly PDO $dbConnection,
3030
private readonly PostgresAdvisoryLocker $locker,
31-
public readonly PostgresLockKey $lockId,
31+
public readonly PostgresLockKey $lockKey,
3232
public readonly PostgresLockAccessModeEnum $accessMode,
3333
public readonly bool $wasAcquired,
3434
) {}
@@ -49,7 +49,7 @@ public function release(): bool
4949

5050
$wasReleased = $this->locker->releaseSessionLevelLock(
5151
$this->dbConnection,
52-
$this->lockId,
52+
$this->lockKey,
5353
);
5454

5555
if ($wasReleased) {
@@ -58,13 +58,4 @@ public function release(): bool
5858

5959
return $wasReleased;
6060
}
61-
62-
/**
63-
* Automatically release the lock when the handle is destroyed.
64-
*/
65-
public function __destruct()
66-
{
67-
// TODO: Do we need to
68-
$this->release();
69-
}
7061
}

src/Postgres/LockHandle/TransactionLevelLockHandle.php

Lines changed: 0 additions & 24 deletions
This file was deleted.

0 commit comments

Comments
 (0)