diff --git a/application/transaction.class.inc.php b/application/transaction.class.inc.php index 58e7f3952..3f7ae058b 100644 --- a/application/transaction.class.inc.php +++ b/application/transaction.class.inc.php @@ -46,15 +46,41 @@ class privUITransaction } /** - * Check whether a transaction is valid or not and remove the valid transaction from + * Check whether a transaction is valid or not and (optionally) remove the valid transaction from * the session so that another call to IsTransactionValid for the same transaction id * will return false * @param int $id Identifier of the transaction, as returned by GetNewTransactionId + * @param bool $bRemoveTransaction True if the transaction must be removed * @return bool True if the transaction is valid, false otherwise */ - public static function IsTransactionValid($id) + public static function IsTransactionValid($id, $bRemoveTransaction = true) { $bResult = false; + if (isset($_SESSION['transactions'])) + { + // Strictly speaking, the eight lines below should be grouped together + // inside the same critical section as above + // sem_acquire($rSemIdentified); + if (isset($_SESSION['transactions'][$id])) + { + $bResult = true; + if ($bRemoveTransaction) + { + unset($_SESSION['transactions'][$id]); + } + } + // sem_release($rSemIdentified); + } + return $bResult; + } + + /** + * Removes the transaction specified by its id + * @param int $id The Identifier (as returned by GetNewTranscationId) of the transaction to be removed. + * @return void + */ + public static function RemoveTransaction($id) + { if (isset($_SESSION['transactions'])) { // Strictly speaking, the three lines below should be grouped together @@ -62,12 +88,10 @@ class privUITransaction // sem_acquire($rSemIdentified); if (isset($_SESSION['transactions'][$id])) { - $bResult = true; unset($_SESSION['transactions'][$id]); } // sem_release($rSemIdentified); - } - return $bResult; + } } } ?> diff --git a/application/utils.inc.php b/application/utils.inc.php index a039a098b..ced553213 100644 --- a/application/utils.inc.php +++ b/application/utils.inc.php @@ -157,9 +157,14 @@ class utils return privUITransaction::GetNewTransactionId(); } - public static function IsTransactionValid($sId) + public static function IsTransactionValid($sId, $bRemoveTransaction = true) { - return privUITransaction::IsTransactionValid($sId); + return privUITransaction::IsTransactionValid($sId, $bRemoveTransaction); + } + + public static function RemoveTransaction($sId) + { + return privUITransaction::RemoveTransaction($sId); } public static function ReadFromFile($sFileName) diff --git a/pages/UI.php b/pages/UI.php index c47b5b6a9..f2d25eea8 100644 --- a/pages/UI.php +++ b/pages/UI.php @@ -881,7 +881,7 @@ try $oP->set_title(Dict::S('UI:ErrorPageTitle')); $oP->P(Dict::S('UI:ObjectDoesNotExist')); } - elseif (!utils::IsTransactionValid($sTransactionId)) + elseif (!utils::IsTransactionValid($sTransactionId, false)) { $oP->set_title(Dict::Format('UI:ModificationPageTitle_Object_Class', $oObj->GetName(), $sClassLabel)); $oP->p("".Dict::S('UI:Error:ObjectAlreadyUpdated')."\n"); @@ -916,6 +916,7 @@ try $oMyChange->Set("userinfo", $sUserString); $iChangeId = $oMyChange->DBInsert(); $oObj->DBUpdateTracked($oMyChange); + utils::RemoveTransaction($sTransactionId); $oP->p(Dict::Format('UI:Class_Object_Updated', MetaModel::GetName(get_class($oObj)), $oObj->GetName())); } @@ -1021,7 +1022,7 @@ try { throw new ApplicationException(Dict::Format('UI:Error:1ParametersMissing', 'class')); } - if (!utils::IsTransactionValid($sTransactionId)) + if (!utils::IsTransactionValid($sTransactionId, false)) { $oP->p("".Dict::S('UI:Error:ObjectAlreadyCreated')."\n"); } @@ -1051,6 +1052,7 @@ try $oMyChange->Set("userinfo", $sUserString); $iChangeId = $oMyChange->DBInsert(); $oObj->DBInsertTracked($oMyChange); + utils::RemoveTransaction($sTransactionId); $oP->set_title(Dict::S('UI:PageTitle:ObjectCreated')); $oP->add("