I am brand-new to rrdtool and don't know the accepted process for developing 
changes.  Any pointers would be welcome.

I offer for your consideration this patch I developed against rrdtool-1.0.45.  
Note that the patch only modifies the code files; I haven't figured out how to 
modify the documentation files.

Conrad Kimball
Associate Technical Fellow
Client Server IT Services, Shared Services Group
[EMAIL PROTECTED]
P.O.Box 24346, MS 7M-HC
Seattle, WA  98124-0346
Bellevue 33-12 bldg, cube 37C3
Phone: (425) 865-6410
Pager:  (206) 797-3112
Cell:      (425) 591-7802

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

This patch to rrdtool-1.0.45 does three things:

1. AT-STYLE time specifications now allow HH:MM:SS as well as HH:MM for
   TIME-OF-DAY-SPEC (provides granularity down to the second).

2. "rrdtool update" now uses parsetime() to parse the <timestamp> field
   of the new data arguments, which allows the timestamp to be specified
   in AT-STYLE form as well in the form of as seconds since 1970-01-01.

3. Because AT-STYLE time specifications may need to use colons to specify
   HH:MM or HH:MM:SS, "rrdtool update" now allows the <timestamp> field
   of the new data arguments to be quoted.  Quoting is accomplished by
   enclosing the <timestamp> field within a pair of single quote (') or
   double quote (") characters.


Nov 11, 2003 by Conrad Kimball, The Boeing Company
[EMAIL PROTECTED]


*** src/rrd_update.c.orig       Mon Jul 21 11:24:57 2003
--- src/rrd_update.c    Wed Nov  5 21:48:01 2003
***************
*** 237,242 ****
--- 237,243 ----
      for(arg_i=optind+1; arg_i<argc;arg_i++) {
        char *stepper = malloc((strlen(argv[arg_i])+1)*sizeof(char));
          char *step_start = stepper;
+       char in_quotes = '\0';
          if (stepper == NULL){
                  rrd_set_error("faild duplication argv entry");
                  free(updvals);
***************
*** 251,259 ****
        for(ii=1;ii<=rrd.stat_head->ds_cnt;ii++) updvals[ii] = "U";
        ii=0;
        strcpy(stepper,argv[arg_i]);
        updvals[0]=stepper;
        while (*stepper) {
!           if (*stepper == ':') {
                *stepper = '\0';
                ii++;
                if (ii<tmpl_cnt){                   
--- 252,272 ----
        for(ii=1;ii<=rrd.stat_head->ds_cnt;ii++) updvals[ii] = "U";
        ii=0;
        strcpy(stepper,argv[arg_i]);
+       if (*stepper == '"' || *stepper == '\'') {
+           in_quotes = *stepper;
+           stepper++;
+       }
        updvals[0]=stepper;
        while (*stepper) {
!           if (in_quotes) {
!               if (*stepper == in_quotes) {
!                   char *s;
!                   for (s = stepper; *s; s++) *s = *(s+1);
!                   in_quotes = '\0';
!                   continue;
!               }
!           }
!           else if (*stepper == ':') {
                *stepper = '\0';
                ii++;
                if (ii<tmpl_cnt){                   
***************
*** 274,280 ****
        if (strcmp(updvals[0],"N")==0){
            current_time = time(NULL);
        } else {
!           current_time = atol(updvals[0]);
        }
        
        if(current_time <= rrd.live_head->last_up){
--- 287,306 ----
        if (strcmp(updvals[0],"N")==0){
            current_time = time(NULL);
        } else {
!           struct time_value updtime;
!           char *parsetime_error = NULL;
! 
!           if ((parsetime_error = parsetime(updvals[0], &updtime))) {
!               rrd_set_error( "update time: %s", parsetime_error);
!               free(step_start);
!               break;
!           }
!           if (updtime.type != ABSOLUTE_TIME) {
!               rrd_set_error( "update time must be absolute: %s", updvals[0]);
!               free(step_start);
!               break;
!           }
!           current_time = mktime(&(updtime.tm));
        }
        
        if(current_time <= rrd.live_head->last_up){
*** src/parsetime.c.orig        Mon Jul 21 11:24:54 2003
--- src/parsetime.c     Wed Nov  5 21:38:13 2003
***************
*** 47,53 ****
   * TIME-REFERENCE ::= NOW | TIME-OF-DAY-SPEC [ DAY-SPEC-1 ] |
   *                        [ TIME-OF-DAY-SPEC ] DAY-SPEC-2
   *
!  * TIME-OF-DAY-SPEC ::= NUMBER (':') NUMBER [am|pm] | # HH:MM
   *                     'noon' | 'midnight' | 'teatime'
   *
   * DAY-SPEC-1 ::= NUMBER '/' NUMBER '/' NUMBER |  # MM/DD/[YY]YY
--- 47,53 ----
   * TIME-REFERENCE ::= NOW | TIME-OF-DAY-SPEC [ DAY-SPEC-1 ] |
   *                        [ TIME-OF-DAY-SPEC ] DAY-SPEC-2
   *
!  * TIME-OF-DAY-SPEC ::= NUMBER (':') NUMBER [(':') NUMBER] [am|pm] | # 
HH:MM:SS
   *                     'noon' | 'midnight' | 'teatime'
   *
   * DAY-SPEC-1 ::= NUMBER '/' NUMBER '/' NUMBER |  # MM/DD/[YY]YY
***************
*** 450,456 ****
  
  
  /* 
!  * expect2() gets a token and complins if it's not the token we want
   */
  static char *
  expect2(int desired, char *complain_fmt, ...)
--- 450,456 ----
  
  
  /* 
!  * expect2() gets a token and complains if it's not the token we want
   */
  static char *
  expect2(int desired, char *complain_fmt, ...)
***************
*** 469,475 ****
  /*
   * plus_minus() is used to parse a single NUMBER TIME-UNIT pair
   *              for the OFFSET-SPEC.
!  *              It allso applies those m-guessing euristics.
   */
  static char *
  plus_minus(struct time_value *ptv, int doop)
--- 469,475 ----
  /*
   * plus_minus() is used to parse a single NUMBER TIME-UNIT pair
   *              for the OFFSET-SPEC.
!  *              It also applies those m-guessing heuristics.
   */
  static char *
  plus_minus(struct time_value *ptv, int doop)
***************
*** 554,560 ****
  static char *
  tod(struct time_value *ptv)
  {
!     int hour, minute = 0;
      int tlen;
      /* save token status in  case we must abort */
      int scc_sv = scc; 
--- 554,560 ----
  static char *
  tod(struct time_value *ptv)
  {
!     int hour, minute, second = 0;
      int tlen;
      /* save token status in  case we must abort */
      int scc_sv = scc; 
***************
*** 581,593 ****
        return TIME_OK;
      }
      if (sc_tokid == COLON ) {
!        try(expect2(NUMBER,
!             "Parsing HH:MM syntax, expecting MM as number, got none"));
        minute = atoi(sc_token);
        if (minute > 59) {
            panic(e("parsing HH:MM syntax, got MM = %d (>59!)", minute ));
        }
        token();
      }
  
      /* check if an AM or PM specifier was given
--- 581,602 ----
        return TIME_OK;
      }
      if (sc_tokid == COLON ) {
!       try(expect2(NUMBER,
!             "Parsing HH:MM[:SS] syntax, expecting MM as number, got none"));
        minute = atoi(sc_token);
        if (minute > 59) {
            panic(e("parsing HH:MM syntax, got MM = %d (>59!)", minute ));
        }
        token();
+       if (sc_tokid == COLON) {
+           try(expect2(NUMBER,
+               "Parsing HH:MM:SS syntax, expecting SS as number, got none"));
+           second = atoi(sc_token);
+           if (second > 59) {
+               panic(e("parsing HH:MM:SS syntax, got SS = %d (>59!)", second 
));
+           }
+           token();
+       }
      }
  
      /* check if an AM or PM specifier was given
***************
*** 615,621 ****
      }
      ptv->tm.tm_hour = hour;
      ptv->tm.tm_min = minute;
!     ptv->tm.tm_sec = 0;
      if (ptv->tm.tm_hour == 24) {
        ptv->tm.tm_hour = 0;
        ptv->tm.tm_mday++;
--- 624,630 ----
      }
      ptv->tm.tm_hour = hour;
      ptv->tm.tm_min = minute;
!     ptv->tm.tm_sec = second;
      if (ptv->tm.tm_hour == 24) {
        ptv->tm.tm_hour = 0;
        ptv->tm.tm_mday++;


--
Unsubscribe mailto:[EMAIL PROTECTED]
Help        mailto:[EMAIL PROTECTED]
Archive     http://www.ee.ethz.ch/~slist/rrd-developers
WebAdmin    http://www.ee.ethz.ch/~slist/lsg2.cgi

Reply via email to