summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: aec06fe)
raw | patch | inline | side by side (parent: aec06fe)
author | oetiker <oetiker@a5681a0c-68f1-0310-ab6d-d61299d08faa> | |
Sat, 27 Sep 2008 11:44:58 +0000 (11:44 +0000) | ||
committer | oetiker <oetiker@a5681a0c-68f1-0310-ab6d-d61299d08faa> | |
Sat, 27 Sep 2008 11:44:58 +0000 (11:44 +0000) |
git-svn-id: svn://svn.oetiker.ch/rrdtool/branches/1.3/program@1529 a5681a0c-68f1-0310-ab6d-d61299d08faa
src/rrd_xport.c | patch | blob | history |
diff --git a/src/rrd_xport.c b/src/rrd_xport.c
index cea6efed7046fa97be89a4c935929e10e89d4ee8..284106006195cff283ab64c12aac91bfa69a8c3b 100644 (file)
--- a/src/rrd_xport.c
+++ b/src/rrd_xport.c
}
if (im.gdes_c == 0) {
- rrd_set_error("can't make a graph without contents");
+ rrd_set_error("can't make an xport without contents");
im_free(&im);
return (-1);
}
{ /* two dimensional array containing the data */
int i = 0, j = 0;
- unsigned long *ds_cnt; /* number of data sources in file */
- unsigned long col, dst_row, row_cnt;
- rrd_value_t *srcptr, *dstptr;
+ unsigned long dst_row, row_cnt;
+ rrd_value_t *dstptr;
- unsigned long nof_xports = 0;
unsigned long xport_counter = 0;
int *ref_list;
- rrd_value_t **srcptr_list;
+ long *step_list;
+ long *step_list_ptr;
char **legend_list;
- int ii = 0;
- time_t start_tmp = 0;
- time_t end_tmp = 0;
- unsigned long step_tmp = 1;
/* pull the data from the rrd files ... */
if (data_fetch(im) == -1)
return -1;
/* how many xports? */
+ *col_cnt = 0;
for (i = 0; i < im->gdes_c; i++) {
switch (im->gdes[i].gf) {
case GF_XPORT:
- nof_xports++;
+ (*col_cnt)++;
break;
default:
break;
}
}
- if (nof_xports == 0) {
+ if ((*col_cnt) == 0) {
rrd_set_error("no XPORT found, nothing to do");
return -1;
}
/* a list of referenced gdes */
- ref_list = malloc(sizeof(int) * nof_xports);
+ ref_list = malloc(sizeof(int) * (*col_cnt));
if (ref_list == NULL)
return -1;
- /* a list to save pointers into each gdes data */
- srcptr_list = malloc(sizeof(srcptr) * nof_xports);
- if (srcptr_list == NULL) {
- free(ref_list);
- return -1;
- }
-
/* a list to save pointers to the column's legend entry */
/* this is a return value! */
- legend_list = malloc(sizeof(char *) * nof_xports);
+ legend_list = malloc(sizeof(char *) * (*col_cnt));
if (legend_list == NULL) {
- free(srcptr_list);
free(ref_list);
return -1;
}
- /* find referenced gdes and save their index and */
- /* a pointer into their data */
- for (i = 0; i < im->gdes_c; i++) {
- switch (im->gdes[i].gf) {
- case GF_XPORT:
- ii = im->gdes[i].vidx;
- if (xport_counter > nof_xports) {
- rrd_set_error("too many xports: should not happen. Hmmm");
- free(srcptr_list);
- free(ref_list);
- free(legend_list);
- return -1;
- }
- srcptr_list[xport_counter] = im->gdes[ii].data;
- ref_list[xport_counter++] = i;
- break;
- default:
- break;
- }
- }
-
- start_tmp = im->gdes[0].start;
- end_tmp = im->gdes[0].end;
- step_tmp = im->gdes[0].step;
-
- /* fill some return values */
- *col_cnt = nof_xports;
- *start = start_tmp;
- *end = end_tmp;
- *step = step_tmp;
-
- row_cnt = ((*end) - (*start)) / (*step);
-
- /* room for rearranged data */
- /* this is a return value! */
- if (((*data) =
- malloc((*col_cnt) * row_cnt * sizeof(rrd_value_t))) == NULL) {
- free(srcptr_list);
- free(ref_list);
- free(legend_list);
- rrd_set_error("malloc xport data area");
- return (-1);
- }
- dstptr = (*data);
-
+ /* lets find the step size we have to use for xport */
+ step_list = malloc(sizeof(long)*((*col_cnt)+1));
+ step_list_ptr = step_list;
j = 0;
for (i = 0; i < im->gdes_c; i++) {
switch (im->gdes[i].gf) {
case GF_XPORT:
+ ref_list[xport_counter++] = i;
+ *step_list_ptr = im->gdes[im->gdes[i].vidx].step;
+ printf("%s:%lu\n",im->gdes[i].legend,*step_list_ptr);
+ *step_list_ptr++;
/* reserve room for one legend entry */
/* is FMT_LEG_LEN + 5 the correct size? */
if ((legend_list[j] =
- malloc(sizeof(char) * (FMT_LEG_LEN + 5))) == NULL) {
- free(srcptr_list);
+ malloc(sizeof(char) * (FMT_LEG_LEN + 5))) == NULL) {
free(ref_list);
- free(*data);
*data = NULL;
while (--j > -1)
free(legend_list[j]);
strcpy(legend_list[j++], im->gdes[i].legend);
else
legend_list[j++][0] = '\0';
-
break;
default:
- break;
+ break;
}
}
+ *step_list_ptr=0;
+ /* find a common step */
+ *step = lcd(step_list);
+ printf("step: %lu\n",*step);
+ free(step_list);
+
+ *start = im->start - im->start % (*step);
+ *end = im->end - im->end % (*step);
+
+
+ /* room for rearranged data */
+ /* this is a return value! */
+ row_cnt = ((*end) - (*start)) / (*step);
+ if (((*data) =
+ malloc((*col_cnt) * row_cnt * sizeof(rrd_value_t))) == NULL) {
+ free(ref_list);
+ free(legend_list);
+ rrd_set_error("malloc xport data area");
+ return (-1);
+ }
+ dstptr = (*data);
/* fill data structure */
for (dst_row = 0; (int) dst_row < (int) row_cnt; dst_row++) {
- for (i = 0; i < (int) nof_xports; i++) {
- j = ref_list[i];
- ii = im->gdes[j].vidx;
- ds_cnt = &im->gdes[ii].ds_cnt;
-
- srcptr = srcptr_list[i];
- for (col = 0; col < (*ds_cnt); col++) {
- rrd_value_t newval = DNAN;
+ for (i = 0; i < (int) (*col_cnt); i++) {
+ long vidx = im->gdes[ref_list[i]].vidx;
+ time_t now = *start + dst_row * *step;
+ (*dstptr++) = im->gdes[vidx].data[(unsigned long)
+ floor((double)
+ (now - im->gdes[vidx].start)
+ /im->gdes[vidx].step)
+ * im->gdes[vidx].ds_cnt +
+ im->gdes[vidx].ds];
- newval = srcptr[col];
-
- if (im->gdes[ii].ds_namv && im->gdes[ii].ds_nam) {
- if (strcmp(im->gdes[ii].ds_namv[col], im->gdes[ii].ds_nam)
- == 0)
- (*dstptr++) = newval;
- } else {
- (*dstptr++) = newval;
- }
-
- }
- srcptr_list[i] += (*ds_cnt);
}
}
*legend_v = legend_list;
- free(srcptr_list);
free(ref_list);
return 0;