X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Frrd_restore.c;h=6997cab9501230edde74d966434b45029913de88;hb=f4fd83170248b7945de8105a0ecbe13e11dbbcfe;hp=1185c66758da6f9aa7e8cded008ba76d679ca4b3;hpb=2593a69e9485cf67c9654a2667f85971275004fe;p=rrdtool.git diff --git a/src/rrd_restore.c b/src/rrd_restore.c index 1185c66..6997cab 100644 --- a/src/rrd_restore.c +++ b/src/rrd_restore.c @@ -1,5 +1,5 @@ /***************************************************************************** - * RRDtool 1.2.23 Copyright by Tobi Oetiker, 1997-2007 + * RRDtool 1.2.99907080300 Copyright by Tobi Oetiker, 1997-2007 ***************************************************************************** * rrd_restore.c creates new rrd from data dumped by rrd_dump.c *****************************************************************************/ @@ -52,6 +52,8 @@ void parse_FAILURES_history( rrd_t *rrd, int rra_index, int ds_index); +long int rra_random_row( + rra_def_t *); /* convert all occurrences of to */ @@ -383,6 +385,11 @@ int xml2rrd( read_tag(&ptr2, "seasonal_smooth_idx", "%lu", &(rrd->rra_def[rra_index]. par[RRA_seasonal_smooth_idx].u_cnt)); + if (atoi(rrd->stat_head->version) >= 4) { + read_tag(&ptr2, "smoothing_window", "%lf", + &(rrd->rra_def[rra_index]. + par[RRA_seasonal_smoothing_window].u_val)); + } read_tag(&ptr2, "dependent_rra_idx", "%lu", &(rrd->rra_def[rra_index]. par[RRA_dependent_rra_idx].u_cnt)); @@ -612,12 +619,6 @@ int xml2rrd( return (-1); } - for (i = 0; i < (int) rrd->stat_head->rra_cnt; i++) { - /* last row in the xml file is the most recent; as - * rrd_update increments the current row pointer, set cur_row - * here to the last row. */ - rrd->rra_ptr[i].cur_row = rrd->rra_def[i].row_cnt - 1; - } if (ptr == NULL) return -1; return 1; @@ -634,7 +635,7 @@ int rrd_creat( rrd_t *rrd, char force_overwrite) { - unsigned long i, ii, val_cnt; + unsigned long i, ii, rra_offset; FILE *rrd_file = NULL; int fdflags; int fd; @@ -673,18 +674,30 @@ int rrd_creat( fwrite(rrd->cdp_prep, sizeof(cdp_prep_t), rrd->stat_head->rra_cnt * rrd->stat_head->ds_cnt, rrd_file); + + for(i=0; i < rrd->stat_head->rra_cnt; i++) + rrd->rra_ptr[i].cur_row = rra_random_row(&rrd->rra_def[i]); + fwrite(rrd->rra_ptr, sizeof(rra_ptr_t), rrd->stat_head->rra_cnt, rrd_file); + /* Dump RRD values */ + rra_offset=0; + for(i=0; i < rrd->stat_head->rra_cnt; i++) + { + unsigned long num_rows = rrd->rra_def[i].row_cnt; + unsigned long cur_row = rrd->rra_ptr[i].cur_row; + unsigned long ds_cnt = rrd->stat_head->ds_cnt; - /* calculate the number of rrd_values to dump */ - val_cnt = 0; - for (i = 0; i < rrd->stat_head->rra_cnt; i++) - for (ii = 0; ii < rrd->rra_def[i].row_cnt * rrd->stat_head->ds_cnt; - ii++) - val_cnt++; - fwrite(rrd->rrd_value, sizeof(rrd_value_t), val_cnt, rrd_file); + fwrite(rrd->rrd_value + (rra_offset + num_rows-1 - cur_row) * ds_cnt, + sizeof(rrd_value_t), (cur_row+1)*ds_cnt, rrd_file); + + fwrite(rrd->rrd_value + rra_offset * ds_cnt, + sizeof(rrd_value_t), (num_rows-1 - cur_row)*ds_cnt, rrd_file); + + rra_offset += num_rows; + } /* lets see if we had an error */ if (ferror(rrd_file)) {