From 13375d74fc009797f5236e293bb26dd5b85e101d Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Mon, 26 Oct 2015 09:36:13 +0100 Subject: [PATCH] Fix: Changing a group's attributes causes duplicate rows in the icinga_*group_members table fixes #10422 --- lib/db_ido/hostgroupdbobject.cpp | 27 ++++++++++++++++++--------- lib/db_ido/servicegroupdbobject.cpp | 27 ++++++++++++++++++--------- 2 files changed, 36 insertions(+), 18 deletions(-) diff --git a/lib/db_ido/hostgroupdbobject.cpp b/lib/db_ido/hostgroupdbobject.cpp index 9d96af5f5..8a9ce1cb3 100644 --- a/lib/db_ido/hostgroupdbobject.cpp +++ b/lib/db_ido/hostgroupdbobject.cpp @@ -55,15 +55,24 @@ void HostGroupDbObject::OnConfigUpdate(void) { HostGroup::Ptr group = static_pointer_cast(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()) { - DbQuery query1; - query1.Table = DbType::GetByName("HostGroup")->GetTable() + "_members"; - query1.Type = DbQueryInsert; - query1.Category = DbCatConfig; - query1.Fields = new Dictionary(); - query1.Fields->Set("instance_id", 0); /* DbConnection class fills in real ID */ - query1.Fields->Set("hostgroup_id", DbValue::FromObjectInsertID(group)); - query1.Fields->Set("host_object_id", host); - OnQuery(query1); + DbQuery query2; + query2.Table = DbType::GetByName("HostGroup")->GetTable() + "_members"; + query2.Type = DbQueryInsert; + query2.Category = DbCatConfig; + query2.Fields = new Dictionary(); + query2.Fields->Set("instance_id", 0); /* DbConnection class fills in real ID */ + query2.Fields->Set("hostgroup_id", DbValue::FromObjectInsertID(group)); + query2.Fields->Set("host_object_id", host); + OnQuery(query2); } } diff --git a/lib/db_ido/servicegroupdbobject.cpp b/lib/db_ido/servicegroupdbobject.cpp index b0fbefee6..3d5f92baa 100644 --- a/lib/db_ido/servicegroupdbobject.cpp +++ b/lib/db_ido/servicegroupdbobject.cpp @@ -54,15 +54,24 @@ void ServiceGroupDbObject::OnConfigUpdate(void) { ServiceGroup::Ptr group = static_pointer_cast(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()) { - DbQuery query1; - query1.Table = DbType::GetByName("ServiceGroup")->GetTable() + "_members"; - query1.Type = DbQueryInsert; - query1.Category = DbCatConfig; - query1.Fields = new Dictionary(); - query1.Fields->Set("instance_id", 0); /* DbConnection class fills in real ID */ - query1.Fields->Set("servicegroup_id", DbValue::FromObjectInsertID(group)); - query1.Fields->Set("service_object_id", service); - OnQuery(query1); + DbQuery query2; + query2.Table = DbType::GetByName("ServiceGroup")->GetTable() + "_members"; + query2.Type = DbQueryInsert; + query2.Category = DbCatConfig; + query2.Fields = new Dictionary(); + query2.Fields->Set("instance_id", 0); /* DbConnection class fills in real ID */ + query2.Fields->Set("servicegroup_id", DbValue::FromObjectInsertID(group)); + query2.Fields->Set("service_object_id", service); + OnQuery(query2); } } -- 2.40.0