X-Git-Url: https://git.octo.it/?p=rrdtool.git;a=blobdiff_plain;f=src%2Frrd_restore.c;h=9af8ab00604e0941df9ac9d054ea1095279e7889;hp=d8689c0a72ba4f9f108f82265a8abb09ebdbf022;hb=2f0b984b0dfee0a8ab2cb1d41670f40a07ec5cdb;hpb=c24cf5317f753d0bfb376835b4f907462a770384 diff --git a/src/rrd_restore.c b/src/rrd_restore.c index d8689c0..9af8ab0 100644 --- a/src/rrd_restore.c +++ b/src/rrd_restore.c @@ -1,5 +1,5 @@ /***************************************************************************** - * RRDtool 1.3rc9 Copyright by Tobi Oetiker, 1997-2008 + * RRDtool 1.3.2 Copyright by Tobi Oetiker, 1997-2008 * This file: Copyright 2008 Florian octo Forster * Distributed under the GPL ***************************************************************************** @@ -31,7 +31,15 @@ #include #include #include -#include + + +#ifndef WIN32 +# include /* for off_t */ +#else + typedef size_t ssize_t; + typedef long off_t; +#endif + #include #if defined(_WIN32) && !defined(__CYGWIN__) && !defined(__CYGWIN32__) # include @@ -132,6 +140,13 @@ static int get_double_from_node( return (-1); } + if (strstr(str_ptr, "NaN") != NULL) + { + *value = DNAN; + xmlFree(str_ptr); + return 0; + } + end_ptr = NULL; temp = strtod(str_ptr, &end_ptr); xmlFree(str_ptr); @@ -318,6 +333,10 @@ static int parse_tag_rra_cdp_prep_ds( status = 0; for (child = node->xmlChildrenNode; child != NULL; child = child->next) { + if (atoi(rrd->stat_head->version) == 1) { + cdp_prep->scratch[CDP_primary_val].u_val = 0.0; + cdp_prep->scratch[CDP_secondary_val].u_val = 0.0; + } if ((xmlStrcmp(child->name, (const xmlChar *) "comment") == 0) || (xmlStrcmp(child->name, (const xmlChar *) "text") == 0)) /* ignore */ ; @@ -385,45 +404,6 @@ static int parse_tag_rra_cdp_prep_ds( status = get_int_from_node(doc, child, (int *) &cdp_prep-> scratch[CDP_unkn_pdp_cnt].u_cnt); - /* - * Compatibility code for 1.0.49 - */ - else if (xmlStrcmp(child->name, (const xmlChar *) "value") == 0) { /* {{{ */ - unsigned int i = 0; - rra_def_t *rra_def = rrd->rra_def + (rrd->stat_head->rra_cnt - 1); - - while (42) { - if (i >= ARRAY_LENGTH(cdp_prep->scratch)) { - status = -1; - break; - } - - if ((cf_conv(rra_def->cf_nam) == CF_FAILURES) - || (i == CDP_unkn_pdp_cnt) - || (i == CDP_null_count) - || (i == CDP_last_null_count)) - status = get_int_from_node(doc, child, - (int *) &cdp_prep->scratch[i]. - u_cnt); - else - status = get_double_from_node(doc, child, - &cdp_prep->scratch[i]. - u_val); - - if (status != 0) - break; - - /* When this loops exits (sucessfully) `child' points to the last - * `value' tag in the list. */ - if ((child->next == NULL) - || (xmlStrcmp(child->name, (const xmlChar *) "value") != - 0)) - break; - - child = child->next; - i++; - } - } /* }}} */ else { rrd_set_error("parse_tag_rra_cdp_prep: Unknown tag: %s", child->name); @@ -708,7 +688,13 @@ static int parse_tag_rra( else if (xmlStrcmp(child->name, (const xmlChar *) "pdp_per_row") == 0) status = get_int_from_node(doc, child, (int *) &cur_rra_def->pdp_cnt); - else if (xmlStrcmp(child->name, (const xmlChar *) "params") == 0) + else if (atoi(rrd->stat_head->version) == 1 + && xmlStrcmp(child->name, (const xmlChar *) "xff") == 0) + status = get_double_from_node(doc, child, + (double *) &cur_rra_def-> + par[RRA_cdp_xff_val].u_val); + else if (atoi(rrd->stat_head->version) >= 2 + && xmlStrcmp(child->name, (const xmlChar *) "params") == 0) status = parse_tag_rra_params(doc, child, cur_rra_def); else if (xmlStrcmp(child->name, (const xmlChar *) "cdp_prep") == 0) status = parse_tag_rra_cdp_prep(doc, child, rrd, cur_cdp_prep); @@ -723,8 +709,8 @@ static int parse_tag_rra( break; } - /* Set the RRA pointer to the last value in the archive */ - cur_rra_ptr->cur_row = cur_rra_def->row_cnt - 1; + /* Set the RRA pointer to a random location */ + cur_rra_ptr->cur_row = rrd_random() % cur_rra_def->row_cnt; return (status); } /* int parse_tag_rra */ @@ -996,7 +982,7 @@ static int write_file( { FILE *fh; unsigned int i; - unsigned int value_count; + unsigned int rra_offset; if (strcmp("-", file_name) == 0) fh = stdout; @@ -1025,7 +1011,10 @@ static int write_file( return (-1); } } - + if (atoi(rrd->stat_head->version) < 3) { + /* we output 3 or higher */ + strcpy(rrd->stat_head->version, "0003"); + } fwrite(rrd->stat_head, sizeof(stat_head_t), 1, fh); fwrite(rrd->ds_def, sizeof(ds_def_t), rrd->stat_head->ds_cnt, fh); fwrite(rrd->rra_def, sizeof(rra_def_t), rrd->stat_head->rra_cnt, fh); @@ -1036,11 +1025,21 @@ static int write_file( fwrite(rrd->rra_ptr, sizeof(rra_ptr_t), rrd->stat_head->rra_cnt, fh); /* calculate the number of rrd_values to dump */ - value_count = 0; - for (i = 0; i < rrd->stat_head->rra_cnt; i++) - value_count += (rrd->rra_def[i].row_cnt * rrd->stat_head->ds_cnt); + 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; + + fwrite(rrd->rrd_value + + (rra_offset + num_rows - 1 - cur_row) * ds_cnt, + sizeof(rrd_value_t), (cur_row + 1) * ds_cnt, fh); - fwrite(rrd->rrd_value, sizeof(rrd_value_t), value_count, fh); + fwrite(rrd->rrd_value + rra_offset * ds_cnt, + sizeof(rrd_value_t), (num_rows - 1 - cur_row) * ds_cnt, fh); + + rra_offset += num_rows; + } /* lets see if we had an error */ if (ferror(fh)) {