X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Frrd_update.c;h=7217041ee4bee2ca1a2231b7a9d80dcd8718a9bc;hb=c5282fa77324d86f882cfda15f43b62d2b1f8bc2;hp=6ba9fdb0233f81dea3633fefe777515bf9f466f8;hpb=134ab7800aa5ee81007b7467a56e6f46a5017b85;p=rrdtool.git diff --git a/src/rrd_update.c b/src/rrd_update.c index 6ba9fdb..7217041 100644 --- a/src/rrd_update.c +++ b/src/rrd_update.c @@ -5,6 +5,19 @@ ***************************************************************************** * $Id$ * $Log$ + * Revision 1.12 2003/09/04 13:16:12 oetiker + * should not assigne but compare ... grrrrr + * + * Revision 1.11 2003/09/02 21:58:35 oetiker + * be pickier about what we accept in rrd_update. Complain if things do not work out + * + * Revision 1.10 2003/04/29 19:14:12 jake + * Change updatev RRA return from index_number to cf_nam, pdp_cnt. + * Also revert accidental addition of -I to aclocal MakeMakefile. + * + * Revision 1.9 2003/04/25 18:35:08 jake + * Alternate update interface, updatev. Returns info about CDPs written to disk as result of update. Output format is similar to rrd_info, a hash of key-values. + * * Revision 1.8 2003/03/31 21:22:12 oetiker * enables RRDtool updates with microsecond or in case of windows millisecond * precision. This is needed to reduce time measurement error when archive step @@ -113,10 +126,13 @@ static void normalize_time(struct timeval *t) /* Local prototypes */ int LockRRD(FILE *rrd_file); -void write_RRA_row (rrd_t *rrd, unsigned long rra_idx, +info_t *write_RRA_row (rrd_t *rrd, unsigned long rra_idx, unsigned long *rra_current, - unsigned short CDP_scratch_idx, FILE *rrd_file); + unsigned short CDP_scratch_idx, FILE *rrd_file, + info_t *pcdp_summary, time_t *rra_time); int rrd_update_r(char *filename, char *template, int argc, char **argv); +int _rrd_update(char *filename, char *template, int argc, char **argv, + info_t*); #define IFDNAN(X,Y) (isnan(X) ? (Y) : (X)); @@ -141,6 +157,52 @@ main(int argc, char **argv){ } #endif +info_t *rrd_update_v(int argc, char **argv) +{ + char *template = NULL; + info_t *result = NULL; + infoval rc; + + while (1) { + static struct option long_options[] = + { + {"template", required_argument, 0, 't'}, + {0,0,0,0} + }; + int option_index = 0; + int opt; + opt = getopt_long(argc, argv, "t:", + long_options, &option_index); + + if (opt == EOF) + break; + + switch(opt) { + case 't': + template = optarg; + break; + + case '?': + rrd_set_error("unknown option '%s'",argv[optind-1]); + rc.u_int = -1; + goto end_tag; + } + } + + /* need at least 2 arguments: filename, data. */ + if (argc-optind < 2) { + rrd_set_error("Not enough arguments"); + rc.u_int = -1; + goto end_tag; + } + result = info_push(NULL,sprintf_alloc("return_value"),RD_I_INT,rc); + rc.u_int = _rrd_update(argv[optind], template, + argc - optind - 1, argv + optind + 1, result); + result->value.u_int = rc.u_int; +end_tag: + return result; +} + int rrd_update(int argc, char **argv) { @@ -165,7 +227,7 @@ rrd_update(int argc, char **argv) case 't': template = optarg; break; - + case '?': rrd_set_error("unknown option '%s'",argv[optind-1]); return(-1); @@ -178,8 +240,8 @@ rrd_update(int argc, char **argv) return -1; } - - rc = rrd_update_r(argv[optind], template, + + rc = rrd_update_r(argv[optind], template, argc - optind - 1, argv + optind + 1); return rc; } @@ -187,6 +249,13 @@ rrd_update(int argc, char **argv) int rrd_update_r(char *filename, char *template, int argc, char **argv) { + return _rrd_update(filename, template, argc, argv, NULL); +} + +int +_rrd_update(char *filename, char *template, int argc, char **argv, + info_t *pcdp_summary) +{ int arg_i = 2; short j; @@ -229,6 +298,7 @@ rrd_update_r(char *filename, char *template, int argc, char **argv) FILE *rrd_file; rrd_t rrd; time_t current_time; + time_t rra_time; /* time of update for a RRA */ unsigned long current_time_usec; /* microseconds part of current time */ struct timeval tmp_time; /* used for time conversion */ @@ -251,6 +321,7 @@ rrd_update_r(char *filename, char *template, int argc, char **argv) /* numeric id of the current consolidation function */ rpnstack_t rpnstack; /* used for COMPUTE DS */ int version; /* rrd version */ + char *endptr; /* used in the conversion */ rpnstack_init(&rpnstack); @@ -555,6 +626,15 @@ rrd_update_r(char *filename, char *template, int argc, char **argv) case DST_COUNTER: case DST_DERIVE: if(rrd.pdp_prep[i].last_ds[0] != 'U'){ + for(ii=0;updvals[i+1][ii] != '\0';ii++){ + if(updvals[i+1][ii] < '0' || updvals[i+1][ii] > '9' || (ii==0 && updvals[i+1][ii] == '-')){ + rrd_set_error("not a simple integer: '%s'",updvals[i+1]); + break; + } + } + if (rrd_test_error()){ + break; + } pdp_new[i]= rrd_diff(updvals[i+1],rrd.pdp_prep[i].last_ds); if(dst_idx == DST_COUNTER) { /* simple overflow catcher sugestet by andres kroonmaa */ @@ -572,11 +652,29 @@ rrd_update_r(char *filename, char *template, int argc, char **argv) } break; case DST_ABSOLUTE: - pdp_new[i]= atof(updvals[i+1]); + errno = 0; + pdp_new[i] = strtod(updvals[i+1],&endptr); + if (errno > 0){ + rrd_set_error("converting '%s' to float: %s",updvals[i+1],rrd_strerror(errno)); + break; + }; + if (endptr[0] != '\0'){ + rrd_set_error("conversion of '%s' to float not complete: tail '%s'",updvals[i+1],endptr); + break; + } rate = pdp_new[i] / interval; break; case DST_GAUGE: - pdp_new[i] = atof(updvals[i+1]) * interval; + errno = 0; + pdp_new[i] = strtod(updvals[i+1],&endptr) * interval; + if (errno > 0){ + rrd_set_error("converting '%s' to float: %s",updvals[i+1],rrd_strerror(errno)); + break; + }; + if (endptr[0] != '\0'){ + rrd_set_error("conversion of '%s' to float not complete: tail '%s'",updvals[i+1],endptr); + break; + } rate = pdp_new[i] / interval; break; default: @@ -1109,7 +1207,14 @@ rrd_update_r(char *filename, char *template, int argc, char **argv) fprintf(stderr," -- RRA Postseek %ld\n",ftell(rrd_file)); #endif scratch_idx = CDP_primary_val; - write_RRA_row(&rrd, i, &rra_current, scratch_idx, rrd_file); + if (pcdp_summary != NULL) + { + rra_time = (current_time - current_time + % (rrd.rra_def[i].pdp_cnt*rrd.stat_head->pdp_step)) + - ((rra_step_cnt[i]-1)*rrd.rra_def[i].pdp_cnt*rrd.stat_head->pdp_step); + } + pcdp_summary = write_RRA_row(&rrd, i, &rra_current, scratch_idx, rrd_file, + pcdp_summary, &rra_time); if (rrd_test_error()) break; /* write other rows of the bulk update, if any */ @@ -1136,7 +1241,14 @@ rrd_update_r(char *filename, char *template, int argc, char **argv) #endif rra_current = rra_start; } - write_RRA_row(&rrd, i, &rra_current, scratch_idx, rrd_file); + if (pcdp_summary != NULL) + { + rra_time = (current_time - current_time + % (rrd.rra_def[i].pdp_cnt*rrd.stat_head->pdp_step)) + - ((rra_step_cnt[i]-2)*rrd.rra_def[i].pdp_cnt*rrd.stat_head->pdp_step); + } + pcdp_summary = write_RRA_row(&rrd, i, &rra_current, scratch_idx, rrd_file, + pcdp_summary, &rra_time); } if (rrd_test_error()) @@ -1345,12 +1457,14 @@ LockRRD(FILE *rrdfile) } -void -write_RRA_row (rrd_t *rrd, unsigned long rra_idx, unsigned long *rra_current, - unsigned short CDP_scratch_idx, FILE *rrd_file) +info_t +*write_RRA_row (rrd_t *rrd, unsigned long rra_idx, unsigned long *rra_current, + unsigned short CDP_scratch_idx, FILE *rrd_file, + info_t *pcdp_summary, time_t *rra_time) { unsigned long ds_idx, cdp_idx; - + infoval iv; + for (ds_idx = 0; ds_idx < rrd -> stat_head -> ds_cnt; ds_idx++) { /* compute the cdp index */ @@ -1360,13 +1474,23 @@ write_RRA_row (rrd_t *rrd, unsigned long rra_idx, unsigned long *rra_current, rrd -> cdp_prep[cdp_idx].scratch[CDP_scratch_idx].u_val,ftell(rrd_file), rrd -> rra_def[rra_idx].cf_nam); #endif - + if (pcdp_summary != NULL) + { + iv.u_val = rrd -> cdp_prep[cdp_idx].scratch[CDP_scratch_idx].u_val; + /* append info to the return hash */ + pcdp_summary = info_push(pcdp_summary, + sprintf_alloc("[%d]RRA[%s][%lu]DS[%s]", + *rra_time, rrd->rra_def[rra_idx].cf_nam, + rrd->rra_def[rra_idx].pdp_cnt, rrd->ds_def[ds_idx].ds_nam), + RD_I_VAL, iv); + } if(fwrite(&(rrd -> cdp_prep[cdp_idx].scratch[CDP_scratch_idx].u_val), sizeof(rrd_value_t),1,rrd_file) != 1) { rrd_set_error("writing rrd"); - return; + return 0; } *rra_current += sizeof(rrd_value_t); } + return (pcdp_summary); }