From 12a330b50ce33f943c575fd0483d29f42a65d714 Mon Sep 17 00:00:00 2001 From: Peter Krempa Date: Tue, 5 Feb 2019 18:45:05 +0100 Subject: [PATCH] util: json: Introduce helper to prepend string into a virJSONValueObject MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 Reviewed-by: Ján Tomko --- src/libvirt_private.syms | 1 + src/util/virjson.c | 60 +++++++++++++++++++++++++++++++--------- src/util/virjson.h | 1 + 3 files changed, 49 insertions(+), 13 deletions(-) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 1d9eb17a86..1479db9402 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -2244,6 +2244,7 @@ virJSONValueObjectGetValue; virJSONValueObjectHasKey; virJSONValueObjectIsNull; virJSONValueObjectKeysNumber; +virJSONValueObjectPrependString; virJSONValueObjectRemoveKey; virJSONValueObjectStealArray; virJSONValueObjectStealObject; diff --git a/src/util/virjson.c b/src/util/virjson.c index d2664b9d57..1cf2fb1e5c 100644 --- a/src/util/virjson.c +++ b/src/util/virjson.c @@ -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,27 +629,60 @@ 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; } +int +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, + bool prepend) +{ + virJSONValuePtr jvalue = virJSONValueNewString(value); + if (!jvalue) + return -1; + if (virJSONValueObjectInsert(object, key, jvalue, prepend) < 0) { + virJSONValueFree(jvalue); + return -1; + } + return 0; +} + + int virJSONValueObjectAppendString(virJSONValuePtr object, const char *key, const char *value) { - virJSONValuePtr jvalue = virJSONValueNewString(value); - if (!jvalue) - return -1; - if (virJSONValueObjectAppend(object, key, jvalue) < 0) { - virJSONValueFree(jvalue); - return -1; - } - return 0; + return virJSONValueObjectInsertString(object, key, value, false); +} + + +int +virJSONValueObjectPrependString(virJSONValuePtr object, + const char *key, + const char *value) +{ + return virJSONValueObjectInsertString(object, key, value, true); } diff --git a/src/util/virjson.h b/src/util/virjson.h index 41404a9a3e..a5f959595f 100644 --- a/src/util/virjson.h +++ b/src/util/virjson.h @@ -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);