Fix: Changing a group's attributes causes duplicate rows in the icinga_*group_members table

fixes #10422
This commit is contained in:
Gunnar Beutner 2015-10-26 09:36:13 +01:00
parent 27e15a9654
commit 13375d74fc
2 changed files with 36 additions and 18 deletions

View File

@ -55,15 +55,24 @@ void HostGroupDbObject::OnConfigUpdate(void)
{ {
HostGroup::Ptr group = static_pointer_cast<HostGroup>(GetObject()); HostGroup::Ptr group = static_pointer_cast<HostGroup>(GetObject());
DbQuery query1;
query1.Table = DbType::GetByName("HostGroup")->GetTable() + "_members";
query1.Type = DbQueryDelete;
query1.Category = DbCatConfig;
query1.WhereCriteria = new Dictionary();
query1.WhereCriteria->Set("instance_id", 0); /* DbConnection class fills in real ID */
query1.WhereCriteria->Set("hostgroup_id", DbValue::FromObjectInsertID(group));
OnQuery(query1);
BOOST_FOREACH(const Host::Ptr& host, group->GetMembers()) { BOOST_FOREACH(const Host::Ptr& host, group->GetMembers()) {
DbQuery query1; DbQuery query2;
query1.Table = DbType::GetByName("HostGroup")->GetTable() + "_members"; query2.Table = DbType::GetByName("HostGroup")->GetTable() + "_members";
query1.Type = DbQueryInsert; query2.Type = DbQueryInsert;
query1.Category = DbCatConfig; query2.Category = DbCatConfig;
query1.Fields = new Dictionary(); query2.Fields = new Dictionary();
query1.Fields->Set("instance_id", 0); /* DbConnection class fills in real ID */ query2.Fields->Set("instance_id", 0); /* DbConnection class fills in real ID */
query1.Fields->Set("hostgroup_id", DbValue::FromObjectInsertID(group)); query2.Fields->Set("hostgroup_id", DbValue::FromObjectInsertID(group));
query1.Fields->Set("host_object_id", host); query2.Fields->Set("host_object_id", host);
OnQuery(query1); OnQuery(query2);
} }
} }

View File

@ -54,15 +54,24 @@ void ServiceGroupDbObject::OnConfigUpdate(void)
{ {
ServiceGroup::Ptr group = static_pointer_cast<ServiceGroup>(GetObject()); ServiceGroup::Ptr group = static_pointer_cast<ServiceGroup>(GetObject());
DbQuery query1;
query1.Table = DbType::GetByName("ServiceGroup")->GetTable() + "_members";
query1.Type = DbQueryDelete;
query1.Category = DbCatConfig;
query1.WhereCriteria = new Dictionary();
query1.WhereCriteria->Set("instance_id", 0); /* DbConnection class fills in real ID */
query1.WhereCriteria->Set("servicegroup_id", DbValue::FromObjectInsertID(group));
OnQuery(query1);
BOOST_FOREACH(const Service::Ptr& service, group->GetMembers()) { BOOST_FOREACH(const Service::Ptr& service, group->GetMembers()) {
DbQuery query1; DbQuery query2;
query1.Table = DbType::GetByName("ServiceGroup")->GetTable() + "_members"; query2.Table = DbType::GetByName("ServiceGroup")->GetTable() + "_members";
query1.Type = DbQueryInsert; query2.Type = DbQueryInsert;
query1.Category = DbCatConfig; query2.Category = DbCatConfig;
query1.Fields = new Dictionary(); query2.Fields = new Dictionary();
query1.Fields->Set("instance_id", 0); /* DbConnection class fills in real ID */ query2.Fields->Set("instance_id", 0); /* DbConnection class fills in real ID */
query1.Fields->Set("servicegroup_id", DbValue::FromObjectInsertID(group)); query2.Fields->Set("servicegroup_id", DbValue::FromObjectInsertID(group));
query1.Fields->Set("service_object_id", service); query2.Fields->Set("service_object_id", service);
OnQuery(query1); OnQuery(query2);
} }
} }