sdb_timeseries_info_t * sdb_timeseries_info_create(size_t data_names_len, const char * const *data_names) { sdb_timeseries_info_t *ts_info; ts_info = calloc(1, sizeof(*ts_info)); if (! ts_info) return NULL; if (stringv_copy(&ts_info->data_names, &ts_info->data_names_len, data_names, data_names_len)) { sdb_timeseries_info_destroy(ts_info); return NULL; } return ts_info; } /* sdb_timeseries_info_create */
static sdb_timeseries_info_t * sdb_rrd_describe(const char *id, sdb_object_t *user_data) { rrd_info_t *info, *iter; char filename[strlen(id) + 1]; sdb_timeseries_info_t *ts_info; strncpy(filename, id, sizeof(filename)); if (user_data) { /* -> use RRDCacheD */ char *addr = SDB_OBJ_WRAPPER(user_data)->data; if (! rrdcached_connect(addr)) return NULL; #ifdef HAVE_RRD_CLIENT_H /* TODO: detect and use rrdc_info if possible */ sdb_log(SDB_LOG_ERR, "DESCRIBE not yet supported via RRDCacheD"); return NULL; #endif } else { rrd_clear_error(); info = rrd_info_r(filename); } if (! info) { sdb_log(SDB_LOG_ERR, "Failed to extract header information from '%s': %s", filename, rrd_get_error()); return NULL; } ts_info = calloc(1, sizeof(*ts_info)); if (! ts_info) { sdb_log(SDB_LOG_ERR, "Failed to allocate memory"); rrd_info_free(info); return NULL; } for (iter = info; iter != NULL; iter = iter->next) { size_t len, n, m; char *ds_name; char **tmp; /* Parse the DS name. The raw value is not exposed via the rrd_info * interface. */ n = strlen("ds["); if (strncmp(iter->key, "ds[", n)) continue; len = strlen(iter->key); m = strlen("].index"); if ((len < m) || strcmp(iter->key + len - m, "].index")) continue; ds_name = iter->key + n; len -= n; ds_name[len - m] = '\0'; /* Append the new datum. */ tmp = realloc(ts_info->data_names, (ts_info->data_names_len + 1) * sizeof(*ts_info->data_names)); if (! tmp) { sdb_log(SDB_LOG_ERR, "Failed to allocate memory"); sdb_timeseries_info_destroy(ts_info); rrd_info_free(info); return NULL; } ts_info->data_names = tmp; ts_info->data_names[ts_info->data_names_len] = strdup(ds_name); if (! ts_info->data_names[ts_info->data_names_len]) { sdb_log(SDB_LOG_ERR, "Failed to allocate memory"); sdb_timeseries_info_destroy(ts_info); rrd_info_free(info); return NULL; } ts_info->data_names_len++; } rrd_info_free(info); return ts_info; } /* sdb_rrd_describe */