Esempio n. 1
0
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 */
Esempio n. 2
0
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 */