diff -uNrp zabbix-2.0.4.orig/frontends/php/api/classes/CTrigger.php zabbix-2.0.4/frontends/php/api/classes/CTrigger.php --- zabbix-2.0.4.orig/frontends/php/api/classes/CTrigger.php 2012-12-08 20:09:20.000000000 +0900 +++ zabbix-2.0.4/frontends/php/api/classes/CTrigger.php 2013-04-02 08:15:58.817370472 +0900 @@ -1278,6 +1278,114 @@ class CTrigger extends CTriggerGeneral { return array('triggerids' => zbx_objectValues($triggers, 'triggerid')); } + private function copy_trigger($oldid) { + /* select * from triggers where triggerid=$oldid; */ + $item = DBselect('select * from triggers where triggerid='.$oldid); + $tr = DBfetch($item); + $newids = DB::insert('triggers', array(array( + 'expression' => $tr['expression'], + 'description' => $tr['description'], + 'url' => $tr['url'], + 'status' => $tr['status'], + 'value' => $tr['value'], + 'priority' => $tr['priority'], + 'lastchange' => $tr['lastchange'], + 'comments' => $tr['comments'], + 'error' => $tr['error'], + 'templateid' => $tr['templateid'], + 'type' => $tr['type'], + 'value_flags' => $tr['value_flags'], + 'flags' => $tr['flags'] + ))); + return $newids[0]; + } + + private function update_triggerid($oldid) { + /* create same trigger, because constraint exists */ + $newid = $this->copy_trigger($oldid); + + /* + update functions set triggerid=$newid where triggerid=$oldid; + update services set triggerid=$newid where triggerid=$oldid; + update sysmaps_link_triggers set triggerid=$newid where triggerid=$oldid; + update escalations set triggerid=$newid where triggerid=$oldid; + update trigger_discovery set triggerid=$newid where triggerid=$oldid; + update trigger_discovery set parent_triggerid=$newid where parent_triggerid=$oldid; + update trigger_depends set triggerid_up=$newid where triggerid_up=$oldid; + update trigger_depends set triggerid_down=$newid where triggerid_down=$oldid; + update events set objectid=$newid where objectid=$oldid and source=0; + */ + DB::update('functions', array( + 'values' => array('triggerid' => $newid), + 'where'=> array('triggerid' => $oldid) + )); + DB::update('services', array( + 'values' => array('triggerid' => $newid), + 'where'=> array('triggerid' => $oldid) + )); + DB::update('sysmaps_link_triggers', array( + 'values' => array('triggerid' => $newid), + 'where'=> array('triggerid' => $oldid) + )); + DB::update('escalations', array( + 'values' => array('triggerid' => $newid), + 'where'=> array('triggerid' => $oldid) + )); + DB::update('trigger_discovery', array( + 'values' => array('triggerid' => $newid), + 'where'=> array('triggerid' => $oldid) + )); + DB::update('trigger_discovery', array( + 'values' => array('parent_triggerid' => $newid), + 'where'=> array('parent_triggerid' => $oldid) + )); + DB::update('trigger_depends', array( + 'values' => array('triggerid_up' => $newid), + 'where'=> array('triggerid_up' => $oldid) + )); + DB::update('trigger_depends', array( + 'values' => array('triggerid_down' => $newid), + 'where'=> array('triggerid_down' => $oldid) + )); + DB::update('events', array( + 'values' => array('objectid' => $newid), + 'where'=> array('objectid' => $oldid, 'source' => 0) + )); + + /* remove original trigger */ + $this->delete(array($oldid)); + + return $newid; + } + + private function adjust_down_triggerid(array $up_trig_ids) { + /* select triggerid_down from trigger_depends where triggerid_up in ... */ + $selids = $up_trig_ids[0]; + for ($i = 1; $i < count($up_trig_ids); $i++) { + $selids .= ','.$up_trig_ids[$i]; + } + $ids = DBselect('select triggerid_down from trigger_depends where triggerid_up in ('.$selids.')'); + $down_trig_ids = array(); + while ($id = DBfetch($ids)) { + array_push($down_trig_ids, $id['triggerid_down']); + } + if (($num = count($down_trig_ids)) == 0) return; + + for ($i = 0; $i < $num; $i++) { + $down_trig_ids[$i] = $this->update_triggerid($down_trig_ids[$i]); + } + + $this->adjust_down_triggerid($down_trig_ids); + } + + private function adjust_triggerid($oldid) { + $newid = $this->update_triggerid($oldid); + + $this->adjust_down_triggerid(array($newid)); + + return $newid; + } + /** * Update triggers. * @@ -1299,7 +1402,8 @@ class CTrigger extends CTriggerGeneral { $this->checkInput($triggers, __FUNCTION__); $this->updateReal($triggers); - foreach ($triggers as $trigger) { + for ($i = 0; $i < count($triggers); $i++) { + $trigger = $triggers[$i]; $this->inherit($trigger); // replace dependencies @@ -1307,6 +1411,17 @@ class CTrigger extends CTriggerGeneral { $this->deleteDependencies($trigger); if ($trigger['dependencies']) { + foreach ($trigger['dependencies'] as $depTrigger) { + if ($trigger['triggerid'] < $depTrigger['triggerid']) { + $new_triggerid = $this->adjust_triggerid($trigger['triggerid']); + $trigger['triggerid'] = $new_triggerid; + $triggers[$i]['triggerid'] = $new_triggerid; + break; + } + } + } + + if ($trigger['dependencies']) { $newDeps = array(); foreach ($trigger['dependencies'] as $depTrigger) { $newDeps[] = array(