From: Florian Forster Date: Wed, 21 Jul 2010 09:05:23 +0000 (+0200) Subject: src/graph_ident.[ch]: Generate JSON data using libyajl. X-Git-Tag: v4.0.0~84 X-Git-Url: https://git.verplant.org/?a=commitdiff_plain;h=e30594797655c82d92ee8c4718dfdd82e9e3d377;p=collection4.git src/graph_ident.[ch]: Generate JSON data using libyajl. --- diff --git a/src/graph_ident.c b/src/graph_ident.c index 6111fe7..e7d1932 100644 --- a/src/graph_ident.c +++ b/src/graph_ident.c @@ -502,35 +502,40 @@ char *ident_to_file (const graph_ident_t *ident) /* {{{ */ return (strdup (buffer)); } /* }}} char *ident_to_file */ -#define ADD_FIELD(field) do { \ - char json[1024]; \ - json_escape_copy (json, ident->field, sizeof (json)); \ - strlcat (buffer, json, sizeof (buffer)); \ -} while (0) - -char *ident_to_json (const graph_ident_t *ident) /* {{{ */ +int ident_to_json (const graph_ident_t *ident, /* {{{ */ + yajl_gen handler) { - char buffer[4096]; + yajl_gen_status status; - buffer[0] = 0; + if ((ident == NULL) || (handler == NULL)) + return (EINVAL); - strlcat (buffer, "{\"host\":\"", sizeof (buffer)); - ADD_FIELD (host); - strlcat (buffer, "\",\"plugin\":\"", sizeof (buffer)); - ADD_FIELD (plugin); - strlcat (buffer, "\",\"plugin_instance\":\"", sizeof (buffer)); - ADD_FIELD (plugin_instance); - strlcat (buffer, "\",\"type\":\"", sizeof (buffer)); - ADD_FIELD (type); - strlcat (buffer, "\",\"type_instance\":\"", sizeof (buffer)); - ADD_FIELD (type_instance); - strlcat (buffer, "\"}", sizeof (buffer)); +#define ADD_STRING(str) do { \ + status = yajl_gen_string (handler, \ + (unsigned char *) (str), \ + (unsigned int) strlen (str)); \ + if (status != yajl_gen_status_ok) \ + return ((int) status); \ +} while (0) - return (strdup (buffer)); -} /* }}} char *ident_to_json */ + yajl_gen_map_open (handler); + ADD_STRING ("host"); + ADD_STRING (ident->host); + ADD_STRING ("plugin"); + ADD_STRING (ident->plugin); + ADD_STRING ("plugin_instance"); + ADD_STRING (ident->plugin_instance); + ADD_STRING ("type"); + ADD_STRING (ident->type); + ADD_STRING ("type_instance"); + ADD_STRING (ident->type_instance); + yajl_gen_map_close (handler); #undef ADD_FIELD + return (0); +} /* }}} char *ident_to_json */ + int ident_describe (const graph_ident_t *ident, /* {{{ */ const graph_ident_t *selector, char *buffer, size_t buffer_size) diff --git a/src/graph_ident.h b/src/graph_ident.h index 5787ad5..ddba477 100644 --- a/src/graph_ident.h +++ b/src/graph_ident.h @@ -25,6 +25,9 @@ #define GRAPH_IDENT_H 1 #include + +#include + #include "graph_types.h" #define ANY_TOKEN "/any/" @@ -86,7 +89,8 @@ _Bool ident_intersect (const graph_ident_t *s0, const graph_ident_t *s1); char *ident_to_string (const graph_ident_t *ident); char *ident_to_file (const graph_ident_t *ident); -char *ident_to_json (const graph_ident_t *ident); +int ident_to_json (const graph_ident_t *ident, + yajl_gen handler); int ident_describe (const graph_ident_t *ident, const graph_ident_t *selector, char *buffer, size_t buffer_size);