summaryrefslogtreecommitdiffstats
path: root/web/api/queries/rrdr.c
diff options
context:
space:
mode:
Diffstat (limited to 'web/api/queries/rrdr.c')
-rw-r--r--web/api/queries/rrdr.c77
1 files changed, 61 insertions, 16 deletions
diff --git a/web/api/queries/rrdr.c b/web/api/queries/rrdr.c
index 676224c9..2a001689 100644
--- a/web/api/queries/rrdr.c
+++ b/web/api/queries/rrdr.c
@@ -61,41 +61,86 @@ static void rrdr_dump(RRDR *r)
inline void rrdr_free(ONEWAYALLOC *owa, RRDR *r) {
if(unlikely(!r)) return;
- query_target_release(r->internal.qt);
+ for(size_t d = 0; d < r->d ;d++) {
+ string_freez(r->di[d]);
+ string_freez(r->dn[d]);
+ string_freez(r->du[d]);
+ }
+
+ query_target_release(r->internal.release_with_rrdr_qt);
+
onewayalloc_freez(owa, r->t);
onewayalloc_freez(owa, r->v);
+ onewayalloc_freez(owa, r->vh);
onewayalloc_freez(owa, r->o);
onewayalloc_freez(owa, r->od);
+ onewayalloc_freez(owa, r->di);
+ onewayalloc_freez(owa, r->dn);
+ onewayalloc_freez(owa, r->du);
+ onewayalloc_freez(owa, r->dp);
+ onewayalloc_freez(owa, r->dview);
+ onewayalloc_freez(owa, r->dqp);
onewayalloc_freez(owa, r->ar);
+ onewayalloc_freez(owa, r->gbc);
+ onewayalloc_freez(owa, r->dgbc);
+ onewayalloc_freez(owa, r->dgbs);
+
+ if(r->dl) {
+ for(size_t d = 0; d < r->d ;d++)
+ dictionary_destroy(r->dl[d]);
+
+ onewayalloc_freez(owa, r->dl);
+ }
+
+ dictionary_destroy(r->label_keys);
+
+ if(r->group_by.r) {
+ // prevent accidental infinite recursion
+ r->group_by.r->group_by.r = NULL;
+
+ // do not release qt twice
+ r->group_by.r->internal.qt = NULL;
+
+ rrdr_free(owa, r->group_by.r);
+ }
+
onewayalloc_freez(owa, r);
}
-RRDR *rrdr_create(ONEWAYALLOC *owa, QUERY_TARGET *qt) {
- if(unlikely(!qt || !qt->query.used || !qt->window.points))
+RRDR *rrdr_create(ONEWAYALLOC *owa, QUERY_TARGET *qt, size_t dimensions, size_t points) {
+ if(unlikely(!qt))
return NULL;
- size_t dimensions = qt->query.used;
- size_t points = qt->window.points;
-
// create the rrdr
RRDR *r = onewayalloc_callocz(owa, 1, sizeof(RRDR));
r->internal.owa = owa;
r->internal.qt = qt;
- r->before = qt->window.before;
- r->after = qt->window.after;
- r->internal.points_wanted = qt->window.points;
+ r->view.before = qt->window.before;
+ r->view.after = qt->window.after;
+ r->time_grouping.points_wanted = points;
r->d = (int)dimensions;
r->n = (int)points;
- r->t = onewayalloc_callocz(owa, points, sizeof(time_t));
- r->v = onewayalloc_mallocz(owa, points * dimensions * sizeof(NETDATA_DOUBLE));
- r->o = onewayalloc_mallocz(owa, points * dimensions * sizeof(RRDR_VALUE_FLAGS));
- r->ar = onewayalloc_mallocz(owa, points * dimensions * sizeof(NETDATA_DOUBLE));
- r->od = onewayalloc_mallocz(owa, dimensions * sizeof(RRDR_DIMENSION_FLAGS));
+ if(points && dimensions) {
+ r->v = onewayalloc_mallocz(owa, points * dimensions * sizeof(NETDATA_DOUBLE));
+ r->o = onewayalloc_mallocz(owa, points * dimensions * sizeof(RRDR_VALUE_FLAGS));
+ r->ar = onewayalloc_mallocz(owa, points * dimensions * sizeof(NETDATA_DOUBLE));
+ }
+
+ if(points) {
+ r->t = onewayalloc_callocz(owa, points, sizeof(time_t));
+ }
+
+ if(dimensions) {
+ r->od = onewayalloc_mallocz(owa, dimensions * sizeof(RRDR_DIMENSION_FLAGS));
+ r->di = onewayalloc_callocz(owa, dimensions, sizeof(STRING *));
+ r->dn = onewayalloc_callocz(owa, dimensions, sizeof(STRING *));
+ r->du = onewayalloc_callocz(owa, dimensions, sizeof(STRING *));
+ }
- r->group = 1;
- r->update_every = 1;
+ r->view.group = 1;
+ r->view.update_every = 1;
return r;
}