X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fcore%2Ftimeseries.c;h=9574ee8a75fd13b188b091af15ad2e52654c5803;hb=dcf7802ad0958d4752b2c13f70e2fdf345d3509f;hp=17166eb82a88a6bcef20765975ad69275f1de656;hpb=d9b993fd5dc195e819a142b039d25d768d5c711c;p=sysdb.git diff --git a/src/core/timeseries.c b/src/core/timeseries.c index 17166eb..9574ee8 100644 --- a/src/core/timeseries.c +++ b/src/core/timeseries.c @@ -1,6 +1,6 @@ /* * SysDB - src/core/timeseries.c - * Copyright (C) 2014 Sebastian 'tokkee' Harl + * Copyright (C) 2014-2016 Sebastian 'tokkee' Harl * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -31,14 +31,43 @@ #include "sysdb.h" #include "core/timeseries.h" +#include "utils/strings.h" #include #include +#include /* * public API */ +sdb_timeseries_info_t * +sdb_timeseries_info_create(size_t data_names_len, const char * const *data_names) +{ + sdb_timeseries_info_t *ts_info; + + ts_info = calloc(1, sizeof(*ts_info)); + if (! ts_info) + return NULL; + + if (stringv_copy(&ts_info->data_names, &ts_info->data_names_len, + data_names, data_names_len)) { + sdb_timeseries_info_destroy(ts_info); + return NULL; + } + return ts_info; +} /* sdb_timeseries_info_create */ + +void +sdb_timeseries_info_destroy(sdb_timeseries_info_t *ts_info) +{ + if (! ts_info) + return; + + stringv_free(&ts_info->data_names, &ts_info->data_names_len); + free(ts_info); +} /* sdb_timeseries_info_destroy */ + sdb_timeseries_t * sdb_timeseries_create(size_t data_names_len, const char * const *data_names, size_t data_len) @@ -50,12 +79,17 @@ sdb_timeseries_create(size_t data_names_len, const char * const *data_names, if (! ts) return NULL; + if (stringv_copy(&ts->data_names, &ts->data_names_len, + data_names, data_names_len)) { + sdb_timeseries_destroy(ts); + return NULL; + } + ts->data = calloc(data_names_len, sizeof(*ts->data)); if (! ts->data) { sdb_timeseries_destroy(ts); return NULL; } - ts->data_names_len = data_names_len; for (i = 0; i < data_names_len; ++i) { ts->data[i] = calloc(data_len, sizeof(**ts->data)); if (! ts->data[i]) { @@ -64,19 +98,6 @@ sdb_timeseries_create(size_t data_names_len, const char * const *data_names, } } ts->data_len = data_len; - - ts->data_names = calloc(data_names_len, sizeof(*ts->data_names)); - if (! ts->data_names) { - sdb_timeseries_destroy(ts); - return NULL; - } - for (i = 0; i < data_names_len; ++i) { - ts->data_names[i] = strdup(data_names[i]); - if (! ts->data_names[i]) { - sdb_timeseries_destroy(ts); - return NULL; - } - } return ts; } /* sdb_timeseries_create */ @@ -99,17 +120,63 @@ sdb_timeseries_destroy(sdb_timeseries_t *ts) ts->data = NULL; ts->data_len = 0; - if (ts->data_names) { - for (i = 0; i < ts->data_names_len; ++i) { - if (ts->data_names[i]) - free(ts->data_names[i]); - ts->data_names[i] = NULL; + stringv_free(&ts->data_names, &ts->data_names_len); + 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, ","); } - free(ts->data_names); + + if (i < ts->data_names_len - 1) + sdb_strbuf_append(buf, "],"); + else + sdb_strbuf_append(buf, "]"); } - ts->data_names = NULL; - ts->data_names_len = 0; -} /* sdb_timeseries_destroy */ + sdb_strbuf_append(buf, "}}"); + return 0; +} /* sdb_timeseries_tojson */ /* vim: set tw=78 sw=4 ts=4 noexpandtab : */