mirror of
https://github.com/Combodo/iTop.git
synced 2026-05-21 00:02:17 +02:00
Optimized memory usage when auditing large volumes of CIs (10'000 items was requiring 200 Mb, it now runs with 32 Mb -including the 30Mb overhead!)
SVN:1.2[1795]
This commit is contained in:
@@ -83,7 +83,7 @@ function FilterByContext(DBObjectSearch &$oFilter, ApplicationContext $oAppConte
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function GetRuleResultSet($iRuleId, $oDefinitionFilter, $oAppContext)
|
function GetRuleResultFilter($iRuleId, $oDefinitionFilter, $oAppContext)
|
||||||
{
|
{
|
||||||
$oRule = MetaModel::GetObject('AuditRule', $iRuleId);
|
$oRule = MetaModel::GetObject('AuditRule', $iRuleId);
|
||||||
$sOql = $oRule->Get('query');
|
$sOql = $oRule->Get('query');
|
||||||
@@ -95,23 +95,36 @@ function GetRuleResultSet($iRuleId, $oDefinitionFilter, $oAppContext)
|
|||||||
// The query returns directly the invalid elements
|
// The query returns directly the invalid elements
|
||||||
$oFilter = $oRuleFilter;
|
$oFilter = $oRuleFilter;
|
||||||
$oFilter->MergeWith($oDefinitionFilter);
|
$oFilter->MergeWith($oDefinitionFilter);
|
||||||
$oErrorObjectSet = new CMDBObjectSet($oFilter);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// The query returns only the valid elements, all the others are invalid
|
// The query returns only the valid elements, all the others are invalid
|
||||||
$oFilter = $oRuleFilter;
|
$aValidRows = $oRuleFilter->ToDataArray(array('id'));
|
||||||
$oErrorObjectSet = new CMDBObjectSet($oFilter);
|
$aValidIds = array();
|
||||||
$aValidIds = array(0); // Make sure that we have at least one value in the list
|
foreach($aValidRows as $aRow)
|
||||||
while($oObj = $oErrorObjectSet->Fetch())
|
|
||||||
{
|
{
|
||||||
$aValidIds[] = $oObj->GetKey();
|
$aValidIds[] = $aRow['id'];
|
||||||
}
|
}
|
||||||
$oFilter = clone $oDefinitionFilter;
|
$oFilter = clone $oDefinitionFilter;
|
||||||
$oFilter->AddCondition('id', $aValidIds, 'NOTIN');
|
if (count($aValidIds) > 0)
|
||||||
$oErrorObjectSet = new CMDBObjectSet($oFilter);
|
{
|
||||||
|
$aInDefSet = array();
|
||||||
|
foreach($oDefinitionFilter->ToDataArray(array('id')) as $aRow)
|
||||||
|
{
|
||||||
|
$aInDefSet[] = $aRow['id'];
|
||||||
}
|
}
|
||||||
return $oErrorObjectSet;
|
$aInvalids = array_diff($aInDefSet, $aValidIds);
|
||||||
|
if (count($aInvalids) > 0)
|
||||||
|
{
|
||||||
|
$oFilter->AddCondition('id', $aInvalids, 'IN');
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$oFilter->AddCondition('id', 0, '=');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $oFilter;
|
||||||
}
|
}
|
||||||
|
|
||||||
function GetReportColor($iTotal, $iErrors)
|
function GetReportColor($iTotal, $iErrors)
|
||||||
@@ -153,7 +166,8 @@ try
|
|||||||
$oDefinitionFilter = DBObjectSearch::FromOQL($oAuditCategory->Get('definition_set'));
|
$oDefinitionFilter = DBObjectSearch::FromOQL($oAuditCategory->Get('definition_set'));
|
||||||
FilterByContext($oDefinitionFilter, $oAppContext);
|
FilterByContext($oDefinitionFilter, $oAppContext);
|
||||||
$oDefinitionSet = new CMDBObjectSet($oDefinitionFilter);
|
$oDefinitionSet = new CMDBObjectSet($oDefinitionFilter);
|
||||||
$oErrorObjectSet = GetRuleResultSet($iRuleIndex, $oDefinitionFilter, $oAppContext);
|
$oFilter = GetRuleResultFilter($iRuleIndex, $oDefinitionFilter, $oAppContext);
|
||||||
|
$oErrorObjectSet = new CMDBObjectSet($oFilter);
|
||||||
$oAuditRule = MetaModel::GetObject('AuditRule', $iRuleIndex);
|
$oAuditRule = MetaModel::GetObject('AuditRule', $iRuleIndex);
|
||||||
$oP->add('<div class="page_header"><h1>Audit Errors: <span class="hilite">'.$oAuditRule->Get('description').'</span></h1><img style="margin-top: -20px; margin-right: 10px; float: right;" src="../images/stop.png"/></div>');
|
$oP->add('<div class="page_header"><h1>Audit Errors: <span class="hilite">'.$oAuditRule->Get('description').'</span></h1><img style="margin-top: -20px; margin-right: 10px; float: right;" src="../images/stop.png"/></div>');
|
||||||
$oP->p('<a href="./audit.php?'.$oAppContext->GetForLink().'">[Back to audit results]</a>');
|
$oP->p('<a href="./audit.php?'.$oAppContext->GetForLink().'">[Back to audit results]</a>');
|
||||||
@@ -211,12 +225,12 @@ try
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
$oRuleFilter = DBObjectSearch::FromOQL($oAuditRule->Get('query'));
|
$oFilter = GetRuleResultFilter($oAuditRule->GetKey(), $oDefinitionFilter, $oAppContext);
|
||||||
$oErrorObjectSet = GetRuleResultSet($oAuditRule->GetKey(), $oDefinitionFilter, $oAppContext);
|
$aErrors = $oFilter->ToDataArray(array('id'));
|
||||||
$iErrorsCount = $oErrorObjectSet->Count();
|
$iErrorsCount = count($aErrors);
|
||||||
while($oObj = $oErrorObjectSet->Fetch())
|
foreach($aErrors as $aErrorRow)
|
||||||
{
|
{
|
||||||
$aObjectsWithErrors[$oObj->GetKey()] = true;
|
$aObjectsWithErrors[$aErrorRow['id']] = true;
|
||||||
}
|
}
|
||||||
$aRow['nb_errors'] = ($iErrorsCount == 0) ? '0' : "<a href=\"?operation=errors&category=".$oAuditCategory->GetKey()."&rule=".$oAuditRule->GetKey()."&".$oAppContext->GetForLink()."\">$iErrorsCount</a>";
|
$aRow['nb_errors'] = ($iErrorsCount == 0) ? '0' : "<a href=\"?operation=errors&category=".$oAuditCategory->GetKey()."&rule=".$oAuditRule->GetKey()."&".$oAppContext->GetForLink()."\">$iErrorsCount</a>";
|
||||||
$aRow['percent_ok'] = sprintf('%.2f', 100.0 * (($iCount - $iErrorsCount) / $iCount));
|
$aRow['percent_ok'] = sprintf('%.2f', 100.0 * (($iCount - $iErrorsCount) / $iCount));
|
||||||
@@ -263,7 +277,6 @@ try
|
|||||||
$oP->add("</td></tr>\n");
|
$oP->add("</td></tr>\n");
|
||||||
$oP->add("</table>\n");
|
$oP->add("</table>\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
$oP->output();
|
$oP->output();
|
||||||
}
|
}
|
||||||
catch(CoreException $e)
|
catch(CoreException $e)
|
||||||
|
|||||||
Reference in New Issue
Block a user