+/* {{{ ident_data_to_json */
+struct ident_data_to_json__data_s
+{
+ dp_time_t begin;
+ dp_time_t end;
+ yajl_gen handler;
+};
+typedef struct ident_data_to_json__data_s ident_data_to_json__data_t;
+
+#define yajl_gen_string_cast(h,s,l) \
+ yajl_gen_string (h, (unsigned char *) s, (unsigned int) l)
+
+static int ident_data_to_json__get_ident_data (
+ __attribute__((unused)) graph_ident_t *ident, /* {{{ */
+ __attribute__((unused)) const char *ds_name,
+ const dp_data_point_t *dp, size_t dp_num,
+ void *user_data)
+{
+ ident_data_to_json__data_t *data = user_data;
+ size_t i;
+
+ /* TODO: Make points_num_limit configurable. */
+ /* points_num_limit: The number of data-points to send at least. */
+ size_t points_num_limit = 400;
+ size_t points_consolidate;
+
+ if (dp_num <= points_num_limit)
+ points_consolidate = 1;
+ else
+ points_consolidate = dp_num / points_num_limit;
+
+ yajl_gen_array_open (data->handler);
+
+ for (i = (dp_num % points_consolidate); i < dp_num; i += points_consolidate)
+ {
+ size_t j;
+
+ double sum = 0.0;
+ long num = 0;
+
+ yajl_gen_array_open (data->handler);
+ yajl_gen_integer (data->handler, (long) dp[i].time.tv_sec);
+
+ for (j = 0; j < points_consolidate; j++)
+ {
+ if (isnan (dp[i+j].value))
+ continue;
+
+ sum += dp[i+j].value;
+ num++;
+ }
+
+ if (num == 0)
+ yajl_gen_null (data->handler);
+ else
+ yajl_gen_double (data->handler, sum / ((double) num));
+
+ yajl_gen_array_close (data->handler);
+ }
+
+ yajl_gen_array_close (data->handler);
+
+ return (0);
+} /* }}} int ident_data_to_json__get_ident_data */
+
+/* Called for each DS name */
+static int ident_data_to_json__get_ds_name (graph_ident_t *ident, /* {{{ */
+ const char *ds_name, void *user_data)
+{
+ ident_data_to_json__data_t *data = user_data;
+ int status;
+
+ yajl_gen_map_open (data->handler);
+
+ yajl_gen_string_cast (data->handler, "file", strlen ("file"));
+ ident_to_json (ident, data->handler);
+
+ yajl_gen_string_cast (data->handler, "data_source", strlen ("data_source"));
+ yajl_gen_string_cast (data->handler, ds_name, strlen (ds_name));
+
+ yajl_gen_string_cast (data->handler, "data", strlen ("data"));
+ status = data_provider_get_ident_data (ident, ds_name,
+ data->begin, data->end,
+ ident_data_to_json__get_ident_data,
+ data);
+
+ yajl_gen_map_close (data->handler);
+
+ return (status);
+} /* }}} int ident_data_to_json__get_ds_name */
+
+int ident_data_to_json (graph_ident_t *ident, /* {{{ */
+ dp_time_t begin, dp_time_t end,
+ yajl_gen handler)
+{
+ ident_data_to_json__data_t data;
+ int status;
+
+ data.begin = begin;
+ data.end = end;
+ data.handler = handler;
+
+ /* Iterate over all DS names */
+ status = data_provider_get_ident_ds_names (ident,
+ ident_data_to_json__get_ds_name, &data);
+ if (status != 0)
+ fprintf (stderr, "ident_data_to_json: data_provider_get_ident_ds_names "
+ "failed with status %i\n", status);
+
+ return (status);
+} /* }}} int ident_data_to_json */
+/* }}} ident_data_to_json */
+