80 lines
2.5 KiB
PHP
80 lines
2.5 KiB
PHP
![]() |
<?php
|
||
|
|
||
|
class ExclusiveLock
|
||
|
{
|
||
|
protected $key; // Lock key
|
||
|
protected $own = false; // Owner of lock
|
||
|
|
||
|
|
||
|
public function __construct($key=NULL) {
|
||
|
|
||
|
if ($key == NULL) {
|
||
|
throw new Exception('ExclusiveLock: Key must not be NULL!');
|
||
|
}
|
||
|
|
||
|
$this->key = $key;
|
||
|
}
|
||
|
|
||
|
function __destruct() {
|
||
|
|
||
|
if($this->own == TRUE) {
|
||
|
$this->unlock();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
// Poskusamo zakleniti datoteke za doloceno anketo
|
||
|
public function lock() {
|
||
|
global $global_user_id;
|
||
|
|
||
|
// Preverimo ce je datoteka zaklenjena in če je od tega minilo manj kot 15 minut
|
||
|
$sqlLocked = sisplet_query("SELECT COUNT(*)
|
||
|
FROM srv_lock
|
||
|
WHERE lock_key = '$this->key' AND locked='1' AND last_lock_date > NOW() - INTERVAL 15 MINUTE");
|
||
|
list($lockCount) = mysqli_fetch_row($sqlLocked);
|
||
|
|
||
|
// Datoteka je zaklenjena - mi nimamo dostopa do nje
|
||
|
if ($lockCount > 0){
|
||
|
$this->own = false;
|
||
|
}
|
||
|
// Datoteka je odklenjena - jo zaklenemo
|
||
|
else{
|
||
|
$sqlLock = sisplet_query("INSERT INTO srv_lock
|
||
|
(lock_key, locked, usr_id, last_lock_date)
|
||
|
VALUES
|
||
|
('".$this->key."', '1', '".$global_user_id."', NOW())
|
||
|
ON DUPLICATE KEY
|
||
|
UPDATE locked='1', usr_id='".$global_user_id."', last_lock_date=NOW()");
|
||
|
|
||
|
// Uspesno smo zaklenili datoteko - nastavimo, da smo owner in lahko operiramo z datoteko
|
||
|
if ($sqlLock) {
|
||
|
$this->own = true;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return $this->own;
|
||
|
}
|
||
|
|
||
|
// Odklenemo datoteko, ki jo generiramo
|
||
|
public function unlock() {
|
||
|
|
||
|
// Ce smo owner lahko odkelenmo datoteke za anketo
|
||
|
if($this->own){
|
||
|
|
||
|
// Updejtamo lock = '0' in popravimo datum odklepanja
|
||
|
$sqlUnlock = sisplet_query("UPDATE srv_lock SET locked='0', last_unlock_date=NOW() WHERE lock_key='".$this->key."'");
|
||
|
}
|
||
|
|
||
|
// Po odklepanju nismo vec owner
|
||
|
$this->own = false;
|
||
|
}
|
||
|
|
||
|
// Pridobimo datum zadnjega zaklepanja
|
||
|
function getLockDate(){
|
||
|
|
||
|
$sql = sisplet_query("SELECT DATE_FORMAT(last_lock_date, '%m.%d.%Y %T') FROM srv_lock WHERE lock_key='".$this->key."' AND locked='1'");
|
||
|
list($lastLockDate) = mysqli_fetch_row($sql);
|
||
|
|
||
|
return $lastLockDate;
|
||
|
}
|
||
|
};
|