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

Sign up
Appearance settings

Commit 60085ad

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

File tree

10 files changed

+279
-247
lines changed

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)

AltStyle によって変換されたページ (->オリジナル) /