From 8c5b020961df2160b4824e320d54ac83a1daa1e2 Mon Sep 17 00:00:00 2001 From: Denis Flaven Date: Tue, 28 Jul 2015 10:40:53 +0000 Subject: [PATCH] Enhancements to file based transactions (still experimental) SVN:trunk[3648] --- application/transaction.class.inc.php | 64 +++++++++++++++++++++------ 1 file changed, 51 insertions(+), 13 deletions(-) diff --git a/application/transaction.class.inc.php b/application/transaction.class.inc.php index e882f622e..60d737d67 100644 --- a/application/transaction.class.inc.php +++ b/application/transaction.class.inc.php @@ -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); + } + } +}