Enhancements to file based transactions (still experimental)

SVN:trunk[3648]
This commit is contained in:
Denis Flaven
2015-07-28 10:40:53 +00:00
parent a426cf07e9
commit 8c5b020961

View File

@@ -192,7 +192,7 @@ class privUITransactionFile
}
self::CleanupOldTransactions();
$id = basename(tempnam(APPROOT.'data/transactions', substr(UserRights::GetUser(), 0, 10).'-'));
IssueLog::Info('GetNewTransactionId: Created transaction: '.$id);
self::Info('GetNewTransactionId: Created transaction: '.$id);
return (string)$id;
}
@@ -207,25 +207,27 @@ class privUITransactionFile
*/
public static function IsTransactionValid($id, $bRemoveTransaction = true)
{
$bResult = file_exists(APPROOT.'data/transactions/'.$id);
$sFilepath = APPROOT.'data/transactions/'.$id;
clearstatcache(true, $sFilepath);
$bResult = file_exists($sFilepath);
if ($bResult)
{
if ($bRemoveTransaction)
{
$bResult = @unlink(APPROOT.'data/transactions/'.$id);
if (!$bSuccess)
$bResult = @unlink($sFilepath);
if (!$bResult)
{
IssueLog::Error('IsTransactionValid: FAILED to remove transaction '.$id);
self::Error('IsTransactionValid: FAILED to remove transaction '.$id);
}
else
{
IssueLog::Info('IsTransactionValid: Removed transaction: '.$id);
self::Info('IsTransactionValid: OK. Removed transaction: '.$id);
}
}
}
else
{
IssueLog::Info("IsTransactionValid: Transaction '$id' not found. Pending transactions for this user:\n".implode("\n", self::GetPendingTransactions()));
self::Info("IsTransactionValid: Transaction '$id' not found. Pending transactions for this user:\n".implode("\n", self::GetPendingTransactions()));
}
return $bResult;
}
@@ -238,31 +240,40 @@ class privUITransactionFile
public static function RemoveTransaction($id)
{
$bSuccess = true;
if(!file_exists(APPROOT.'data/transactions/'.$id))
$sFilepath = APPROOT.'data/transactions/'.$id;
clearstatcache(true, $sFilepath);
if(!file_exists($sFilepath))
{
$bSuccess = false;
IssueLog::Info("RemoveTransaction: Transaction '$id' not found. Pending transactions for this user:\n".implode("\n", self::GetPendingTransactions()));
self::Error("RemoveTransaction: Transaction '$id' not found. Pending transactions for this user:\n".implode("\n", self::GetPendingTransactions()));
}
$bSuccess = @unlink(APPROOT.'data/transactions/'.$id);
$bSuccess = @unlink($sFilepath);
if (!$bSuccess)
{
IssueLog::Error('RemoveTransaction: FAILED to remove transaction '.$id);
self::Error('RemoveTransaction: FAILED to remove transaction '.$id);
}
else
{
self::Info('RemoveTransaction: OK '.$id);
}
return $bSuccess;
}
/**
* Cleanup old transactions which have been pending since more than 24 hours
* Use filemtime instead of filectime since filectime may be affected by operations on the directory (like changing the access rights)
*/
protected static function CleanupOldTransactions()
{
$iLimit = time() - 24*3600;
clearstatcache();
$aTransactions = glob(APPROOT.'data/transactions/*-*');
foreach($aTransactions as $sFileName)
{
if (filectime($sFileName) < $iLimit)
if (filemtime($sFileName) < $iLimit)
{
@unlink($sFileName);
self::Info('CleanupOldTransactions: Deleted transaction: '.$sFileName);
}
}
}
@@ -284,5 +295,32 @@ class privUITransactionFile
return $aResult;
}
}
protected static function Info($sText)
{
self::Write('Info | '.$sText);
}
protected static function Warning($sText)
{
self::Write('Warning | '.$sText);
}
protected static function Error($sText)
{
self::Write('Error | '.$sText);
}
protected static function Write($sText)
{
$hLogFile = @fopen(APPROOT.'log/transactions.log', 'a');
if ($hLogFile !== false)
{
flock($hLogFile, LOCK_EX);
$sDate = date('Y-m-d H:i:s');
fwrite($hLogFile, "$sDate | $sText\n");
fflush($hLogFile);
flock($hLogFile, LOCK_UN);
fclose($hLogFile);
}
}
}