[libvirt] [libvirt-glib 3/4] Split gvir_config_object_attach

Christophe Fergeau cfergeau at redhat.com
Wed Jan 18 15:50:43 UTC 2012


Most of the time we want gvir_config_object_attach to replace
existing nodes, but sometimes (for <devices> subnodes) we want
it to append the new node and to keep the existing nodes with
the same name. This commit solves this by adding 2 distinct helpers,
_attach_add and _attach_replace.
This should fix some unexpected behaviour of various _set_ functions
which were appending new nodes instead of replacing the existing one.
---
 libvirt-gconfig/libvirt-gconfig-domain.c           |   20 +++++++++++---------
 libvirt-gconfig/libvirt-gconfig-object-private.h   |    6 ++++--
 libvirt-gconfig/libvirt-gconfig-object.c           |   20 ++++++++++++++++++--
 .../libvirt-gconfig-storage-pool-target.c          |    4 ++--
 libvirt-gconfig/libvirt-gconfig-storage-pool.c     |    8 ++++----
 .../libvirt-gconfig-storage-vol-target.c           |    4 ++--
 libvirt-gconfig/libvirt-gconfig-storage-vol.c      |    8 ++++----
 libvirt-gconfig/libvirt-gconfig.sym                |    1 -
 8 files changed, 45 insertions(+), 26 deletions(-)

diff --git a/libvirt-gconfig/libvirt-gconfig-domain.c b/libvirt-gconfig/libvirt-gconfig-domain.c
index fba1ee2..cf5aa17 100644
--- a/libvirt-gconfig/libvirt-gconfig-domain.c
+++ b/libvirt-gconfig/libvirt-gconfig-domain.c
@@ -290,8 +290,8 @@ void gvir_config_domain_set_clock(GVirConfigDomain *domain,
     g_return_if_fail(GVIR_CONFIG_IS_DOMAIN(domain));
     g_return_if_fail(GVIR_CONFIG_IS_DOMAIN_CLOCK(klock));
 
-    gvir_config_object_attach(GVIR_CONFIG_OBJECT(domain),
-                              GVIR_CONFIG_OBJECT(klock));
+    gvir_config_object_attach_replace(GVIR_CONFIG_OBJECT(domain),
+                                      GVIR_CONFIG_OBJECT(klock));
 }
 
 void gvir_config_domain_set_os(GVirConfigDomain *domain,
@@ -300,8 +300,8 @@ void gvir_config_domain_set_os(GVirConfigDomain *domain,
     g_return_if_fail(GVIR_CONFIG_IS_DOMAIN(domain));
     g_return_if_fail(GVIR_CONFIG_IS_DOMAIN_OS(os));
 
-    gvir_config_object_attach(GVIR_CONFIG_OBJECT(domain),
-                              GVIR_CONFIG_OBJECT(os));
+    gvir_config_object_attach_replace(GVIR_CONFIG_OBJECT(domain),
+                                      GVIR_CONFIG_OBJECT(os));
 }
 
 void gvir_config_domain_set_seclabel(GVirConfigDomain *domain,
@@ -310,8 +310,8 @@ void gvir_config_domain_set_seclabel(GVirConfigDomain *domain,
     g_return_if_fail(GVIR_CONFIG_IS_DOMAIN(domain));
     g_return_if_fail(GVIR_CONFIG_IS_DOMAIN_SECLABEL(seclabel));
 
-    gvir_config_object_attach(GVIR_CONFIG_OBJECT(domain),
-                              GVIR_CONFIG_OBJECT(seclabel));
+    gvir_config_object_attach_replace(GVIR_CONFIG_OBJECT(domain),
+                                      GVIR_CONFIG_OBJECT(seclabel));
 }
 
 void gvir_config_domain_set_lifecycle(GVirConfigDomain *domain,
@@ -354,10 +354,12 @@ void gvir_config_domain_set_devices(GVirConfigDomain *domain,
             g_warn_if_reached();
             continue;
         }
-        gvir_config_object_attach(devices_node, GVIR_CONFIG_OBJECT(it->data));
+        gvir_config_object_attach_add(devices_node,
+                                      GVIR_CONFIG_OBJECT(it->data));
     }
 
-    gvir_config_object_attach(GVIR_CONFIG_OBJECT(domain), devices_node);
+    gvir_config_object_attach_replace(GVIR_CONFIG_OBJECT(domain),
+                                      devices_node);
     g_object_unref(G_OBJECT(devices_node));
 }
 
@@ -372,7 +374,7 @@ void gvir_config_domain_add_device(GVirConfigDomain *domain,
     devices_node = gvir_config_object_add_child(GVIR_CONFIG_OBJECT(domain),
                                                 "devices");
 
-    gvir_config_object_attach(devices_node, GVIR_CONFIG_OBJECT(device));
+    gvir_config_object_attach_add(devices_node, GVIR_CONFIG_OBJECT(device));
     g_object_unref(G_OBJECT(devices_node));
 }
 
diff --git a/libvirt-gconfig/libvirt-gconfig-object-private.h b/libvirt-gconfig/libvirt-gconfig-object-private.h
index 922b0f3..781e1a3 100644
--- a/libvirt-gconfig/libvirt-gconfig-object-private.h
+++ b/libvirt-gconfig/libvirt-gconfig-object-private.h
@@ -76,8 +76,10 @@ void gvir_config_object_delete_children(GVirConfigObject *object, const char *ch
 void gvir_config_object_set_child(GVirConfigObject *object,
                                   xmlNodePtr child);
 
-void gvir_config_object_attach(GVirConfigObject *parent,
-                               GVirConfigObject *child);
+void gvir_config_object_attach_add(GVirConfigObject *parent,
+                                   GVirConfigObject *child);
+void gvir_config_object_attach_replace(GVirConfigObject *parent,
+                                       GVirConfigObject *child);
 void gvir_config_object_set_attribute(GVirConfigObject *object,
                                       ...) G_GNUC_NULL_TERMINATED;
 void gvir_config_object_set_attribute_with_type(GVirConfigObject *object,
diff --git a/libvirt-gconfig/libvirt-gconfig-object.c b/libvirt-gconfig/libvirt-gconfig-object.c
index dbb63a5..2e28208 100644
--- a/libvirt-gconfig/libvirt-gconfig-object.c
+++ b/libvirt-gconfig/libvirt-gconfig-object.c
@@ -803,12 +803,16 @@ gvir_config_object_set_attribute_with_type(GVirConfigObject *object, ...)
     va_end(args);
 }
 
-G_GNUC_INTERNAL void
-gvir_config_object_attach(GVirConfigObject *parent, GVirConfigObject *child)
+static void
+gvir_config_object_attach(GVirConfigObject *parent, GVirConfigObject *child, gboolean replace)
 {
     g_return_if_fail(GVIR_CONFIG_IS_OBJECT(parent));
     g_return_if_fail(GVIR_CONFIG_IS_OBJECT(child));
 
+    if (replace) {
+        gvir_config_object_delete_children(parent,
+                                           (char *)child->priv->node->name);
+    }
     xmlUnlinkNode(child->priv->node);
     xmlAddChild(parent->priv->node, child->priv->node);
     if (child->priv->doc != NULL) {
@@ -821,6 +825,18 @@ gvir_config_object_attach(GVirConfigObject *parent, GVirConfigObject *child)
 }
 
 G_GNUC_INTERNAL void
+gvir_config_object_attach_replace(GVirConfigObject *parent, GVirConfigObject *child)
+{
+    gvir_config_object_attach(parent, child, TRUE);
+}
+
+G_GNUC_INTERNAL void
+gvir_config_object_attach_add(GVirConfigObject *parent, GVirConfigObject *child)
+{
+    gvir_config_object_attach(parent, child, FALSE);
+}
+
+G_GNUC_INTERNAL void
 gvir_config_object_remove_attribute(GVirConfigObject *object,
                                     const char *attr_name)
 {
diff --git a/libvirt-gconfig/libvirt-gconfig-storage-pool-target.c b/libvirt-gconfig/libvirt-gconfig-storage-pool-target.c
index 56a8c98..0d7f164 100644
--- a/libvirt-gconfig/libvirt-gconfig-storage-pool-target.c
+++ b/libvirt-gconfig/libvirt-gconfig-storage-pool-target.c
@@ -86,6 +86,6 @@ void gvir_config_storage_pool_target_set_permissions(GVirConfigStoragePoolTarget
     g_return_if_fail(GVIR_CONFIG_IS_STORAGE_POOL_TARGET(target));
     g_return_if_fail(GVIR_CONFIG_IS_STORAGE_PERMISSIONS(perms));
 
-    gvir_config_object_attach(GVIR_CONFIG_OBJECT(target),
-                              GVIR_CONFIG_OBJECT(perms));
+    gvir_config_object_attach_replace(GVIR_CONFIG_OBJECT(target),
+                                      GVIR_CONFIG_OBJECT(perms));
 }
diff --git a/libvirt-gconfig/libvirt-gconfig-storage-pool.c b/libvirt-gconfig/libvirt-gconfig-storage-pool.c
index 3955251..c524c17 100644
--- a/libvirt-gconfig/libvirt-gconfig-storage-pool.c
+++ b/libvirt-gconfig/libvirt-gconfig-storage-pool.c
@@ -137,8 +137,8 @@ void gvir_config_storage_pool_set_source(GVirConfigStoragePool *pool,
     g_return_if_fail(GVIR_CONFIG_IS_STORAGE_POOL(pool));
     g_return_if_fail(GVIR_CONFIG_IS_STORAGE_POOL_SOURCE(source));
 
-    gvir_config_object_attach(GVIR_CONFIG_OBJECT(pool),
-                              GVIR_CONFIG_OBJECT(source));
+    gvir_config_object_attach_replace(GVIR_CONFIG_OBJECT(pool),
+                                      GVIR_CONFIG_OBJECT(source));
 }
 
 void gvir_config_storage_pool_set_target(GVirConfigStoragePool *pool,
@@ -147,6 +147,6 @@ void gvir_config_storage_pool_set_target(GVirConfigStoragePool *pool,
     g_return_if_fail(GVIR_CONFIG_IS_STORAGE_POOL(pool));
     g_return_if_fail(GVIR_CONFIG_IS_STORAGE_POOL_TARGET(target));
 
-    gvir_config_object_attach(GVIR_CONFIG_OBJECT(pool),
-                              GVIR_CONFIG_OBJECT(target));
+    gvir_config_object_attach_replace(GVIR_CONFIG_OBJECT(pool),
+                                      GVIR_CONFIG_OBJECT(target));
 }
diff --git a/libvirt-gconfig/libvirt-gconfig-storage-vol-target.c b/libvirt-gconfig/libvirt-gconfig-storage-vol-target.c
index d7dfca7..3786e2b 100644
--- a/libvirt-gconfig/libvirt-gconfig-storage-vol-target.c
+++ b/libvirt-gconfig/libvirt-gconfig-storage-vol-target.c
@@ -90,6 +90,6 @@ void gvir_config_storage_vol_target_set_permissions(GVirConfigStorageVolTarget *
     g_return_if_fail(GVIR_CONFIG_IS_STORAGE_VOL_TARGET(target));
     g_return_if_fail(GVIR_CONFIG_IS_STORAGE_PERMISSIONS(perms));
 
-    gvir_config_object_attach(GVIR_CONFIG_OBJECT(target),
-                              GVIR_CONFIG_OBJECT(perms));
+    gvir_config_object_attach_replace(GVIR_CONFIG_OBJECT(target),
+                                      GVIR_CONFIG_OBJECT(perms));
 }
diff --git a/libvirt-gconfig/libvirt-gconfig-storage-vol.c b/libvirt-gconfig/libvirt-gconfig-storage-vol.c
index 777efef..6281c02 100644
--- a/libvirt-gconfig/libvirt-gconfig-storage-vol.c
+++ b/libvirt-gconfig/libvirt-gconfig-storage-vol.c
@@ -107,8 +107,8 @@ void gvir_config_storage_vol_set_target(GVirConfigStorageVol *vol,
     g_return_if_fail(GVIR_CONFIG_IS_STORAGE_VOL(vol));
     g_return_if_fail(GVIR_CONFIG_IS_STORAGE_VOL_TARGET(target));
 
-    gvir_config_object_attach(GVIR_CONFIG_OBJECT(vol),
-                              GVIR_CONFIG_OBJECT(target));
+    gvir_config_object_attach_replace(GVIR_CONFIG_OBJECT(vol),
+                                      GVIR_CONFIG_OBJECT(target));
 }
 
 void gvir_config_storage_vol_set_backing_store(GVirConfigStorageVol *vol,
@@ -117,6 +117,6 @@ void gvir_config_storage_vol_set_backing_store(GVirConfigStorageVol *vol,
     g_return_if_fail(GVIR_CONFIG_IS_STORAGE_VOL(vol));
     g_return_if_fail(GVIR_CONFIG_IS_STORAGE_VOL_BACKING_STORE(backing_store));
 
-    gvir_config_object_attach(GVIR_CONFIG_OBJECT(vol),
-                              GVIR_CONFIG_OBJECT(backing_store));
+    gvir_config_object_attach_replace(GVIR_CONFIG_OBJECT(vol),
+                                      GVIR_CONFIG_OBJECT(backing_store));
 }
diff --git a/libvirt-gconfig/libvirt-gconfig.sym b/libvirt-gconfig/libvirt-gconfig.sym
index 9bfe1d9..0fcbd13 100644
--- a/libvirt-gconfig/libvirt-gconfig.sym
+++ b/libvirt-gconfig/libvirt-gconfig.sym
@@ -239,7 +239,6 @@ LIBVIRT_GCONFIG_0.0.4 {
 	gvir_config_object_get_schema;
 	gvir_config_object_to_xml;
 	gvir_config_object_validate;
-	gvir_config_object_attach;
 	gvir_config_object_set_attribute;
 	gvir_config_object_set_attribute_with_type;
 
-- 
1.7.7.5




More information about the libvir-list mailing list