[libvirt] [PATCH 1/4] json: support removing a value from an object

Osier Yang jyang at redhat.com
Mon May 13 08:05:47 UTC 2013


On 27/04/13 05:01, Eric Blake wrote:
> In an upcoming patch, I need the way to safely transfer a nested
> virJSON object out of its parent container for independent use,
> even after the parent is freed.
>
> * src/util/virjson.h (virJSONValueObjectRemoveKey): New function.
> (_virJSONObject, _virJSONArray): Use correct type.
> * src/util/virjson.c (virJSONValueObjectRemoveKey): Implement it.
> * src/libvirt_private.syms (virjson.h): Export it.
> * tests/jsontest.c (mymain): Test it.
>
> Signed-off-by: Eric Blake <eblake at redhat.com>
> ---
>   src/libvirt_private.syms |  1 +
>   src/util/virjson.c       | 34 +++++++++++++++++++-
>   src/util/virjson.h       |  9 ++++--
>   tests/jsontest.c         | 83 ++++++++++++++++++++++++++++++++++++++++++++++--
>   4 files changed, 120 insertions(+), 7 deletions(-)
>
> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> index 0bb6f5f..b502ed8 100644
> --- a/src/libvirt_private.syms
> +++ b/src/libvirt_private.syms
> @@ -1392,6 +1392,7 @@ virJSONValueObjectGetValue;
>   virJSONValueObjectHasKey;
>   virJSONValueObjectIsNull;
>   virJSONValueObjectKeysNumber;
> +virJSONValueObjectRemoveKey;
>   virJSONValueToString;
>
>
> diff --git a/src/util/virjson.c b/src/util/virjson.c
> index e6a3b1b..10afe88 100644
> --- a/src/util/virjson.c
> +++ b/src/util/virjson.c
> @@ -1,7 +1,7 @@
>   /*
>    * virjson.c: JSON object parsing/formatting
>    *
> - * Copyright (C) 2009-2010, 2012 Red Hat, Inc.
> + * Copyright (C) 2009-2010, 2012-2013 Red Hat, Inc.
>    * Copyright (C) 2009 Daniel P. Berrange
>    *
>    * This library is free software; you can redistribute it and/or
> @@ -447,6 +447,38 @@ const char *virJSONValueObjectGetKey(virJSONValuePtr object, unsigned int n)
>       return object->data.object.pairs[n].key;
>   }
>
> +/* Remove the key-value pair tied to KEY out of OBJECT.  If VALUE is
> + * not NULL, the dropped value object is returned instead of freed.

How about:

s/KEY/@key/, s/OBJECT/@object/, s/VALUE/@value/, ?

> + * Returns 1 on success, 0 if no key was found, and -1 on error.  */
> +int
> +virJSONValueObjectRemoveKey(virJSONValuePtr object, const char *key,
> +                            virJSONValuePtr *value)
> +{
> +    int i;
> +
> +    if (value)
> +        *value = NULL;
> +
> +    if (object->type != VIR_JSON_TYPE_OBJECT)
> +        return -1;
> +
> +    for (i = 0 ; i < object->data.object.npairs ; i++) {
> +        if (STREQ(object->data.object.pairs[i].key, key)) {
> +            if (value) {
> +                *value = object->data.object.pairs[i].value;
> +                object->data.object.pairs[i].value = NULL;
> +            }
> +            VIR_FREE(object->data.object.pairs[i].key);
> +            virJSONValueFree(object->data.object.pairs[i].value);
> +            VIR_DELETE_ELEMENT(object->data.object.pairs, i,
> +                               object->data.object.npairs);
> +            return 1;
> +        }
> +    }
> +
> +    return 0;
> +}
> +
>   virJSONValuePtr virJSONValueObjectGetValue(virJSONValuePtr object, unsigned int n)
>   {
>       if (object->type != VIR_JSON_TYPE_OBJECT)
> diff --git a/src/util/virjson.h b/src/util/virjson.h
> index 67f4398..ff0fe75 100644
> --- a/src/util/virjson.h
> +++ b/src/util/virjson.h
> @@ -1,7 +1,7 @@
>   /*
>    * virjson.h: JSON object parsing/formatting
>    *
> - * Copyright (C) 2009, 2012 Red Hat, Inc.
> + * Copyright (C) 2009, 2012-2013 Red Hat, Inc.
>    * Copyright (C) 2009 Daniel P. Berrange
>    *
>    * This library is free software; you can redistribute it and/or
> @@ -55,12 +55,12 @@ struct _virJSONObjectPair {
>   };
>
>   struct _virJSONObject {
> -    unsigned int npairs;
> +    size_t npairs;
>       virJSONObjectPairPtr pairs;
>   };
>
>   struct _virJSONArray {
> -    unsigned int nvalues;
> +    size_t nvalues;
>       virJSONValuePtr *values;
>   };
>
> @@ -131,6 +131,9 @@ int virJSONValueObjectAppendNumberDouble(virJSONValuePtr object, const char *key
>   int virJSONValueObjectAppendBoolean(virJSONValuePtr object, const char *key, int boolean);
>   int virJSONValueObjectAppendNull(virJSONValuePtr object, const char *key);
>
> +int virJSONValueObjectRemoveKey(virJSONValuePtr object, const char *key,

Worth to add ATTRIBUTE_NONNULL for "object" and "key"?
  with the questions.

ACK with the two questions resolved.




More information about the libvir-list mailing list