Code

"show_graph_json" action: Update for the new interface.
[collection4.git] / src / action_show_graph_json.c
index a182a626baf620e9ed456c95a10cd1b70bb05689..36de76c3aee931973a737de0edba5964f0eac16e 100644 (file)
 #include <fcgiapp.h>
 #include <fcgi_stdio.h>
 
-struct show_graph_data_s
+static int write_buffer (char *buffer, size_t buffer_size) /* {{{ */
 {
-  graph_config_t *cfg;
-  _Bool first;
-};
-typedef struct show_graph_data_s show_graph_data_t;
-
-static int show_instance_cb (graph_instance_t *inst, /* {{{ */
-    void *user_data)
-{
-  show_graph_data_t *data = user_data;
-  graph_ident_t *ident;
-  char *ident_json;
-
-  ident = inst_get_selector (inst);
-  if (ident == NULL)
-    return (ENOMEM);
+  size_t status;
 
-  ident_json = ident_to_json (ident);
-  if (ident_json == NULL)
+  while (buffer_size > 0)
   {
-    ident_destroy (ident);
-    return (ENOMEM);
-  }
-
-  if (!data->first)
-    printf (",\n");
-  data->first = 0;
+    status = fwrite (buffer, buffer_size, /* nmemb = */ 1, stdout);
+    if (status == 0)
+      return (errno);
 
-  printf ("    %s", ident_json);
+    buffer += status;
+    buffer_size -= status;
+  }
 
-  free (ident_json);
-  ident_destroy (ident);
   return (0);
-} /* }}} int show_instance_cb */
+} /* }}} int write_buffer */
 
 int action_show_graph_json (void) /* {{{ */
 {
-  show_graph_data_t data;
-  char title[1024];
-  graph_ident_t *ident;
-  char *ident_json;
-
-  memset (&data, 0, sizeof (data));
-  data.first = 1;
-  data.cfg = gl_graph_get_selected ();
-  if (data.cfg == NULL)
-    return (ENOMEM);
+  graph_config_t *cfg;
+
+  yajl_gen_config handler_config;
+  yajl_gen handler;
+
+  const unsigned char *buffer;
+  unsigned int buffer_length;
 
-  ident = graph_get_selector (data.cfg);
-  if (ident == NULL)
+  time_t now;
+  char time_buffer[128];
+  int status;
+
+  cfg = gl_graph_get_selected ();
+  if (cfg == NULL)
     return (ENOMEM);
 
-  ident_json = ident_to_json (ident);
-  if (ident_json == NULL)
+  memset (&handler_config, 0, sizeof (handler_config));
+  handler_config.beautify = 1;
+  handler_config.indentString = "  ";
+
+  handler = yajl_gen_alloc (&handler_config,
+      /* alloc functions = */ NULL);
+  if (handler == NULL)
   {
-    ident_destroy (ident);
-    return (ENOMEM);
+    graph_destroy (cfg);
+    return (-1);
   }
 
-  printf ("Content-Type: text/plain\n\n");
+  printf ("Content-Type: application/json\n");
+
+  now = time (NULL);
+  status = time_to_rfc1123 (now + 300, time_buffer, sizeof (time_buffer));
+  if (status == 0)
+    printf ("Expires: %s\n"
+        "Cache-Control: public\n",
+        time_buffer);
+  printf ("\n");
+
+  status = graph_to_json (cfg, handler);
+  if (status != 0)
+  {
+    graph_destroy (cfg);
+    yajl_gen_free (handler);
+    return (status);
+  }
 
-  memset (title, 0, sizeof (title));
-  graph_get_title (data.cfg, title, sizeof (title));
-  json_escape_buffer (title, sizeof (title));
+  buffer = NULL;
+  buffer_length = 0;
+  status = (int) yajl_gen_get_buf (handler, &buffer, &buffer_length);
 
-  printf ("{\n");
-  printf ("  \"title\": \"%s\",\n", title);
-  printf ("  \"selector\": %s,\n", ident_json);
-  printf ("  \"instances\":\n");
-  printf ("  [\n");
-  graph_inst_foreach (data.cfg, show_instance_cb, &data);
-  printf ("\n  ]\n}\n");
+  write_buffer ((char *) buffer, (size_t) buffer_length);
 
-  free (ident_json);
-  ident_destroy (ident);
+  graph_destroy (cfg);
+  yajl_gen_free (handler);
   return (0);
 } /* }}} int action_show_graph_json */