]> xenbits.xensource.com Git - libvirt.git/commitdiff
util: Move JSON object deflattening code to json utility file
authorPeter Krempa <pkrempa@redhat.com>
Mon, 26 Jun 2017 14:29:04 +0000 (16:29 +0200)
committerPeter Krempa <pkrempa@redhat.com>
Tue, 11 Jul 2017 12:02:28 +0000 (14:02 +0200)
The code will become more universal so it makes more sense for it to
live with the rest of the JSON functions.

src/libvirt_private.syms
src/util/virjson.c
src/util/virjson.h
src/util/virstoragefile.c

index a2addca9c3333c73a9531292ce29587a7c92cfbd..6331f1a73473a5fbdb995ebadf9f9eaf5e092a2f 100644 (file)
@@ -1933,6 +1933,7 @@ virJSONValueObjectAppendNumberUlong;
 virJSONValueObjectAppendString;
 virJSONValueObjectCreate;
 virJSONValueObjectCreateVArgs;
+virJSONValueObjectDeflatten;
 virJSONValueObjectForeachKeyValue;
 virJSONValueObjectGet;
 virJSONValueObjectGetArray;
index 76d1d36f17fa71b19989c1ff4621db8bf4825723..3c3a54bc7c5360d2d016a1956cfacb6a146ad06b 100644 (file)
@@ -1965,3 +1965,64 @@ virJSONStringReformat(const char *jsonstr,
     virJSONValueFree(json);
     return ret;
 }
+
+
+static int
+virJSONValueObjectDeflattenWorker(const char *key,
+                                  virJSONValuePtr value,
+                                  void *opaque)
+{
+    virJSONValuePtr retobj = opaque;
+    virJSONValuePtr newval = NULL;
+    const char *newkey;
+
+    if (!(newkey = STRSKIP(key, "file."))) {
+        virReportError(VIR_ERR_INVALID_ARG, "%s",
+                       _("JSON object is neither nested nor flattened"));
+        return -1;
+    }
+
+    if (!(newval = virJSONValueCopy(value)))
+        return -1;
+
+    if (virJSONValueObjectAppend(retobj, newkey, newval) < 0) {
+        virJSONValueFree(newval);
+        return -1;
+    }
+
+    return 0;
+}
+
+
+/**
+ * virJSONValueObjectDeflatten:
+ *
+ * In some cases it's possible to nest JSON objects by prefixing object members
+ * with the parent object name followed by the dot and then the attribute name
+ * rather than directly using a nested value object (e.g qemu's JSON
+ * pseudo-protocol in backing file definition).
+ *
+ * This function will attempt to reverse the process and provide a nested json
+ * hierarchy so that the parsers can be kept simple and we still can use the
+ * weird syntax some users might use.
+ *
+ * Currently this function will flatten out just the 'file.' prefix into a new
+ * tree. Any other syntax will be rejected.
+ */
+virJSONValuePtr
+virJSONValueObjectDeflatten(virJSONValuePtr json)
+{
+    virJSONValuePtr ret;
+
+    if (!(ret = virJSONValueNewObject()))
+        return NULL;
+
+    if (virJSONValueObjectForeachKeyValue(json,
+                                          virJSONValueObjectDeflattenWorker,
+                                          ret) < 0) {
+        virJSONValueFree(ret);
+        return NULL;
+    }
+
+    return ret;
+}
index c9d9752de1cbefec555d329af357faed29694c7d..e89a776ab58d2266e4bb30384da2bddcddd6107f 100644 (file)
@@ -186,4 +186,6 @@ virJSONValuePtr virJSONValueCopy(const virJSONValue *in);
 
 char *virJSONStringReformat(const char *jsonstr, bool pretty);
 
+virJSONValuePtr virJSONValueObjectDeflatten(virJSONValuePtr json);
+
 #endif /* __VIR_JSON_H_ */
index f0ed5c6bd4e732f85d1bedcbe45c12c0fc173393..52c5301fffd4a34ce956287e65e2413aa8dc55fd 100644 (file)
@@ -3244,69 +3244,6 @@ static const struct virStorageSourceJSONDriverParser jsonParsers[] = {
 };
 
 
-static int
-virStorageSourceParseBackingJSONDeflattenWorker(const char *key,
-                                                virJSONValuePtr value,
-                                                void *opaque)
-{
-    virJSONValuePtr retobj = opaque;
-    virJSONValuePtr newval = NULL;
-    const char *newkey;
-
-    if (!(newkey = STRSKIP(key, "file."))) {
-        virReportError(VIR_ERR_INVALID_ARG, "%s",
-                       _("JSON backing file syntax is neither nested nor "
-                         "flattened"));
-        return -1;
-    }
-
-    if (!(newval = virJSONValueCopy(value)))
-        return -1;
-
-    if (virJSONValueObjectAppend(retobj, newkey, newval) < 0) {
-        virJSONValueFree(newval);
-        return -1;
-    }
-
-    return 0;
-}
-
-
-/**
- * virStorageSourceParseBackingJSONDeflatten:
- *
- * The json: pseudo-protocol syntax in qemu allows multiple approaches to
- * describe nesting of the values. This is due to the lax handling of the string
- * in qemu and the fact that internally qemu is flattening the values using '.'.
- *
- * This allows to specify nested json strings either using nested json objects
- * or prefixing object members with the parent object name followed by the dot.
- *
- * This function will attempt to reverse the process and provide a nested json
- * hierarchy so that the parsers can be kept simple and we still can use the
- * weird syntax some users might use.
- *
- * Currently this function will flatten out just the 'file.' prefix into a new
- * tree. Any other syntax will be rejected.
- */
-static virJSONValuePtr
-virStorageSourceParseBackingJSONDeflatten(virJSONValuePtr json)
-{
-    virJSONValuePtr ret;
-
-    if (!(ret = virJSONValueNewObject()))
-        return NULL;
-
-    if (virJSONValueObjectForeachKeyValue(json,
-                                          virStorageSourceParseBackingJSONDeflattenWorker,
-                                          ret) < 0) {
-        virJSONValueFree(ret);
-        return NULL;
-    }
-
-    return ret;
-}
-
 
 static int
 virStorageSourceParseBackingJSONInternal(virStorageSourcePtr src,
@@ -3320,7 +3257,7 @@ virStorageSourceParseBackingJSONInternal(virStorageSourcePtr src,
     int ret = -1;
 
     if (!(file = virJSONValueObjectGetObject(json, "file"))) {
-        if (!(fixedroot = virStorageSourceParseBackingJSONDeflatten(json)))
+        if (!(fixedroot = virJSONValueObjectDeflatten(json)))
             goto cleanup;
 
         file = fixedroot;