Selaa lähdekoodia

Prevent infinite cross-ticket recursion when propagating parent->child resolution in tickets.

git-svn-id: http://svn.code.sf.net/p/itop/code/trunk@4045 a333f486-631f-4898-b8df-5754b55c2be0
dflaven 9 vuotta sitten
vanhempi
commit
10a57a267a

+ 20 - 9
datamodels/2.x/itop-incident-mgmt-itil/datamodel.itop-incident-mgmt-itil.xml

@@ -1164,15 +1164,22 @@
           </arguments>
           <code><![CDATA[	public function ResolveChildTickets()
 	{
+        static $aRequests = array(); // prevent infinite recursion
+        static $Incidents = array(); // prevent infinite recursion
+  
 		if (MetaModel::IsValidClass('UserRequest'))
-		{
-			// Automatically resolve child requests
-			$sOQL = "SELECT UserRequest WHERE parent_incident_id = :ticket AND status != 'resolved'";
-			$oChildRequestSet = new DBObjectSet(DBObjectSearch::FromOQL($sOQL), array(), array('ticket' => $this->GetKey()));
-			while($oRequest = $oChildRequestSet->Fetch())
-			{
-				$oRequest->ResolveFrom($this);
-			}
+		{    		
+    		// Automatically resolve child requests
+    		$sOQL = "SELECT UserRequest WHERE parent_incident_id = :ticket AND status != 'resolved'";
+    		$oChildRequestSet = new DBObjectSet(DBObjectSearch::FromOQL($sOQL), array(), array('ticket' => $this->GetKey()));
+    		while($oRequest = $oChildRequestSet->Fetch())
+    		{
+    			if (!array_key_exists($oRequest->GetKey(), $aRequests))
+    			{
+    				$aRequests[$oRequest->GetKey()] = true;
+    				$oRequest->ResolveFrom($this);
+    			}
+    		}
 		}
 
 		// Automatically resolve child incidents
@@ -1180,7 +1187,11 @@
 		$oChildIncidentSet = new DBObjectSet(DBObjectSearch::FromOQL($sOQL), array(), array('ticket' => $this->GetKey()));
 		while($oIncident = $oChildIncidentSet->Fetch())
 		{
-			$oIncident->ResolveFrom($this);
+            if (!array_key_exists($oIncident->GetKey(), $Incidents))
+            {
+                $Incidents[$oIncident->GetKey()] = true;
+			    $oIncident->ResolveFrom($this);
+            }
 		}
 		return true;
 	}]]></code>

+ 7 - 1
datamodels/2.x/itop-request-mgmt-itil/datamodel.itop-request-mgmt-itil.xml

@@ -1278,12 +1278,18 @@
           </arguments>
           <code><![CDATA[	public function ResolveChildTickets()
 	{
+        static $aTickets = array(); // prevent infinite recursion
+    
 		// Automatically resolve child requests
 		$sOQL = "SELECT UserRequest WHERE parent_request_id = :ticket AND status != 'resolved'";
 		$oChildRequestSet = new DBObjectSet(DBObjectSearch::FromOQL($sOQL), array(), array('ticket' => $this->GetKey()));
 		while($oRequest = $oChildRequestSet->Fetch())
 		{
-			$oRequest->ResolveFrom($this);
+            if (!array_key_exists($oRequest->GetKey(), $aTickets))
+            {
+                $aTickets[$oRequest->GetKey()] = true;
+			    $oRequest->ResolveFrom($this);
+            }
 		}
 		return true;
 	}]]></code>

+ 7 - 1
datamodels/2.x/itop-request-mgmt/datamodel.itop-request-mgmt.xml

@@ -1280,12 +1280,18 @@
           </arguments>
           <code><![CDATA[	public function ResolveChildTickets()
 	{
+		static $aTickets = array(); // prevent infinite recursion
+		
 		// Automatically resolve child requests
 		$sOQL = "SELECT UserRequest WHERE parent_request_id = :ticket AND status != 'resolved'";
 		$oChildRequestSet = new DBObjectSet(DBObjectSearch::FromOQL($sOQL), array(), array('ticket' => $this->GetKey()));
 		while($oRequest = $oChildRequestSet->Fetch())
 		{
-			$oRequest->ResolveFrom($this);
+			if (!array_key_exists($oRequest->GetKey(), $aTickets))
+			{
+				$aTickets[$oRequest->GetKey()] = true;
+				$oRequest->ResolveFrom($this);
+			}
 		}
 		return true;
 	}]]></code>