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

SVN:trunk[4045]
This commit is contained in:
Denis Flaven
2016-05-10 15:33:48 +00:00
parent a618f2804b
commit 89328e1662
3 changed files with 34 additions and 11 deletions

View File

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

View File

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

View File

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