1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
|
<?php
declare(strict_types=1);
namespace malkusch\lock\mutex;
use RuntimeException;
class PgAdvisoryLockMutex extends LockMutex
{
/**
* @var \PDO
*/
private $pdo;
/**
* @var int
*/
private $key1;
/**
* @var int
*/
private $key2;
/**
* @throws \RuntimeException
*/
public function __construct(\PDO $PDO, string $name)
{
$this->pdo = $PDO;
$hashed_name = hash('sha256', $name, true);
if (false === $hashed_name) { // @phpstan-ignore-line
throw new RuntimeException('Unable to hash the key, sha256 algorithm is not supported.');
}
[$bytes1, $bytes2] = str_split($hashed_name, 4);
$this->key1 = unpack('i', $bytes1)[1];
$this->key2 = unpack('i', $bytes2)[1];
}
public function lock(): void
{
$statement = $this->pdo->prepare('SELECT pg_advisory_lock(?,?)');
$statement->execute([
$this->key1,
$this->key2,
]);
}
public function unlock(): void
{
$statement = $this->pdo->prepare('SELECT pg_advisory_unlock(?,?)');
$statement->execute([
$this->key1,
$this->key2
]);
}
}
|