src/data_provider.[ch]: Move privider handling functions to a central place.
[collection4.git] / src / graph_ident.c
index 6111fe7..e7d1932 100644 (file)
@@ -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)