Вход Регистрация
Файл: vendor/laravel/framework/src/Illuminate/Cache/DatabaseLock.php
Строк: 170
<?php

namespace IlluminateCache;

use 
IlluminateDatabaseConnection;
use 
IlluminateDatabaseQueryException;
use 
IlluminateSupportCarbon;

class 
DatabaseLock extends Lock
{
    
/**
     * The database connection instance.
     *
     * @var IlluminateDatabaseConnection
     */
    
protected $connection;

    
/**
     * The database table name.
     *
     * @var string
     */
    
protected $table;

    
/**
     * The prune probability odds.
     *
     * @var array
     */
    
protected $lottery;

    
/**
     * Create a new lock instance.
     *
     * @param  IlluminateDatabaseConnection  $connection
     * @param  string  $table
     * @param  string  $name
     * @param  int  $seconds
     * @param  string|null  $owner
     * @param  array  $lottery
     * @return void
     */
    
public function __construct(Connection $connection$table$name$seconds$owner null$lottery = [2100])
    {
        
parent::__construct($name$seconds$owner);

        
$this->connection $connection;
        
$this->table $table;
        
$this->lottery $lottery;
    }

    
/**
     * Attempt to acquire the lock.
     *
     * @return bool
     */
    
public function acquire()
    {
        try {
            
$this->connection->table($this->table)->insert([
                
'key' => $this->name,
                
'owner' => $this->owner,
                
'expiration' => $this->expiresAt(),
            ]);

            
$acquired true;
        } catch (
QueryException $e) {
            
$updated $this->connection->table($this->table)
                ->
where('key'$this->name)
                ->
where(function ($query) {
                    return 
$query->where('owner'$this->owner)->orWhere('expiration''<='time());
                })->
update([
                    
'owner' => $this->owner,
                    
'expiration' => $this->expiresAt(),
                ]);

            
$acquired $updated >= 1;
        }

        if (
random_int(1$this->lottery[1]) <= $this->lottery[0]) {
            
$this->connection->table($this->table)->where('expiration''<='time())->delete();
        }

        return 
$acquired;
    }

    
/**
     * Get the UNIX timestamp indicating when the lock should expire.
     *
     * @return int
     */
    
protected function expiresAt()
    {
        return 
$this->seconds time() + $this->seconds Carbon::now()->addDays(1)->getTimestamp();
    }

    
/**
     * Release the lock.
     *
     * @return bool
     */
    
public function release()
    {
        if (
$this->isOwnedByCurrentProcess()) {
            
$this->connection->table($this->table)
                        ->
where('key'$this->name)
                        ->
where('owner'$this->owner)
                        ->
delete();

            return 
true;
        }

        return 
false;
    }

    
/**
     * Releases this lock in disregard of ownership.
     *
     * @return void
     */
    
public function forceRelease()
    {
        
$this->connection->table($this->table)
                    ->
where('key'$this->name)
                    ->
delete();
    }

    
/**
     * Returns the owner value written into the driver for this lock.
     *
     * @return string
     */
    
protected function getCurrentOwner()
    {
        return 
optional($this->connection->table($this->table)->where('key'$this->name)->first())->owner;
    }

    
/**
     * Get the name of the database connection being used to manage the lock.
     *
     * @return string
     */
    
public function getConnectionName()
    {
        return 
$this->connection->getName();
    }
}
Онлайн: 0
Реклама