static TIMESTAMP collector_write(OBJECT *obj) { struct collector *my = OBJECTDATA(obj,struct collector); char ts[64]; if (my->format==0) { //time_t t = (time_t)(my->last.ts*TS_SECOND); //strftime(ts,sizeof(ts),timestamp_format, gmtime(&t)); DATETIME dt; gl_localtime(my->last.ts, &dt); gl_strtime(&dt, ts, sizeof(ts)); } else sprintf(ts,"%" FMT_INT64 "d", my->last.ts); if ((my->limit>0 && my->samples>my->limit) /* limit reached */ || write_collector(my,ts,my->last.value)==0) /* write failed */ { if (my->ops){ close_collector(my); } else { gl_error("collector_write: no TAPEOP structure when closing the tape"); } my->status = TS_DONE; } else my->samples++; return TS_NEVER; }
void FzController::close(void) { std::cout << INFOTAG << "FzController: closing application" << std::endl; close_collector(); close_rcs(); close_cli(); #ifdef WEBLOG_ENABLED close_weblog(); #endif context.close(); }
EXPORT TIMESTAMP sync_collector(OBJECT *obj, TIMESTAMP t0, PASSCONFIG pass) { struct collector *my = OBJECTDATA(obj,struct collector); typedef enum {NONE='\0', LT='<', EQ='=', GT='>'} COMPAREOP; COMPAREOP comparison; char1024 buffer = ""; if(my->status == TS_DONE){ return TS_NEVER; } /* connect to property */ if (my->aggr==NULL) my->aggr = link_aggregates(my->property,my->group); /* read property */ if (my->aggr==NULL) { sprintf(buffer,"'%s' contains an aggregate that is not found in the group '%s'", my->property, my->group); my->status = TS_ERROR; goto Error; } if((my->status == TS_OPEN) && (t0 > obj->clock)){ obj->clock = t0; if((my->interval > 0) && (my->last.ts < t0) && (my->last.value[0] != 0)){ collector_write(obj); //my->last.ts = t0; my->last.value[0] = 0; } } //if(my->aggr != NULL && (my->aggr = link_aggregates(my->property,my->group)),read_aggregates(my->aggr,buffer,sizeof(buffer))==0) if(my->aggr != NULL && (my->interval == 0 || my->interval == -1)){ if(read_aggregates(my->aggr,buffer,sizeof(buffer))==0) { sprintf(buffer,"unable to read aggregate '%s' of group '%s'", my->property, my->group); close_collector(my); my->status = TS_ERROR; } } if(my->aggr != NULL && my->interval > 0){ if((t0 >= my->last.ts + my->interval) || (t0 == my->last.ts)){ if(read_aggregates(my->aggr,buffer,sizeof(buffer))==0){ sprintf(buffer,"unable to read aggregate '%s' of group '%s'", my->property, my->group); close_collector(my); my->status = TS_ERROR; } my->last.ts = t0; } } /* check trigger, if any */ comparison = (COMPAREOP)my->trigger[0]; if (comparison!=NONE) { int desired = comparison==LT ? -1 : (comparison==EQ ? 0 : (comparison==GT ? 1 : -2)); /* if not trigger or can't get access */ int actual = strcmp(buffer,my->trigger+1); if (actual!=desired || (my->status==TS_INIT && !collector_open(obj))){ /* better luck next time */ return (my->interval==0 || my->interval==-1) ? TS_NEVER : t0+my->interval; } } else if (my->status==TS_INIT && !collector_open(obj)){ close_collector(my); return TS_NEVER; } if(my->last.ts < 1 && my->interval != -1){ my->last.ts = t0; } /* write tape */ if(my->status == TS_OPEN){ if(my->interval == 0 /* sample on every pass */ || ((my->interval == -1) && my->last.ts != t0 && strcmp(buffer, my->last.value) != 0) /* sample only when value changes */ ){ strncpy(my->last.value, buffer, sizeof(my->last.value)); my->last.ts = t0; collector_write(obj); } else if(my->interval > 0 && my->last.ts == t0){ strncpy(my->last.value, buffer, sizeof(my->last.value)); } } Error: if (my->status==TS_ERROR) { gl_error("collector %d %s\n",obj->id, buffer); my->status=TS_DONE; return 0; /* failed */ } return (my->interval==0 || my->interval==-1) ? TS_NEVER : my->last.ts+my->interval; }