X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Frrd_update.c;h=a6f93a8fef9e3a83b9e0a3e922b77ea74beaa9fa;hb=298b318acaf1147474ab9e97cac37c3608660efd;hp=35ac6a6ef98e62ff63cadda200ae913d14432aac;hpb=a278779cdf2ded56b89fc404d6914bff7ad7dcbd;p=rrdtool.git diff --git a/src/rrd_update.c b/src/rrd_update.c index 35ac6a6..a6f93a8 100644 --- a/src/rrd_update.c +++ b/src/rrd_update.c @@ -1,10 +1,32 @@ /***************************************************************************** - * RRDtool 1.0.33 Copyright Tobias Oetiker, 1997 - 2000 + * RRDtool 1.1.x Copyright Tobias Oetiker, 1997 - 2002 ***************************************************************************** * rrd_update.c RRD Update Function ***************************************************************************** * $Id$ * $Log$ + * Revision 1.7 2003/02/13 07:05:27 oetiker + * Find attached the patch I promised to send to you. Please note that there + * are three new source files (src/rrd_is_thread_safe.h, src/rrd_thread_safe.c + * and src/rrd_not_thread_safe.c) and the introduction of librrd_th. This + * library is identical to librrd, but it contains support code for per-thread + * global variables currently used for error information only. This is similar + * to how errno per-thread variables are implemented. librrd_th must be linked + * alongside of libpthred + * + * There is also a new file "THREADS", holding some documentation. + * + * -- Peter Stamfest + * + * Revision 1.6 2002/02/01 20:34:49 oetiker + * fixed version number and date/time + * + * Revision 1.5 2001/05/09 05:31:01 oetiker + * Bug fix: when update of multiple PDP/CDP RRAs coincided + * with interpolation of multiple PDPs an incorrect value was + * stored as the CDP. Especially evident for GAUGE data sources. + * Minor changes to rrdcreate.pod. -- Jake Brutlag + * * Revision 1.4 2001/03/10 23:54:41 oetiker * Support for COMPUTE data sources (CDEF data sources). Removes the RPN * parser and calculator from rrd_graph and puts then in a new file, @@ -32,8 +54,6 @@ #include "rrd_tool.h" #include #include -#include "rrd_hw.h" -#include "rrd_rpncalc.h" #ifdef WIN32 #include @@ -41,11 +61,18 @@ #include #endif +#include "rrd_hw.h" +#include "rrd_rpncalc.h" + +#include "rrd_is_thread_safe.h" + /* Local prototypes */ int LockRRD(FILE *rrd_file); -void write_RRA_row (rrd_t *rrd, unsigned long rra_idx, unsigned long *rra_current, - unsigned short CDP_scratch_idx, FILE *rrd_file); - +void write_RRA_row (rrd_t *rrd, unsigned long rra_idx, + unsigned long *rra_current, + unsigned short CDP_scratch_idx, FILE *rrd_file); +int rrd_update_r(char *filename, char *template, int argc, char **argv); + #define IFDNAN(X,Y) (isnan(X) ? (Y) : (X)); @@ -54,7 +81,7 @@ int main(int argc, char **argv){ rrd_update(argc,argv); if (rrd_test_error()) { - printf("RRDtool 1.0.33 Copyright 1997-2000 by Tobias Oetiker \n\n" + printf("RRDtool 1.1.x Copyright 1997-2000 by Tobias Oetiker \n\n" "Usage: rrdupdate filename\n" "\t\t\t[--template|-t ds-name:ds-name:...]\n" "\t\t\ttime|N:value[:value...]\n\n" @@ -72,10 +99,54 @@ main(int argc, char **argv){ int rrd_update(int argc, char **argv) { + char *template = NULL; + int 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]); + /* rrd_free(&rrd); */ + return(-1); + } + } + + /* need at least 2 arguments: filename, data. */ + if (argc-optind < 2) { + rrd_set_error("Not enough arguments"); + + return -1; + } + + rc = rrd_update_r(argv[optind], template, + argc - optind - 1, argv + optind + 1); + return rc; +} + +int +rrd_update_r(char *filename, char *template, int argc, char **argv) +{ int arg_i = 2; short j; - long i,ii,iii=1; + unsigned long i,ii,iii=1; unsigned long rra_begin; /* byte pointer to the rra * area in the rrd file. this @@ -109,14 +180,13 @@ rrd_update(int argc, char **argv) long *tmpl_idx; /* index representing the settings transported by the template index */ - long tmpl_cnt = 2; /* time and data */ + unsigned long tmpl_cnt = 2; /* time and data */ FILE *rrd_file; rrd_t rrd; time_t current_time = time(NULL); char **updvals; int schedule_smooth = 0; - char *template = NULL; rrd_value_t *seasonal_coef = NULL, *last_seasonal_coef = NULL; /* a vector of future Holt-Winters seasonal coefs */ unsigned long elapsed_pdp_st; @@ -136,39 +206,13 @@ rrd_update(int argc, char **argv) rpnstack_init(&rpnstack); - 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]); - rrd_free(&rrd); - return(-1); - } - } - - /* need at least 2 arguments: filename, data. */ - if (argc-optind < 2) { + /* need at least 1 arguments: data. */ + if (argc < 1) { rrd_set_error("Not enough arguments"); return -1; } - if(rrd_open(argv[optind],&rrd_file,&rrd, RRD_READWRITE)==-1){ + if(rrd_open(filename,&rrd_file,&rrd, RRD_READWRITE)==-1){ return -1; } rra_current = rra_start = rra_begin = ftell(rrd_file); @@ -235,7 +279,7 @@ rrd_update(int argc, char **argv) if (template) { char *dsname; - int tmpl_len; + unsigned int tmpl_len; dsname = template; tmpl_cnt = 1; /* the first entry is the time */ tmpl_len = strlen(template); @@ -279,7 +323,7 @@ rrd_update(int argc, char **argv) } /* loop through the arguments. */ - for(arg_i=optind+1; arg_i= interval) { double rate = DNAN; /* the data source type defines how to process the data */ - /* pdp_temp contains rate * time ... eg the bytes + /* pdp_new contains rate * time ... eg the bytes * transferred during the interval. Doing it this way saves * a lot of math operations */ @@ -760,7 +804,7 @@ rrd_update(int argc, char **argv) cum_val = IFDNAN(rrd.cdp_prep[iii].scratch[CDP_val].u_val, 0.0); cur_val = IFDNAN(pdp_temp[ii],0.0); rrd.cdp_prep[iii].scratch[CDP_primary_val].u_val = - (cum_val + cur_val) / + (cum_val + cur_val * start_pdp_offset) / (rrd.rra_def[i].pdp_cnt -rrd.cdp_prep[iii].scratch[CDP_unkn_pdp_cnt].u_cnt); /* initialize carry over value */ @@ -1140,9 +1184,9 @@ rrd_update(int argc, char **argv) if (schedule_smooth) { #ifndef WIN32 - rrd_file = fopen(argv[optind],"r+"); + rrd_file = fopen(filename,"r+"); #else - rrd_file = fopen(argv[optind],"rb+"); + rrd_file = fopen(filename,"rb+"); #endif rra_start = rra_begin; for (i = 0; i < rrd.stat_head -> rra_cnt; ++i) @@ -1210,7 +1254,7 @@ 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) + unsigned short CDP_scratch_idx, FILE *rrd_file) { unsigned long ds_idx, cdp_idx;