137 lines
4 KiB
PHP
137 lines
4 KiB
PHP
|
|
<?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);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
?>
|