]> xenbits.xensource.com Git - libvirt.git/commitdiff
util: json: Introduce helper to prepend string into a virJSONValueObject
authorPeter Krempa <pkrempa@redhat.com>
Tue, 5 Feb 2019 17:45:05 +0000 (18:45 +0100)
committerPeter Krempa <pkrempa@redhat.com>
Thu, 18 Jul 2019 15:59:34 +0000 (17:59 +0200)
Libvirt treats the JSON objects as lists thus the values appear in the
order they were added. To avoid too much changes introduce a helper
which allows to prepend a string which will allow to keep certain
outputs in order.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
src/libvirt_private.syms
src/util/virjson.c
src/util/virjson.h

index 1d9eb17a86b1135490e5000a7899f815e0ec972a..1479db940201dc2ea54dbace58817d8e3e2bfb87 100644 (file)
@@ -2244,6 +2244,7 @@ virJSONValueObjectGetValue;
 virJSONValueObjectHasKey;
 virJSONValueObjectIsNull;
 virJSONValueObjectKeysNumber;
+virJSONValueObjectPrependString;
 virJSONValueObjectRemoveKey;
 virJSONValueObjectStealArray;
 virJSONValueObjectStealObject;
index d2664b9d57715ab172246281c59c9c855c8d8fb5..1cf2fb1e5cf9438826c2a4260cfa812f6a8e4ed4 100644 (file)
@@ -606,10 +606,11 @@ virJSONValueNewObject(void)
 }
 
 
-int
-virJSONValueObjectAppend(virJSONValuePtr object,
+static int
+virJSONValueObjectInsert(virJSONValuePtr object,
                          const char *key,
-                         virJSONValuePtr value)
+                         virJSONValuePtr value,
+                         bool prepend)
 {
     virJSONObjectPair pair = { NULL, value };
     int ret = -1;
@@ -628,8 +629,13 @@ virJSONValueObjectAppend(virJSONValuePtr object,
     if (VIR_STRDUP(pair.key, key) < 0)
         return -1;
 
-    ret = VIR_APPEND_ELEMENT(object->data.object.pairs,
-                             object->data.object.npairs, pair);
+    if (prepend) {
+        ret = VIR_INSERT_ELEMENT(object->data.object.pairs, 0,
+                                 object->data.object.npairs, pair);
+    } else {
+        ret = VIR_APPEND_ELEMENT(object->data.object.pairs,
+                                 object->data.object.npairs, pair);
+    }
 
     VIR_FREE(pair.key);
     return ret;
@@ -637,14 +643,24 @@ virJSONValueObjectAppend(virJSONValuePtr object,
 
 
 int
-virJSONValueObjectAppendString(virJSONValuePtr object,
+virJSONValueObjectAppend(virJSONValuePtr object,
+                         const char *key,
+                         virJSONValuePtr value)
+{
+    return virJSONValueObjectInsert(object, key, value, false);
+}
+
+
+static int
+virJSONValueObjectInsertString(virJSONValuePtr object,
                                const char *key,
-                               const char *value)
+                               const char *value,
+                               bool prepend)
 {
     virJSONValuePtr jvalue = virJSONValueNewString(value);
     if (!jvalue)
         return -1;
-    if (virJSONValueObjectAppend(object, key, jvalue) < 0) {
+    if (virJSONValueObjectInsert(object, key, jvalue, prepend) < 0) {
         virJSONValueFree(jvalue);
         return -1;
     }
@@ -652,6 +668,24 @@ virJSONValueObjectAppendString(virJSONValuePtr object,
 }
 
 
+int
+virJSONValueObjectAppendString(virJSONValuePtr object,
+                               const char *key,
+                               const char *value)
+{
+    return virJSONValueObjectInsertString(object, key, value, false);
+}
+
+
+int
+virJSONValueObjectPrependString(virJSONValuePtr object,
+                                const char *key,
+                                const char *value)
+{
+    return virJSONValueObjectInsertString(object, key, value, true);
+}
+
+
 int
 virJSONValueObjectAppendNumberInt(virJSONValuePtr object,
                                   const char *key,
index 41404a9a3efc281909b94c52efed0942dd2d123e..a5f959595ff0b7fcfb7b4699524f65fd2803f3c2 100644 (file)
@@ -126,6 +126,7 @@ int virJSONValueObjectGetBoolean(virJSONValuePtr object, const char *key, bool *
 int virJSONValueObjectIsNull(virJSONValuePtr object, const char *key);
 
 int virJSONValueObjectAppendString(virJSONValuePtr object, const char *key, const char *value);
+int virJSONValueObjectPrependString(virJSONValuePtr object, const char *key, const char *value);
 int virJSONValueObjectAppendNumberInt(virJSONValuePtr object, const char *key, int number);
 int virJSONValueObjectAppendNumberUint(virJSONValuePtr object, const char *key, unsigned int number);
 int virJSONValueObjectAppendNumberLong(virJSONValuePtr object, const char *key, long long number);