Re: [libvirt] [PATCHv4 03/15] Switch from yajl to Jansson

2018-07-20 Thread Ján Tomko

On Thu, Jul 19, 2018 at 07:24:43PM -0400, John Ferlan wrote:



On 07/18/2018 10:44 AM, Ján Tomko wrote:

Yajl has not seen much activity upstream recently.
Switch to using Jansson >= 2.5.

All the platforms we target on https://libvirt.org/platforms.html
have a version >= 2.7 listed on the sites below:
https://repology.org/metapackage/jansson/versions
https://build.opensuse.org/package/show/devel:libraries:c_c++/libjansson

Additionally, Ubuntu 14.04 on Travis-CI has 2.5. Set the requirement
to 2.5 since we don't use anything from newer versions.

Implement virJSONValue{From,To}String using Jansson, delete the yajl
code (and the related virJSONParser structure) and report an error
if someone explicitly specifies --with-yajl.

Also adjust the test data to account for Jansson's different whitespace
usage for empty arrays and tune up the specfile to keep 'make rpm'
working when bisecting.

Signed-off-by: Ján Tomko 
---
 src/util/virjson.c | 211 +
 1 file changed, 211 insertions(+)



Too late now, but git bisect and running the test suite seems to be
broken starting with this patch as I started getting "FAIL:
qemublocktest" here running a bisect chasing something else.

As I found out "later" I didn't have jansson-devel dnf installed either,
so that may have affected my results. Who knows at this point.

The failure goes away with patch 13, but that introduced other issues
for me. I'll respond there with what I found.



Until patch 15/15, qemublocktest was only guarded by WITH_QEMU, despite
requiring a working JSON implementation, so that failure does not
surprise me.

Jano


signature.asc
Description: Digital signature
--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

Re: [libvirt] [PATCHv4 03/15] Switch from yajl to Jansson

2018-07-19 Thread John Ferlan


On 07/18/2018 10:44 AM, Ján Tomko wrote:
> Yajl has not seen much activity upstream recently.
> Switch to using Jansson >= 2.5.
> 
> All the platforms we target on https://libvirt.org/platforms.html
> have a version >= 2.7 listed on the sites below:
> https://repology.org/metapackage/jansson/versions
> https://build.opensuse.org/package/show/devel:libraries:c_c++/libjansson
> 
> Additionally, Ubuntu 14.04 on Travis-CI has 2.5. Set the requirement
> to 2.5 since we don't use anything from newer versions.
> 
> Implement virJSONValue{From,To}String using Jansson, delete the yajl
> code (and the related virJSONParser structure) and report an error
> if someone explicitly specifies --with-yajl.
> 
> Also adjust the test data to account for Jansson's different whitespace
> usage for empty arrays and tune up the specfile to keep 'make rpm'
> working when bisecting.
> 
> Signed-off-by: Ján Tomko 
> ---
>  src/util/virjson.c | 211 
> +
>  1 file changed, 211 insertions(+)
> 

Too late now, but git bisect and running the test suite seems to be
broken starting with this patch as I started getting "FAIL:
qemublocktest" here running a bisect chasing something else.

As I found out "later" I didn't have jansson-devel dnf installed either,
so that may have affected my results. Who knows at this point.

The failure goes away with patch 13, but that introduced other issues
for me. I'll respond there with what I found.

John


[...]

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

[libvirt] [PATCHv4 03/15] Switch from yajl to Jansson

2018-07-18 Thread Ján Tomko
Yajl has not seen much activity upstream recently.
Switch to using Jansson >= 2.5.

All the platforms we target on https://libvirt.org/platforms.html
have a version >= 2.7 listed on the sites below:
https://repology.org/metapackage/jansson/versions
https://build.opensuse.org/package/show/devel:libraries:c_c++/libjansson

Additionally, Ubuntu 14.04 on Travis-CI has 2.5. Set the requirement
to 2.5 since we don't use anything from newer versions.

Implement virJSONValue{From,To}String using Jansson, delete the yajl
code (and the related virJSONParser structure) and report an error
if someone explicitly specifies --with-yajl.

Also adjust the test data to account for Jansson's different whitespace
usage for empty arrays and tune up the specfile to keep 'make rpm'
working when bisecting.

Signed-off-by: Ján Tomko 
---
 src/util/virjson.c | 211 +
 1 file changed, 211 insertions(+)

diff --git a/src/util/virjson.c b/src/util/virjson.c
index 29530dcb15..608ba85d67 100644
--- a/src/util/virjson.c
+++ b/src/util/virjson.c
@@ -1985,6 +1985,217 @@ virJSONValueToString(virJSONValuePtr object,
 }
 
 
+#elif WITH_JANSSON
+# include 
+
+static virJSONValuePtr
+virJSONValueFromJansson(json_t *json)
+{
+virJSONValuePtr ret = NULL;
+const char *key;
+json_t *cur;
+size_t i;
+
+switch (json_typeof(json)) {
+case JSON_OBJECT:
+ret = virJSONValueNewObject();
+if (!ret)
+goto error;
+
+json_object_foreach(json, key, cur) {
+virJSONValuePtr val = virJSONValueFromJansson(cur);
+if (!val)
+goto error;
+
+if (virJSONValueObjectAppend(ret, key, val) < 0) {
+virJSONValueFree(val);
+goto error;
+}
+}
+
+break;
+
+case JSON_ARRAY:
+ret = virJSONValueNewArray();
+if (!ret)
+goto error;
+
+json_array_foreach(json, i, cur) {
+virJSONValuePtr val = virJSONValueFromJansson(cur);
+if (!val)
+goto error;
+
+if (virJSONValueArrayAppend(ret, val) < 0) {
+virJSONValueFree(val);
+goto error;
+}
+}
+break;
+
+case JSON_STRING:
+ret = virJSONValueNewString(json_string_value(json));
+break;
+
+case JSON_INTEGER:
+ret = virJSONValueNewNumberLong(json_integer_value(json));
+break;
+
+case JSON_REAL:
+ret = virJSONValueNewNumberDouble(json_real_value(json));
+break;
+
+case JSON_TRUE:
+ret = virJSONValueNewBoolean(true);
+break;
+
+case JSON_FALSE:
+ret = virJSONValueNewBoolean(false);
+break;
+
+case JSON_NULL:
+ret = virJSONValueNewNull();
+break;
+}
+
+return ret;
+
+ error:
+virJSONValueFree(ret);
+return NULL;
+}
+
+virJSONValuePtr
+virJSONValueFromString(const char *jsonstring)
+{
+virJSONValuePtr ret = NULL;
+json_t *json;
+json_error_t error;
+size_t flags = JSON_REJECT_DUPLICATES |
+   JSON_DECODE_ANY;
+
+if (!(json = json_loads(jsonstring, flags, &error))) {
+virReportError(VIR_ERR_INTERNAL_ERROR,
+   _("failed to parse JSON %d:%d: %s"),
+   error.line, error.column, error.text);
+return NULL;
+}
+
+ret = virJSONValueFromJansson(json);
+json_decref(json);
+return ret;
+}
+
+
+static json_t *
+virJSONValueToJansson(virJSONValuePtr object)
+{
+json_t *ret = NULL;
+size_t i;
+
+switch ((virJSONType)object->type) {
+case VIR_JSON_TYPE_OBJECT:
+ret = json_object();
+if (!ret)
+goto no_memory;
+for (i = 0; i < object->data.object.npairs; i++) {
+virJSONObjectPairPtr cur = object->data.object.pairs + i;
+json_t *val = virJSONValueToJansson(cur->value);
+
+if (!val)
+goto error;
+if (json_object_set_new(ret, cur->key, val) < 0) {
+json_decref(val);
+goto no_memory;
+}
+}
+break;
+
+case VIR_JSON_TYPE_ARRAY:
+ret = json_array();
+if (!ret)
+goto no_memory;
+for (i = 0; i < object->data.array.nvalues; i++) {
+virJSONValuePtr cur = object->data.array.values[i];
+json_t *val = virJSONValueToJansson(cur);
+
+if (!val)
+goto error;
+if (json_array_append_new(ret, val) < 0) {
+json_decref(val);
+goto no_memory;
+}
+}
+break;
+
+case VIR_JSON_TYPE_STRING:
+ret = json_string(object->data.string);
+break;
+
+case VIR_JSON_TYPE_NUMBER: {
+long long ll_val;
+double d_val;
+if (virStrToLong_ll(object->data.number, NULL, 10, &ll_val) < 0) {
+if (virStrToDouble(obje