You are here

public function DatabaseLockBackend::lockMayBeAvailable in Drupal driver for SQL Server and SQL Azure 8.2

Same name in this branch
  1. 8.2 src/Lock/DatabaseLockBackend.php \Drupal\sqlsrv\Lock\DatabaseLockBackend::lockMayBeAvailable()
  2. 8.2 src/ProxyClass/Lock/DatabaseLockBackend.php \Drupal\sqlsrv\ProxyClass\Lock\DatabaseLockBackend::lockMayBeAvailable()

Checks if a lock is available for acquiring.

Parameters

string $name: Lock to acquire.

Return value

bool

Overrides DatabaseLockBackend::lockMayBeAvailable

File

src/Lock/DatabaseLockBackend.php, line 26
Contains \Drupal\sqlsrv\Lock\DatabaseLockBackend.

Class

DatabaseLockBackend
Workaround for an issue with floats:

Namespace

Drupal\sqlsrv\Lock

Code

public function lockMayBeAvailable($name) {
  $lock = $this->database
    ->query('SELECT CONVERT(varchar(50), expire, 128) as expire, value FROM {semaphore} WHERE name = :name', array(
    ':name' => $name,
  ))
    ->fetchAssoc();
  if (!$lock) {
    return true;
  }
  $expire = (double) $lock['expire'];
  $now = microtime(true);
  if ($now > $expire) {

    // We check two conditions to prevent a race condition where another
    // request acquired the lock and set a new expire time. We add a small
    // number to $expire to avoid errors with float to string conversion.
    return (bool) $this->database
      ->delete('semaphore')
      ->condition('name', $name)
      ->condition('value', $lock['value'])
      ->condition('expire', 0.0001 + $expire, '<=')
      ->execute();
  }
  return false;
}