From dfb1ae83c75c877218e1083b061b469fe6895128 Mon Sep 17 00:00:00 2001 From: Romain Quetiez Date: Fri, 10 Sep 2010 18:49:48 +0000 Subject: [PATCH] Fixed issue on deletion: was not recursive, leading to data integrity issues SVN:trunk[815] --- core/dbobject.class.php | 25 ++++++++++++++++++++----- pages/UI.php | 6 ++++-- 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/core/dbobject.class.php b/core/dbobject.class.php index b59515d51..5bcee5c46 100644 --- a/core/dbobject.class.php +++ b/core/dbobject.class.php @@ -1245,11 +1245,22 @@ abstract class DBObject return $aDependentObjects; } - public function GetDeletionScheme() + /** + * $aDeletedObjs = array(); // [class][key] => structure + * $aResetedObjs = array(); // [class][key] => object + */ + public function GetDeletionScheme(&$aDeletedObjs, &$aResetedObjs, $aVisited = array()) { + if (array_key_exists(get_class($this), $aVisited)) + { + if (in_array($this->GetKey(), $aVisited[get_class($this)])) + { + return; + } + } + $aVisited[get_class($this)] = $this->GetKey(); + $aDependentObjects = $this->GetReferencingObjects(); - $aDeletedObjs = array(); // [class][key] => structure - $aResetedObjs = array(); // [class][key] => object foreach ($aDependentObjects as $sRemoteClass => $aPotentialDeletes) { foreach ($aPotentialDeletes as $sRemoteExtKey => $aData) @@ -1292,13 +1303,17 @@ abstract class DBObject // First time we find the given object in the list // (and most likely case is that no other occurence will be found) $aDeletedObjs[$sRemoteClass][$iId]['to_delete'] = $oDependentObj; - $aDeletedObjs[$sRemoteClass][$iId]['auto_delete'] = ($iDeletePropagationOption == DEL_AUTO); + $aDeletedObjs[$sRemoteClass][$iId]['auto_delete'] = ($iDeletePropagationOption == DEL_AUTO); + // Recursively inspect this object + if ($iDeletePropagationOption == DEL_AUTO) + { + $oDependentObj->GetDeletionScheme($aDeletedObjs, $aResetedObjs, $aVisited); + } } } } } } - return array($aDeletedObjs, $aResetedObjs); } } diff --git a/pages/UI.php b/pages/UI.php index d54727164..6ad441099 100644 --- a/pages/UI.php +++ b/pages/UI.php @@ -38,8 +38,10 @@ function DeleteObjects(WebPage $oP, $sClass, $aObjects, $bDeleteConfirmed) { // Evaluate the impact on the DB integrity // - list ($aDeletedObjs, $aResetedObjs) = $oObj->GetDeletionScheme(); - + $aDeletedObjs = array(); + $aResetedObjs = array(); + $oObj->GetDeletionScheme($aDeletedObjs, $aResetedObjs); + // Evaluate feasibility (user access control) // foreach ($aDeletedObjs as $sRemoteClass => $aDeletes)