help.verua.ch/include/class.lock.php

137 lines
4 KiB
PHP
Raw Permalink Normal View History

2026-01-05 08:46:20 +01:00
<?php
/*********************************************************************
class.lock.php
Ticket lock handle.
Peter Rotich <peter@osticket.com>
Copyright (c) 2006-2010 osTicket
http://www.osticket.com
Released under the GNU General Public License WITHOUT ANY WARRANTY.
See LICENSE.TXT for details.
vim: expandtab sw=4 ts=4 sts=4:
$Id: $
**********************************************************************/
/*
* Mainly used as a helper...
*/
class TicketLock {
var $id;
var $staff_id;
var $created;
var $expire;
var $expiretime;
function TicketLock($id,$load=true){
$this->id=$id;
if($load) $this->load();
}
function load() {
if(!$this->id)
return false;
$sql='SELECT *,TIME_TO_SEC(TIMEDIFF(expire,NOW())) as timeleft FROM '.TICKET_LOCK_TABLE.' WHERE lock_id='.db_input($this->id);
if(($res=db_query($sql)) && db_num_rows($res)) {
$info=db_fetch_array($res);
$this->id=$info['lock_id'];
$this->staff_id=$info['staff_id'];
$this->created=$info['created'];
$this->expire=$info['expire'];
$this->expiretime=time()+$info['timeleft'];
return true;
}
$this->id=0;
return false;
}
function reload() {
return $this->load();
}
//Create a ticket lock...this function assumes the caller check for access & validity of ticket & staff x-ship.
function acquire($ticketId,$staffId) {
global $cfg;
if(!$ticketId or !$staffId or !$cfg->getLockTime())
return 0;
//Cleanup any expired locks on the ticket.
db_query('DELETE FROM '.TICKET_LOCK_TABLE.' WHERE ticket_id='.db_input($ticketId).' AND expire<NOW()');
//TODO: cleanup any other locks owned by the user? (NOT a good idea.. could be working on 2 tickets at once??)
$sql='INSERT IGNORE INTO '.TICKET_LOCK_TABLE.' SET created=NOW() '.
',ticket_id='.db_input($ticketId).
',staff_id='.db_input($staffId).
',expire=DATE_ADD(NOW(),INTERVAL '.$cfg->getLockTime().' MINUTE) ';
return db_query($sql)?db_insert_id():0;
}
//Renew existing lock.
function renew() {
global $cfg;
$sql='UPDATE '.TICKET_LOCK_TABLE.' SET expire=DATE_ADD(NOW(),INTERVAL '.$cfg->getLockTime().' MINUTE) '.
' WHERE lock_id='.db_input($this->getId());
//echo $sql;
if(db_query($sql) && db_affected_rows()) {
$this->reload();
return true;
}
return false;
}
//release aka delete a lock.
function release(){
//FORCED release - we don't give a ....
$sql='DELETE FROM '.TICKET_LOCK_TABLE.' WHERE lock_id='.db_input($this->getId());
return (db_query($sql) && db_affected_rows())?true:false;
}
function getId(){
return $this->id;
}
function getStaffId(){
return $this->staff_id;
}
function getCreateTime() {
return $this->created;
}
function getExpireTime() {
return $this->expire;
}
//Get remaiming time before the lock expires
function getTime() {
return $this->isExpired()?0:($this->expiretime-time());
}
//Should we be doing realtime check here? (Ans: not really....expiretime is local & based on loadtime)
function isExpired(){
return (time()>$this->expiretime)?true:false;
}
//Simply remove ALL locks a user (staff) holds on a ticket(s).
function removeStaffLocks($staffId,$ticketId=0) {
$sql='DELETE FROM '.TICKET_LOCK_TABLE.' WHERE staff_id='.db_input($staffId);
if($ticketId)
$sql.=' AND ticket_id='.db_input($ticketId);
return db_query($sql)?true:false;
}
//Called via cron
function cleanup() {
//Cleanup any expired locks.
db_query('DELETE FROM '.TICKET_LOCK_TABLE.' WHERE expire<NOW()');
@db_query('OPTIMIZE TABLE '.TICKET_LOCK_TABLE);
}
}
?>