ConfirmAdmin = mlang_message("LOCK_ADMIN_ABORTED");
$this->ConfirmUser = mlang_message("LOCK_TIMED_OUT");
$this->LockAdmin = mlang_message("LOCK_RECORD_EDITED_BY");
$this->LockUser = mlang_message("LOCK_RECORD_EDITED");
$this->TableObj = &$dal->Table($this->lockTableName);
if(isset($_SESSION["UserID"]) && !is_null($_SESSION["UserID"]))
$this->UserID = $_SESSION["UserID"];
else
$this->UserID = "Guest";
}
function LockRecord($strtable,$keys)
{
$skeys = "";
foreach($keys as $ind=>$val)
{
if(strlen($skeys))
$skeys.="&";
$skeys.=rawurlencode($val);
}
$sdate=now();
// add a record - try to lock
$this->TableObj->startdatetime=$sdate;
$this->TableObj->confirmdatetime=$sdate;
$this->TableObj->sessionid=session_id();
$this->TableObj->table=$strtable;
$this->TableObj->keys=$skeys;
$this->TableObj->userid=$this->UserID;
$this->TableObj->action=1;
$this->TableObj->Add();
$arrDelete = array();
// check all locking records
$rstmp=$this->TableObj->Query(AddFieldWrappers("table")."=".db_prepare_string($strtable)." and ".AddFieldWrappers("keys")."=".db_prepare_string($skeys)." and ".AddFieldWrappers("action")."=1",AddFieldWrappers("id")." asc");
while($data = db_fetch_array($rstmp))
{
if(secondsPassedFrom($data["confirmdatetime"])>$this->UnlockTime)
{
// locking record is expired
$arrDelete[]=$data["id"];
}
else
{
// delete expired records
foreach($arrDelete as $ind=>$val)
{
$this->TableObj->id=$val;
$this->TableObj->Delete();
}
if($data["sessionid"]==session_id())
{
// locking was successful
return true;
}
else
{
// record is already locked, delete locking attempt
$this->TableObj->sessionid=session_id();
$this->TableObj->action=1;
$this->TableObj->table=$strtable;
$this->TableObj->keys=$skeys;
$this->TableObj->Delete();
return false;
}
}
}
return false;
}
function UnlockRecord($strtable,$keys,$sid)
{
if($sid=="")
$sid=session_id();
$skeys="";
foreach($keys as $ind=>$val)
{
if(strlen($skeys))
$skeys.="&";
$skeys.=rawurlencode($val);
}
$this->TableObj->table=$strtable;
$this->TableObj->keys=$skeys;
$this->TableObj->sessionid=$sid;
$this->TableObj->action=1;
$this->TableObj->Delete();
}
function ConfirmLock($strtable,$keys,&$message)
{
$skeys="";
foreach($keys as $ind=>$val)
{
if(strlen($skeys))
$skeys.="&";
$skeys.=rawurlencode($val);
}
// add locking attempt
$sdate=now();
$this->TableObj->startdatetime=$sdate;
$this->TableObj->confirmdatetime=$sdate;
$this->TableObj->sessionid=session_id();
$this->TableObj->table=$strtable;
$this->TableObj->keys=$skeys;
$this->TableObj->userid=$this->UserID;
$this->TableObj->action=1;
$this->TableObj->Add();
$rstmp=$this->TableObj->Query(AddFieldWrappers("table")."=".db_prepare_string($strtable)." and ".AddFieldWrappers("keys")."=".db_prepare_string($skeys)." and ".AddFieldWrappers("action")."=1",AddFieldWrappers("id")." asc");
$myfound=0; // total our records found
$newid=0; // last our record - added 5 lines ago
$oldid=0; // next to last our record
$newdate=""; // last our confirm time
$olddate=""; // next to last our confirm time
$otherfound=0; // other's records found between out last and next to last
$tempfound=0;
/*
...
$oldid
...(others's records - $otherfound total)
$newid
*/
// check all locking records, count records
while($data = db_fetch_array($rstmp))
{
if($data["sessionid"]==session_id())
{
$oldid=$newid;
$newid=$data["id"];
$newdate=$data["confirmdatetime"];
$olddate=$newdate;
$myfound++;
$otherfound=$tempfound;
$tempfound=0;
continue;
}
$tempfound++;
}
if($myfound>1 && !$otherfound)
{
// no other's records, locking is confirmed
$this->TableObj->id=$oldid;
$this->TableObj->confirmdatetime=now();
$this->TableObj->Update();
$this->TableObj->Reset();
$this->TableObj->id=$newid;
$this->TableObj->Delete();
return true;
}
elseif($myfound>1 && $otherfound)
{
// found some other's records
// check if previous record is not expired
if(secondsPassedFrom($olddate)>$this->UnlockTime-5)
{
// expired - delete locking record, confirm was not successful
$this->UnlockRecord($strtable,$keys,session_id());
$message=$this->ConfirmUser;
return false;
}
else
{
// not expired, locking is confirmed
$this->TableObj->id=$oldid;
$this->TableObj->confirmdatetime=now();
$this->TableObj->Update();
$this->TableObj->Reset();
$this->TableObj->id=$newid;
$this->TableObj->Delete();
return true;
}
}
else
{
// locking was lost
$this->UnlockRecord($strtable,$keys,session_id());
// check if locking was removed by admin or not
$rstmp=$this->TableObj->Query(AddFieldWrappers("table")."=".db_prepare_string($strtable)." and ".AddFieldWrappers("keys")."=".db_prepare_string($skeys)." and ".AddFieldWrappers("sessionid")."<>'".session_id()."' and ".AddFieldWrappers("action")."=2",AddFieldWrappers("id")." asc");
if($data = db_fetch_array($rstmp))
$message=mysprintf($this->ConfirmAdmin,array($data["userid"]));
else
$message=$this->ConfirmUser;
$this->TableObj->table=$strtable;
$this->TableObj->keys=$skeys;
$this->TableObj->action=2;
$this->TableObj->Delete();
return false;
}
}
function GetLockInfo($strtable,$keys,$links, $pageid)
{
$page=GetTableLink(GetTableURL($strtable), "edit");
$skeys="";
foreach($keys as $ind=>$val){
if(strlen($skeys))
$skeys.="&";
$skeys.=rawurlencode($val);
}
$rstmp=$this->TableObj->Query(AddFieldWrappers("table")."=".db_prepare_string($strtable)." and ".AddFieldWrappers("keys")."=".db_prepare_string($skeys)." and ".AddFieldWrappers("sessionid")."<>'".session_id()."' and ".AddFieldWrappers("action")."=1",AddFieldWrappers("id")." asc");
if($data = db_fetch_array($rstmp))
{
$sdate=now();
$arrDateTime=db2time($data["startdatetime"]);
$str=mysprintf($this->LockAdmin,array($data["userid"],round(secondsPassedFrom($data["startdatetime"])/60,2)));
if($links){
$str.=''.mlang_message("LOCK_UNLOCK").'';
$str.=''.mlang_message("LOCK_EDIT").'';
}
return $str;
}else
return "";
}
function UnlockAdmin($strtable,$keys,$startEdit)
{
$skeys="";
foreach($keys as $ind=>$val)
{
if(strlen($skeys))
$skeys.="&";
$skeys.=rawurlencode($val);
}
$sdate=now();
if($startEdit)
{
// add a record - lock
$this->TableObj->startdatetime=$sdate;
$this->TableObj->confirmdatetime=$sdate;
$this->TableObj->sessionid=session_id();
$this->TableObj->table=$strtable;
$this->TableObj->keys=$skeys;
$this->TableObj->userid=$this->UserID;
$this->TableObj->action=1;
$this->TableObj->Add();
}
// delete all other locking records
$rstmp=CustomQuery("delete from ".AddTableWrappers($this->lockTableName)." where ".AddFieldWrappers("table")."=".db_prepare_string($strtable)." and ".AddFieldWrappers("keys")."=".db_prepare_string($skeys)." and ".AddFieldWrappers("action")."=1 and ".AddFieldWrappers("sessionid")."<>'".session_id()."' ");
// inform other users that their locking were removed by locking
$rstmp=CustomQuery("delete from ".AddTableWrappers($this->lockTableName)." where ".AddFieldWrappers("startdatetime")."<'".format_datetime_custom(adddays(db2time(now()),-2),"yyyy-MM-dd HH:mm:ss")."' and ".AddFieldWrappers("action")."=2");
$this->TableObj->startdatetime=$sdate;
$this->TableObj->confirmdatetime=$sdate;
$this->TableObj->sessionid=session_id();
$this->TableObj->table=$strtable;
$this->TableObj->keys=$skeys;
$this->TableObj->userid=$this->UserID;
$this->TableObj->action=2;
$this->TableObj->Add();
}
}
?>