- }
- read_tag(&ptr,"lastupdate","%lu",&(rrd->live_head->last_up));
-
- /* Data Source Definition Part */
- ptr2 = ptr;
- while (eat_tag(&ptr2,"ds") == 1){
- rrd->stat_head->ds_cnt++;
- if((rrd->ds_def = rrd_realloc(rrd->ds_def,rrd->stat_head->ds_cnt*sizeof(ds_def_t)))==NULL){
- rrd_set_error("allocating rrd.ds_def");
- return -1;
- };
- /* clean out memory to make sure no data gets stored from previous tasks */
- memset(&(rrd->ds_def[rrd->stat_head->ds_cnt-1]), 0, sizeof(ds_def_t));
- if((rrd->pdp_prep = rrd_realloc(rrd->pdp_prep,rrd->stat_head->ds_cnt
- *sizeof(pdp_prep_t)))==NULL){
- rrd_set_error("allocating pdp_prep");
- return(-1);
- }
- /* clean out memory to make sure no data gets stored from previous tasks */
- memset(&(rrd->pdp_prep[rrd->stat_head->ds_cnt-1]), 0, sizeof(pdp_prep_t));
-
- read_tag(&ptr2,"name",DS_NAM_FMT,rrd->ds_def[rrd->stat_head->ds_cnt-1].ds_nam);
-
- read_tag(&ptr2,"type",DST_FMT,rrd->ds_def[rrd->stat_head->ds_cnt-1].dst);
- /* test for valid type */
- if(dst_conv(rrd->ds_def[rrd->stat_head->ds_cnt-1].dst) == -1) return -1;
-
- read_tag(&ptr2,"minimal_heartbeat","%lu",
- &(rrd->ds_def[rrd->stat_head->ds_cnt-1].par[DS_mrhb_cnt].u_cnt));
- read_tag(&ptr2,"min","%lf",&(rrd->ds_def[rrd->stat_head->ds_cnt-1].par[DS_min_val].u_val));
- read_tag(&ptr2,"max","%lf",&(rrd->ds_def[rrd->stat_head->ds_cnt-1].par[DS_max_val].u_val));
-
- read_tag(&ptr2,"last_ds","%30s",rrd->pdp_prep[rrd->stat_head->ds_cnt-1].last_ds);
- read_tag(&ptr2,"value","%lf",&(rrd->pdp_prep[rrd->stat_head->ds_cnt-1].scratch[PDP_val].u_val));
- read_tag(&ptr2,"unknown_sec","%lu",&(rrd->pdp_prep[i].scratch[PDP_unkn_sec_cnt].u_cnt));
- eat_tag(&ptr2,"/ds");
- ptr=ptr2;
- }
-
- ptr2 = ptr;
- while (eat_tag(&ptr2,"rra") == 1){
- rrd->stat_head->rra_cnt++;
-
- /* alocate and reset rra definition areas */
- if((rrd->rra_def = rrd_realloc(rrd->rra_def,rrd->stat_head->rra_cnt*sizeof(rra_def_t)))==NULL){
- rrd_set_error("allocating rra_def"); return -1; }
- memset(&(rrd->rra_def[rrd->stat_head->rra_cnt-1]), 0, sizeof(rra_def_t));
-
- /* alocate and reset consolidation point areas */
- if((rrd->cdp_prep = rrd_realloc(rrd->cdp_prep,
- rrd->stat_head->rra_cnt
- *rrd->stat_head->ds_cnt*sizeof(cdp_prep_t)))==NULL){
- rrd_set_error("allocating cdp_prep"); return -1; }
-
- memset(&(rrd->cdp_prep[rrd->stat_head->ds_cnt*(rrd->stat_head->rra_cnt-1)]),
- 0, rrd->stat_head->ds_cnt*sizeof(cdp_prep_t));
-
-
- read_tag(&ptr2,"cf",CF_NAM_FMT,rrd->rra_def[rrd->stat_head->rra_cnt-1].cf_nam);
- /* test for valid type */
- if(cf_conv(rrd->rra_def[rrd->stat_head->rra_cnt-1].cf_nam) == -1) return -1;
-
- read_tag(&ptr2,"pdp_per_row","%lu",&(rrd->rra_def[rrd->stat_head->rra_cnt-1].pdp_cnt));
- /* add support to read RRA parameters */
- eat_tag(&ptr2, "params");
- for (i = 0; i < MAX_RRA_PAR_EN; i++)
- {
- if (i == RRA_dependent_rra_idx ||
- i == RRA_seasonal_smooth_idx ||
- i == RRA_failure_threshold)
- read_tag(&ptr2, "value","%u",
- &(rrd->rra_def[rrd->stat_head->rra_cnt-1].par[i].u_cnt));
- else
- read_tag(&ptr2, "value","%lf",
- &(rrd->rra_def[rrd->stat_head->rra_cnt-1].par[i].u_val));
- }
- eat_tag(&ptr2, "/params");
- eat_tag(&ptr2,"cdp_prep");
- for(i=0;i<rrd->stat_head->ds_cnt;i++)
- {
- eat_tag(&ptr2,"ds");
- /* add suport to read CDP parameters */
- for (ii = 0; ii < MAX_CDP_PAR_EN; ii++)
- {
- /* handle integer values as a special case */
- if (cf_conv(rrd->rra_def[rrd->stat_head->rra_cnt-1].cf_nam) == CF_FAILURES ||
- ii == CDP_unkn_pdp_cnt ||
- ii == CDP_null_count ||
- ii == CDP_last_null_count)
- {
- read_tag(&ptr2,"value","%lu",
- &(rrd->cdp_prep[rrd->stat_head->ds_cnt*(rrd->stat_head->rra_cnt-1)
- +i].scratch[ii].u_cnt));
- } else {
- read_tag(&ptr2,"value","%lf",&(rrd->cdp_prep[rrd->stat_head->ds_cnt*
- (rrd->stat_head->rra_cnt-1) +i].scratch[ii].u_val));
- }
-
-#if 0
- read_tag(&ptr2,"unknown_datapoints","%lu",&(rrd->cdp_prep[rrd->stat_head->ds_cnt
- *(rrd->stat_head->rra_cnt-1) +i].scratch[CDP_unkn_pdp_cnt].u_cnt));
-#endif
- } /* end for */
- eat_tag(&ptr2,"/ds");
- }
- eat_tag(&ptr2,"/cdp_prep");
- rrd->rra_def[rrd->stat_head->rra_cnt-1].row_cnt=0;
- eat_tag(&ptr2,"database");
- ptr3 = ptr2;
- while (eat_tag(&ptr3,"row") == 1){
-
- if(mempool==0){
- mempool = 1000;
- if((rrd->rrd_value = rrd_realloc(rrd->rrd_value,
- (rows+mempool)*(rrd->stat_head->ds_cnt)
- *sizeof(rrd_value_t)))==NULL) {
- rrd_set_error("allocating rrd_values"); return -1; }
- }
- rows++;
- mempool--;
- rrd->rra_def[rrd->stat_head->rra_cnt-1].row_cnt++;
- for(i=0;i<rrd->stat_head->ds_cnt;i++){
-
- rrd_value_t * value = &(rrd->rrd_value[(rows-1)*rrd->stat_head->ds_cnt+i]);
-
- read_tag(&ptr3,"v","%lf", value);
-
- if (
- (rc == 1) /* do we have to check for the ranges */
- &&
- (!isnan(*value)) /* not a NAN value */
- &&
- ( /* min defined and in the range ? */
- (!isnan(rrd->ds_def[i].par[DS_min_val].u_val)
- && (*value < rrd->ds_def[i].par[DS_min_val].u_val))
- || /* max defined and in the range ? */
- (!isnan(rrd->ds_def[i].par[DS_max_val].u_val)
- && (*value > rrd->ds_def[i].par[DS_max_val].u_val))
- )
- ) {
- fprintf (stderr, "out of range found [ds: %lu], [value : %0.10e]\n", i, *value);
- *value = DNAN;
- }
- }
- eat_tag(&ptr3,"/row");
- ptr2=ptr3;
- }
- eat_tag(&ptr2,"/database");
- eat_tag(&ptr2,"/rra");
- ptr=ptr2;
- }
- eat_tag(&ptr,"/rrd");
-
- if((rrd->rra_ptr = calloc(1,sizeof(rra_ptr_t)*rrd->stat_head->rra_cnt)) == NULL) {
- rrd_set_error("allocating rra_ptr");
- return(-1);
- }
-
- for(i=0; i <rrd->stat_head->rra_cnt; i++) {
- /* last row in the xml file is the most recent; as
- * rrd_update increments the current row pointer, set cur_row
- * here to the last row. */
- rrd->rra_ptr[i].cur_row = rrd->rra_def[i].row_cnt-1;
- }
- if (ptr==NULL)
- return -1;
- return 1;
-}
-