From 989ccca1111fc9bdd38bb0b2b28c4dc5d6acd2c1 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Mon, 21 Sep 2015 17:33:26 +0100 Subject: [PATCH] Add rra extraction function. --- src/libutil/rrd.c | 41 +++++++++++++++++++++++++++++++++++++++++ src/libutil/rrd.h | 20 ++++++++++++++++++++ 2 files changed, 61 insertions(+) diff --git a/src/libutil/rrd.c b/src/libutil/rrd.c index bf3d76c99..831e51630 100644 --- a/src/libutil/rrd.c +++ b/src/libutil/rrd.c @@ -1292,3 +1292,44 @@ rspamd_rrd_file_default (const gchar *path, return file; } + +struct rspamd_rrd_query_result * +rspamd_rrd_query (struct rspamd_rrd_file *file, + gulong rra_num) +{ + struct rspamd_rrd_query_result *res; + struct rrd_rra_def *rra; + const gdouble *rra_offset = NULL; + guint i; + + g_assert (file != NULL); + + + if (rra_num > file->stat_head->rra_cnt) { + msg_err_rrd ("requested unexisting rra: %l", rra_num); + + return NULL; + } + + res = g_slice_alloc0 (sizeof (*res)); + res->ds_count = file->stat_head->ds_cnt; + res->last_update = (gdouble)file->live_head->last_up + + ((gdouble)file->live_head->last_up_usec / 1e6f); + res->pdp_per_cdp = file->rra_def[rra_num].pdp_cnt; + res->rra_rows = file->rra_def[rra_num].row_cnt; + rra_offset = file->rrd_value; + + for (i = 0; i < file->stat_head->rra_cnt; i++) { + rra = &file->rra_def[i]; + + if (i == rra_num) { + break; + } + + rra_offset += rra->row_cnt * res->ds_count; + } + + res->data = rra_offset; + + return res; +} diff --git a/src/libutil/rrd.h b/src/libutil/rrd.h index 189ea479a..7305b35df 100644 --- a/src/libutil/rrd.h +++ b/src/libutil/rrd.h @@ -335,4 +335,24 @@ void rrd_make_default_ds (const gchar *name, */ struct rspamd_rrd_file *rspamd_rrd_file_default (const gchar *path, GError **err); + +/** + * Returned by querying rrd database + */ +struct rspamd_rrd_query_result { + gulong rra_rows; + gulong pdp_per_cdp; + gulong ds_count; + gdouble last_update; + const gdouble *data; +}; + +/** + * Return RRA data + * @param file rrd file + * @param rra_num number of rra to return data for + * @return query result structure, that should be freed (using g_slice_free1) after usage + */ +struct rspamd_rrd_query_result * rspamd_rrd_query (struct rspamd_rrd_file *file, + gulong rra_num); #endif /* RRD_H_ */ -- 2.39.5