[libvirt] [PATCH 08/21] qemu: qapi: Separate virQEMUQAPISchemaTraverse into functions by object type

Ján Tomko jtomko at redhat.com
Thu Apr 25 13:28:31 UTC 2019


On Mon, Apr 15, 2019 at 06:02:01PM +0200, Peter Krempa wrote:
>Simplify virQEMUQAPISchemaTraverse by separating out the necessary
>operations for given 'meta-type' into separate functions.
>
>Signed-off-by: Peter Krempa <pkrempa at redhat.com>
>---
> src/qemu/qemu_qapi.c | 117 ++++++++++++++++++++++++++++---------------
> 1 file changed, 78 insertions(+), 39 deletions(-)
>
>diff --git a/src/qemu/qemu_qapi.c b/src/qemu/qemu_qapi.c
>index 2652061f4e..5995e5006e 100644
>--- a/src/qemu/qemu_qapi.c
>+++ b/src/qemu/qemu_qapi.c
>@@ -105,68 +105,107 @@ static int
> virQEMUQAPISchemaTraverse(const char *baseName,
>                           char **query,
>                           virHashTablePtr schema,
>-                          virJSONValuePtr *type)
>+                          virJSONValuePtr *type);
>+
>+
>+static int
>+virQEMUQAPISchemaTraverseObject(virJSONValuePtr cur,
>+                                char **query,
>+                                virHashTablePtr schema,
>+                                virJSONValuePtr *type)
> {
>-    virJSONValuePtr curtype;
>     virJSONValuePtr obj;
>-    const char *metatype;
>     const char *querytype = NULL;
>-    const char *querystr;
>-    char modifier;
>+    const char *querystr = *query;
>+    char modifier = *querystr;
>+
>+    if (!c_isalpha(modifier))
>+        querystr++;
>+
>+    if (modifier == '+') {
>+        querytype = virQEMUQAPISchemaObjectGetType("variants",
>+                                                   querystr,
>+                                                   "case", cur);
>+    } else {
>+        obj = virQEMUQAPISchemaObjectGet("members", querystr, "name", cur);
>+
>+        if (modifier == '*' &&
>+            !virJSONValueObjectHasKey(obj, "default"))
>+            return 0;
>+
>+        querytype = virQEMUQAPISchemaTypeFromObject(obj);
>+    }
>
>-    if (!(curtype = virHashLookup(schema, baseName)))

The object-specific code lost the
    if (!querytype)
        return 0;
condition

[...]

>     } else if (STREQ(metatype, "object")) {
>-        querystr = *query;
>-        modifier = **query;
>-
>-        if (!c_isalpha(modifier))
>-            querystr++;
>-
>-        if (modifier == '+') {
>-            querytype = virQEMUQAPISchemaObjectGetType("variants",
>-                                                       querystr,
>-                                                       "case", curtype);
>-        } else {
>-            obj = virQEMUQAPISchemaObjectGet("members", querystr,
>-                                             "name", curtype);
>-
>-            if (modifier == '*' &&
>-                !virJSONValueObjectHasKey(obj, "default"))
>-                return 0;
>-
>-            querytype = virQEMUQAPISchemaTypeFromObject(obj);
>-        }
>-        query++;
>+        return virQEMUQAPISchemaTraverseObject(cur, query, schema, type);
>     } else if (STREQ(metatype, "command") ||
>                STREQ(metatype, "event")) {
>-        if (!(querytype = virJSONValueObjectGetString(curtype, *query)))
>-            return 0;
>-        query++;
>+        return virQEMUQAPISchemaTraverseCommand(cur, query, schema, type);
>     } else {
>         /* alternates, basic types and enums can't be entered */
>         return 0;
>     }
>
>-    if (!querytype)
>-        return 0;
>-

That was executed here.

Reviewed-by: Ján Tomko <jtomko at redhat.com>

Jano
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 488 bytes
Desc: not available
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20190425/423c4726/attachment-0001.sig>


More information about the libvir-list mailing list