From b60d581597cc0210f2eb57f60b612bc182a44865 Mon Sep 17 00:00:00 2001 From: Sebastian Harl Date: Tue, 6 Oct 2015 21:34:25 +0200 Subject: [PATCH] Move the timeseries serialize to the timeseries module. --- src/core/store.c | 59 +---------------------------------- src/core/timeseries.c | 54 ++++++++++++++++++++++++++++++++ src/include/core/timeseries.h | 12 +++++++ 3 files changed, 67 insertions(+), 58 deletions(-) diff --git a/src/core/store.c b/src/core/store.c index 0a23513..dfa6ac9 100644 --- a/src/core/store.c +++ b/src/core/store.c @@ -43,7 +43,6 @@ #include #include -#include #include /* @@ -484,62 +483,6 @@ get_host_children(host_t *host, int type) return host->services; } /* get_host_children */ -/* - * ts_tojson serializes a time-series to JSON. - * - * The function never returns an error. Rather, an error message will be part - * of the serialized data. - */ -static void -ts_tojson(sdb_timeseries_t *ts, sdb_strbuf_t *buf) -{ - char start_str[64]; - char end_str[64]; - - size_t i; - - /* TODO: make time format configurable */ - if (! sdb_strftime(start_str, sizeof(start_str), ts->start)) - snprintf(start_str, sizeof(start_str), ""); - start_str[sizeof(start_str) - 1] = '\0'; - if (! sdb_strftime(end_str, sizeof(end_str), ts->end)) - snprintf(end_str, sizeof(end_str), ""); - end_str[sizeof(end_str) - 1] = '\0'; - - sdb_strbuf_append(buf, "{\"start\": \"%s\", \"end\": \"%s\", \"data\": {", - start_str, end_str); - - for (i = 0; i < ts->data_names_len; ++i) { - size_t j; - sdb_strbuf_append(buf, "\"%s\": [", ts->data_names[i]); - - for (j = 0; j < ts->data_len; ++j) { - char time_str[64]; - - if (! sdb_strftime(time_str, sizeof(time_str), ts->data[i][j].timestamp)) - snprintf(time_str, sizeof(time_str), ""); - time_str[sizeof(time_str) - 1] = '\0'; - - /* Some GNU libc versions may print '-nan' which we dont' want */ - if (isnan(ts->data[i][j].value)) - sdb_strbuf_append(buf, "{\"timestamp\": \"%s\", " - "\"value\": \"nan\"}", time_str); - else - sdb_strbuf_append(buf, "{\"timestamp\": \"%s\", " - "\"value\": \"%f\"}", time_str, ts->data[i][j].value); - - if (j < ts->data_len - 1) - sdb_strbuf_append(buf, ","); - } - - if (i < ts->data_names_len - 1) - sdb_strbuf_append(buf, "],"); - else - sdb_strbuf_append(buf, "]"); - } - sdb_strbuf_append(buf, "}}"); -} /* ts_tojson */ - /* * store writer API */ @@ -1023,7 +966,7 @@ sdb_store_fetch_timeseries(sdb_store_t *store, } } - ts_tojson(ts, buf); + sdb_timeseries_tojson(ts, buf); sdb_object_deref(SDB_OBJ(m)); sdb_timeseries_destroy(ts); return status; diff --git a/src/core/timeseries.c b/src/core/timeseries.c index e5bff91..2c5537d 100644 --- a/src/core/timeseries.c +++ b/src/core/timeseries.c @@ -34,6 +34,7 @@ #include #include +#include /* * public API @@ -112,5 +113,58 @@ sdb_timeseries_destroy(sdb_timeseries_t *ts) free(ts); } /* sdb_timeseries_destroy */ +int +sdb_timeseries_tojson(sdb_timeseries_t *ts, sdb_strbuf_t *buf) +{ + char start_str[64]; + char end_str[64]; + + size_t i; + + if ((! ts) || (! buf)) + return -1; + + /* TODO: make time format configurable */ + if (! sdb_strftime(start_str, sizeof(start_str), ts->start)) + snprintf(start_str, sizeof(start_str), ""); + start_str[sizeof(start_str) - 1] = '\0'; + if (! sdb_strftime(end_str, sizeof(end_str), ts->end)) + snprintf(end_str, sizeof(end_str), ""); + end_str[sizeof(end_str) - 1] = '\0'; + + sdb_strbuf_append(buf, "{\"start\": \"%s\", \"end\": \"%s\", \"data\": {", + start_str, end_str); + + for (i = 0; i < ts->data_names_len; ++i) { + size_t j; + sdb_strbuf_append(buf, "\"%s\": [", ts->data_names[i]); + + for (j = 0; j < ts->data_len; ++j) { + char time_str[64]; + + if (! sdb_strftime(time_str, sizeof(time_str), ts->data[i][j].timestamp)) + snprintf(time_str, sizeof(time_str), ""); + time_str[sizeof(time_str) - 1] = '\0'; + + /* Some GNU libc versions may print '-nan' which we dont' want */ + if (isnan(ts->data[i][j].value)) + sdb_strbuf_append(buf, "{\"timestamp\": \"%s\", " + "\"value\": \"nan\"}", time_str); + else + sdb_strbuf_append(buf, "{\"timestamp\": \"%s\", " + "\"value\": \"%f\"}", time_str, ts->data[i][j].value); + + if (j < ts->data_len - 1) + sdb_strbuf_append(buf, ","); + } + + if (i < ts->data_names_len - 1) + sdb_strbuf_append(buf, "],"); + else + sdb_strbuf_append(buf, "]"); + } + sdb_strbuf_append(buf, "}}"); + return 0; +} /* sdb_timeseries_tojson */ /* vim: set tw=78 sw=4 ts=4 noexpandtab : */ diff --git a/src/include/core/timeseries.h b/src/include/core/timeseries.h index 1a8e48e..b19625d 100644 --- a/src/include/core/timeseries.h +++ b/src/include/core/timeseries.h @@ -30,6 +30,7 @@ #include "sysdb.h" #include "core/time.h" +#include "utils/strbuf.h" #ifdef __cplusplus extern "C" { @@ -90,6 +91,17 @@ sdb_timeseries_create(size_t data_names_len, const char * const *data_names, void sdb_timeseries_destroy(sdb_timeseries_t *ts); +/* + * sdb_timeseries_tojson: + * Serialize a time-series to JSON written to the specified string buffer. + * + * Returns: + * - 0 on success + * - a negative value else + */ +int +sdb_timeseries_tojson(sdb_timeseries_t *ts, sdb_strbuf_t *buf); + #ifdef __cplusplus } /* extern "C" */ #endif -- 2.30.2