X-Git-Url: https://git.tokkee.org/?p=sysdb.git;a=blobdiff_plain;f=src%2Fcore%2Ftimeseries.c;h=9574ee8a75fd13b188b091af15ad2e52654c5803;hp=48da7f8dab9e47a4ad12b77f8df65bf39fc117bc;hb=288e7cfdab0c31ff49d9bc10ec51ceb32f476014;hpb=b3c5403f90933d3d63ebaf9174524fa018a50f4f diff --git a/src/core/timeseries.c b/src/core/timeseries.c index 48da7f8..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,13 +31,76 @@ #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) +{ + sdb_timeseries_t *ts; + size_t i; + + ts = calloc(1, sizeof(*ts)); + 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; + } + for (i = 0; i < data_names_len; ++i) { + ts->data[i] = calloc(data_len, sizeof(**ts->data)); + if (! ts->data[i]) { + sdb_timeseries_destroy(ts); + return NULL; + } + } + ts->data_len = data_len; + return ts; +} /* sdb_timeseries_create */ + void sdb_timeseries_destroy(sdb_timeseries_t *ts) { @@ -46,21 +109,74 @@ sdb_timeseries_destroy(sdb_timeseries_t *ts) if (! ts) return; - if (ts->data) + if (ts->data) { + for (i = 0; i < ts->data_names_len; ++i) { + if (ts->data[i]) + free(ts->data[i]); + ts->data[i] = NULL; + } free(ts->data); + } ts->data = NULL; ts->data_len = 0; + 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) { - if (ts->data_names[i]) - free(ts->data_names[i]); - ts->data_names[i] = NULL; + 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, "]"); } - if (ts->data_names) - free(ts->data_names); - 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 : */