Browse Source

Enhancements to file based transactions (still experimental)

git-svn-id: http://svn.code.sf.net/p/itop/code/trunk@3648 a333f486-631f-4898-b8df-5754b55c2be0
dflaven 10 years ago
parent
commit
49266514ac
1 changed files with 51 additions and 13 deletions
  1. 51 13
      application/transaction.class.inc.php

+ 51 - 13
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);
+		}
+	}
+}