diff --git a/src/core/store.c b/src/core/store.c
index c778c52d7dd4a234890b381bea8fb5434a4bab0a..8cb30efaea88a250284cb569db2ae07b05d7fa12 100644 (file)
--- a/src/core/store.c
+++ b/src/core/store.c
snprintf(start_str, sizeof(start_str), "<error>");
start_str[sizeof(start_str) - 1] = '\0';
if (! sdb_strftime(end_str, sizeof(end_str),
- "%F %T %z", ts->start))
+ "%F %T %z", ts->end))
snprintf(end_str, sizeof(end_str), "<error>");
end_str[sizeof(end_str) - 1] = '\0';
- sdb_strbuf_append(buf, "{\"start\": \"%s\", \"end\": \"%s\", {",
+ sdb_strbuf_append(buf, "{\"start\": \"%s\", \"end\": \"%s\", \"data\": {",
start_str, end_str);
for (i = 0; i < ts->data_names_len; ++i) {
time_str[sizeof(time_str) - 1] = '\0';
sdb_strbuf_append(buf, "{\"timestamp\": \"%s\", "
- "\"value\": \"%s\"}", time_str, ts->data[i][j].value);
+ "\"value\": \"%f\"}", time_str, ts->data[i][j].value);
if (j < ts->data_len - 1)
sdb_strbuf_append(buf, ",");
if ((! h) || (h->type != SDB_HOST) || (! buf))
return -1;
+ /* This function ignores SKIP_EMPTY flags given that the current
+ * implementation sucks and it's nut currently used when calling this
+ * function directly. */
+
sdb_strbuf_append(buf, "{\"name\": \"%s\", ", SDB_OBJ(host)->name);
store_common_tojson(h, buf);
return 0;
} /* sdb_store_host_tojson */
+static _Bool
+has_children(sdb_avltree_t *tree, sdb_store_matcher_t *filter)
+{
+ sdb_avltree_iter_t *iter;
+
+ if (! filter)
+ return sdb_avltree_size(tree) > 0;
+
+ iter = sdb_avltree_get_iter(tree);
+ while (sdb_avltree_iter_has_next(iter)) {
+ sdb_store_obj_t *sobj = STORE_OBJ(sdb_avltree_iter_get_next(iter));
+ if (sdb_store_matcher_matches(filter, sobj, NULL)) {
+ sdb_avltree_iter_destroy(iter);
+ return 1;
+ }
+ }
+ sdb_avltree_iter_destroy(iter);
+ return 0;
+} /* has_children */
+
int
sdb_store_tojson(sdb_strbuf_t *buf, sdb_store_matcher_t *filter, int flags)
{
return -1;
}
- sdb_strbuf_append(buf, "{\"hosts\":[");
+ sdb_strbuf_append(buf, "[");
len = sdb_strbuf_len(buf);
while (sdb_avltree_iter_has_next(host_iter)) {
if (filter && (! sdb_store_matcher_matches(filter, host, NULL)))
continue;
+ /*
+ * XXX: This approach sucks but it's the best we can do at the moment.
+ * In the future, all store lookups should be split into multiple
+ * steps instead: first, retrieve all relevant objects and apply all
+ * pre-processing operations and then format it for the wire.
+ */
+ if ((flags & SDB_SKIP_EMPTY_SERVICES)
+ && (! has_children(HOST(host)->services, filter)))
+ continue;
+ if ((flags & SDB_SKIP_EMPTY_METRICS)
+ && (! has_children(HOST(host)->metrics, filter)))
+ continue;
+
if (sdb_strbuf_len(buf) > len)
sdb_strbuf_append(buf, ",");
len = sdb_strbuf_len(buf);
return -1;
}
- sdb_strbuf_append(buf, "]}");
+ sdb_strbuf_append(buf, "]");
sdb_avltree_iter_destroy(host_iter);
pthread_rwlock_unlock(&host_lock);