Пример #1
0
 protected function addRelatedObjects(array $options, array $result)
 {
     $result = parent::addRelatedObjects($options, $result);
     $triggerids = array_keys($result);
     // adding trigger dependencies
     if ($options['selectDependencies'] !== null && $options['selectDependencies'] != API_OUTPUT_COUNT) {
         $res = DBselect('SELECT td.triggerid_up,td.triggerid_down' . ' FROM trigger_depends td' . ' WHERE ' . dbConditionInt('td.triggerid_down', $triggerids));
         $relationMap = new CRelationMap();
         while ($relation = DBfetch($res)) {
             $relationMap->addRelation($relation['triggerid_down'], $relation['triggerid_up']);
         }
         $dependencies = $this->get(['output' => $options['selectDependencies'], 'triggerids' => $relationMap->getRelatedIds(), 'preservekeys' => true]);
         $result = $relationMap->mapMany($result, $dependencies, 'dependencies');
     }
     // adding items
     if ($options['selectItems'] !== null && $options['selectItems'] != API_OUTPUT_COUNT) {
         $relationMap = $this->createRelationMap($result, 'triggerid', 'itemid', 'functions');
         $items = API::Item()->get(['output' => $options['selectItems'], 'itemids' => $relationMap->getRelatedIds(), 'webitems' => true, 'nopermissions' => true, 'preservekeys' => true]);
         $result = $relationMap->mapMany($result, $items, 'items');
     }
     // adding discoveryrule
     if ($options['selectDiscoveryRule'] !== null && $options['selectDiscoveryRule'] != API_OUTPUT_COUNT) {
         $dbRules = DBselect('SELECT id.parent_itemid,td.triggerid' . ' FROM trigger_discovery td,item_discovery id,functions f' . ' WHERE ' . dbConditionInt('td.triggerid', $triggerids) . ' AND td.parent_triggerid=f.triggerid' . ' AND f.itemid=id.itemid');
         $relationMap = new CRelationMap();
         while ($rule = DBfetch($dbRules)) {
             $relationMap->addRelation($rule['triggerid'], $rule['parent_itemid']);
         }
         $discoveryRules = API::DiscoveryRule()->get(['output' => $options['selectDiscoveryRule'], 'itemids' => $relationMap->getRelatedIds(), 'nopermissions' => true, 'preservekeys' => true]);
         $result = $relationMap->mapOne($result, $discoveryRules, 'discoveryRule');
     }
     // adding last event
     if ($options['selectLastEvent'] !== null) {
         foreach ($result as $triggerId => $trigger) {
             $result[$triggerId]['lastEvent'] = [];
         }
         if (is_array($options['selectLastEvent'])) {
             $pkFieldId = $this->pk('events');
             $outputFields = ['objectid' => $this->fieldId('objectid', 'e'), 'ns' => $this->fieldId('ns', 'e'), $pkFieldId => $this->fieldId($pkFieldId, 'e')];
             foreach ($options['selectLastEvent'] as $field) {
                 if ($this->hasField($field, 'events')) {
                     $outputFields[$field] = $this->fieldId($field, 'e');
                 }
             }
             $outputFields = implode(',', $outputFields);
         } else {
             $outputFields = 'e.*';
         }
         // due to performance issues, avoid using 'ORDER BY' for outter SELECT
         $dbEvents = DBselect('SELECT ' . $outputFields . ' FROM events e' . ' JOIN (' . 'SELECT e2.source,e2.object,e2.objectid,MAX(clock) AS clock' . ' FROM events e2' . ' WHERE e2.source=' . EVENT_SOURCE_TRIGGERS . ' AND e2.object=' . EVENT_OBJECT_TRIGGER . ' AND ' . dbConditionInt('e2.objectid', $triggerids) . ' GROUP BY e2.source,e2.object,e2.objectid' . ') e3 ON e3.source=e.source' . ' AND e3.object=e.object' . ' AND e3.objectid=e.objectid' . ' AND e3.clock=e.clock');
         // in case there are multiple records with same 'clock' for one trigger, we'll get different 'ns'
         $lastEvents = [];
         while ($dbEvent = DBfetch($dbEvents)) {
             $triggerId = $dbEvent['objectid'];
             $ns = $dbEvent['ns'];
             // unset fields, that were not requested
             if (is_array($options['selectLastEvent'])) {
                 if (!in_array('objectid', $options['selectLastEvent'])) {
                     unset($dbEvent['objectid']);
                 }
                 if (!in_array('ns', $options['selectLastEvent'])) {
                     unset($dbEvent['ns']);
                 }
             }
             $lastEvents[$triggerId][$ns] = $dbEvent;
         }
         foreach ($lastEvents as $triggerId => $events) {
             // find max 'ns' for each trigger and that will be the 'lastEvent'
             $maxNs = max(array_keys($events));
             $result[$triggerId]['lastEvent'] = $events[$maxNs];
         }
         foreach ($lastEvents as $triggerId => $events) {
             // find max 'ns' for each trigger and that will be the 'lastEvent'
             $maxNs = max(array_keys($events));
             $result[$triggerId]['lastEvent'] = $events[$maxNs];
         }
     }
     return $result;
 }
Пример #2
0
 /**
  * Retrieves and adds additional requested data (options 'selectHosts', 'selectGroups', etc.) to result set.
  *
  * @param array		$options
  * @param array		$result
  *
  * @return array
  */
 protected function addRelatedObjects(array $options, array $result)
 {
     $result = parent::addRelatedObjects($options, $result);
     $triggerPrototypeIds = array_keys($result);
     if ($options['selectDependencies'] !== null && $options['selectDependencies'] != API_OUTPUT_COUNT) {
         // Add trigger prototype dependencies.
         $res = DBselect('SELECT td.triggerid_up,td.triggerid_down' . ' FROM trigger_depends td' . ' WHERE ' . dbConditionInt('td.triggerid_down', $triggerPrototypeIds));
         $relationMap = new CRelationMap();
         while ($relation = DBfetch($res)) {
             $relationMap->addRelation($relation['triggerid_down'], $relation['triggerid_up']);
         }
         $dependencies = API::getApiService()->select($this->tableName(), ['output' => $options['selectDependencies'], 'triggerids' => $relationMap->getRelatedIds(), 'preservekeys' => true]);
         $result = $relationMap->mapMany($result, $dependencies, 'dependencies');
     }
     // adding items
     if ($options['selectItems'] !== null && $options['selectItems'] != API_OUTPUT_COUNT) {
         $relationMap = $this->createRelationMap($result, 'triggerid', 'itemid', 'functions');
         $items = API::Item()->get(['output' => $options['selectItems'], 'itemids' => $relationMap->getRelatedIds(), 'webitems' => true, 'nopermissions' => true, 'preservekeys' => true, 'filter' => ['flags' => null]]);
         $result = $relationMap->mapMany($result, $items, 'items');
     }
     // adding discovery rule
     if ($options['selectDiscoveryRule'] !== null && $options['selectDiscoveryRule'] != API_OUTPUT_COUNT) {
         $dbRules = DBselect('SELECT id.parent_itemid,f.triggerid' . ' FROM item_discovery id,functions f' . ' WHERE ' . dbConditionInt('f.triggerid', $triggerPrototypeIds) . ' AND f.itemid=id.itemid');
         $relationMap = new CRelationMap();
         while ($rule = DBfetch($dbRules)) {
             $relationMap->addRelation($rule['triggerid'], $rule['parent_itemid']);
         }
         $discoveryRules = API::DiscoveryRule()->get(['output' => $options['selectDiscoveryRule'], 'itemids' => $relationMap->getRelatedIds(), 'nopermissions' => true, 'preservekeys' => true]);
         $result = $relationMap->mapOne($result, $discoveryRules, 'discoveryRule');
     }
     return $result;
 }
Пример #3
0
 protected function addRelatedObjects(array $options, array $result)
 {
     $result = parent::addRelatedObjects($options, $result);
     $triggerids = array_keys($result);
     // adding items
     if ($options['selectItems'] !== null && $options['selectItems'] != API_OUTPUT_COUNT) {
         $relationMap = $this->createRelationMap($result, 'triggerid', 'itemid', 'functions');
         $items = API::Item()->get(array('nodeids' => $options['nodeids'], 'output' => $options['selectItems'], 'itemids' => $relationMap->getRelatedIds(), 'webitems' => true, 'nopermissions' => true, 'preservekeys' => true, 'filter' => array('flags' => null)));
         $result = $relationMap->mapMany($result, $items, 'items');
     }
     // adding discoveryrule
     if ($options['selectDiscoveryRule'] !== null && $options['selectDiscoveryRule'] != API_OUTPUT_COUNT) {
         $dbRules = DBselect('SELECT id.parent_itemid,f.triggerid' . ' FROM item_discovery id,functions f' . ' WHERE ' . dbConditionInt('f.triggerid', $triggerids) . ' AND f.itemid=id.itemid');
         $relationMap = new CRelationMap();
         while ($rule = DBfetch($dbRules)) {
             $relationMap->addRelation($rule['triggerid'], $rule['parent_itemid']);
         }
         $discoveryRules = API::DiscoveryRule()->get(array('output' => $options['selectDiscoveryRule'], 'nodeids' => $options['nodeids'], 'itemids' => $relationMap->getRelatedIds(), 'nopermissions' => true, 'preservekeys' => true));
         $result = $relationMap->mapOne($result, $discoveryRules, 'discoveryRule');
     }
     return $result;
 }
Пример #4
0
 protected function addRelatedObjects(array $options, array $result)
 {
     $result = parent::addRelatedObjects($options, $result);
     $triggerids = array_keys($result);
     // adding trigger dependencies
     if ($options['selectDependencies'] !== null && $options['selectDependencies'] != API_OUTPUT_COUNT) {
         $res = DBselect('SELECT td.triggerid_up,td.triggerid_down' . ' FROM trigger_depends td' . ' WHERE ' . dbConditionInt('td.triggerid_down', $triggerids));
         $relationMap = new CRelationMap();
         while ($relation = DBfetch($res)) {
             $relationMap->addRelation($relation['triggerid_down'], $relation['triggerid_up']);
         }
         $dependencies = $this->get(array('triggerids' => $relationMap->getRelatedIds(), 'output' => $options['selectDependencies'], 'expandData' => true, 'preservekeys' => true));
         $result = $relationMap->mapMany($result, $dependencies, 'dependencies');
     }
     // adding items
     if ($options['selectItems'] !== null && $options['selectItems'] != API_OUTPUT_COUNT) {
         $relationMap = $this->createRelationMap($result, 'triggerid', 'itemid', 'functions');
         $items = API::Item()->get(array('nodeids' => $options['nodeids'], 'output' => $options['selectItems'], 'itemids' => $relationMap->getRelatedIds(), 'webitems' => true, 'nopermissions' => true, 'preservekeys' => true));
         $result = $relationMap->mapMany($result, $items, 'items');
     }
     // adding discoveryrule
     if ($options['selectDiscoveryRule'] !== null && $options['selectDiscoveryRule'] != API_OUTPUT_COUNT) {
         $dbRules = DBselect('SELECT id.parent_itemid,td.triggerid' . ' FROM trigger_discovery td,item_discovery id,functions f' . ' WHERE ' . dbConditionInt('td.triggerid', $triggerids) . ' AND td.parent_triggerid=f.triggerid' . ' AND f.itemid=id.itemid');
         $relationMap = new CRelationMap();
         while ($rule = DBfetch($dbRules)) {
             $relationMap->addRelation($rule['triggerid'], $rule['parent_itemid']);
         }
         $discoveryRules = API::DiscoveryRule()->get(array('output' => $options['selectDiscoveryRule'], 'nodeids' => $options['nodeids'], 'itemids' => $relationMap->getRelatedIds(), 'nopermissions' => true, 'preservekeys' => true));
         $result = $relationMap->mapOne($result, $discoveryRules, 'discoveryRule');
     }
     // adding last event
     if ($options['selectLastEvent'] !== null) {
         foreach ($result as $triggerId => $trigger) {
             $lastEvent = API::Event()->get(array('source' => EVENT_SOURCE_TRIGGERS, 'object' => EVENT_OBJECT_TRIGGER, 'objectids' => $triggerId, 'output' => $options['selectLastEvent'], 'nopermissions' => true, 'sortfield' => array('clock', 'eventid'), 'sortorder' => ZBX_SORT_DOWN, 'limit' => 1));
             $result[$triggerId]['lastEvent'] = $lastEvent ? reset($lastEvent) : array();
         }
     }
     return $result;
 }