]> source.dussan.org Git - rspamd.git/commitdiff
Add rra extraction function.
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Mon, 21 Sep 2015 16:33:26 +0000 (17:33 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Mon, 21 Sep 2015 16:33:26 +0000 (17:33 +0100)
src/libutil/rrd.c
src/libutil/rrd.h

index bf3d76c995dd2170abf23d35fdc5b9e7b11b1439..831e516305d2ab3d4ebbe608f1ab4f5f284f5a9d 100644 (file)
@@ -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;
+}
index 189ea479a8618d422a7c0282dc305fea26de2942..7305b35dfa819c2b60c1c6a8a39c9f89c9e2e51a 100644 (file)
@@ -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_ */