Blob Blame History Raw
commit fc48cd10b4daca72217d7be42cd8eb71984d454a
Author: Andrew Beekhof <andrew@beekhof.net>
Date:   Fri Aug 30 17:51:06 2013 +1000

    Feature: cib: Allow values to be added/updated and removed in a single update
    
    (cherry picked from commit 9819039f15277c05011c6100934167227cfd135d)
    
    Conflicts:
    	attrd/commands.c

diff --git a/include/crm/cib.h b/include/crm/cib.h
index 7a694ac..5ff57eb 100644
--- a/include/crm/cib.h
+++ b/include/crm/cib.h
@@ -63,6 +63,7 @@ enum cib_call_options {
 	cib_discard_reply   = 0x00000010,
 	cib_no_children     = 0x00000020,
         cib_xpath_address   = 0x00000040,
+        cib_mixed_update    = 0x00000080,
 	cib_scope_local     = 0x00000100,
 	cib_dryrun    	    = 0x00000200,
 	cib_sync_call       = 0x00001000,
diff --git a/lib/cib/cib_ops.c b/lib/cib/cib_ops.c
index 4e1196b..26ae373 100644
--- a/lib/cib/cib_ops.c
+++ b/lib/cib/cib_ops.c
@@ -354,6 +354,23 @@ cib_process_modify(const char *op, int options, const char *section, xmlNode * r
         }
     }
 
+    if(options & cib_mixed_update) {
+        int max = 0, lpc;
+        xmlXPathObjectPtr xpathObj = xpath_search(*result_cib, "//@__delete__");
+
+        if (xpathObj) {
+            max = numXpathResults(xpathObj);
+            crm_log_xml_info(*result_cib, "Mixed result");
+        }
+
+        for (lpc = 0; lpc < max; lpc++) {
+            xmlNode *match = getXpathResult(xpathObj, lpc);
+            crm_debug("Destroying %s", (char *)xmlGetNodePath(match));
+            free_xml(match);
+        }
+
+        freeXpathObject(xpathObj);
+    }
     return pcmk_ok;
 }