diff --git a/src/core/store.c b/src/core/store.c
index b2062831c7447cff2feeea535e9ee325e45e70b1..345b5ea86bf2555c42961b4778ccb800743066b7 100644 (file)
--- a/src/core/store.c
+++ b/src/core/store.c
#include <stdlib.h>
#include <string.h>
+#include <math.h>
#include <pthread.h>
/*
*/
static sdb_host_t *
-lookup_host(const char *name, _Bool canonicalize)
+lookup_host(const char *name, bool canonicalize)
{
sdb_host_t *host;
char *cname;
static sdb_avltree_t *
get_host_children(sdb_host_t *host, int type)
{
- assert((type == SDB_SERVICE) || (type == SDB_METRIC)
- || (type == SDB_ATTRIBUTE));
+ if ((type != SDB_SERVICE) && (type != SDB_METRIC)
+ && (type != SDB_ATTRIBUTE))
+ return NULL;
if (! host)
return NULL;
snprintf(time_str, sizeof(time_str), "<error>");
time_str[sizeof(time_str) - 1] = '\0';
- sdb_strbuf_append(buf, "{\"timestamp\": \"%s\", "
- "\"value\": \"%f\"}", time_str, ts->data[i][j].value);
+ /* Some GNU libc versions may print '-nan' which we dont' want */
+ if (isnan(ts->data[i][j].value))
+ sdb_strbuf_append(buf, "{\"timestamp\": \"%s\", "
+ "\"value\": \"nan\"}", time_str);
+ else
+ sdb_strbuf_append(buf, "{\"timestamp\": \"%s\", "
+ "\"value\": \"%f\"}", time_str, ts->data[i][j].value);
if (j < ts->data_len - 1)
sdb_strbuf_append(buf, ",");
status = store_obj(NULL, hosts, SDB_HOST, cname, last_update, NULL);
pthread_rwlock_unlock(&host_lock);
+ if (sdb_plugin_store_host(name, last_update))
+ status = -1;
+
free(cname);
return status;
} /* sdb_store_host */
-_Bool
+bool
sdb_store_has_host(const char *name)
{
sdb_host_t *host;
sdb_object_deref(SDB_OBJ(host));
pthread_rwlock_unlock(&host_lock);
+
+ if (sdb_plugin_store_attribute(hostname, key, value, last_update))
+ status = -1;
return status;
} /* sdb_store_attribute */
sdb_object_deref(SDB_OBJ(host));
pthread_rwlock_unlock(&host_lock);
+
+ if (sdb_plugin_store_service(hostname, name, last_update))
+ status = -1;
return status;
} /* sdb_store_service */
sdb_object_deref(SDB_OBJ(svc));
pthread_rwlock_unlock(&host_lock);
+
+ if (sdb_plugin_store_service_attribute(hostname, service,
+ key, value, last_update))
+ status = -1;
return status;
} /* sdb_store_service_attr */
if ((! hostname) || (! name))
return -1;
- if (store && ((! store->type) || (! store->id)))
- return -1;
+
+ if (store) {
+ if ((store->type != NULL) != (store->id != NULL))
+ return -1;
+ else if (! store->type)
+ store = NULL;
+ }
pthread_rwlock_wrlock(&host_lock);
host = lookup_host(hostname, /* canonicalize = */ 1);
status = -1;
}
pthread_rwlock_unlock(&host_lock);
+
+ if (sdb_plugin_store_metric(hostname, name, store, last_update))
+ status = -1;
return status;
} /* sdb_store_metric */
sdb_object_deref(SDB_OBJ(m));
pthread_rwlock_unlock(&host_lock);
+
+ if (sdb_plugin_store_metric_attribute(hostname, metric,
+ key, value, last_update))
+ status = -1;
return status;
} /* sdb_store_metric_attr */
+sdb_store_obj_t *
+sdb_store_get_child(sdb_store_obj_t *host, int type, const char *name)
+{
+ sdb_avltree_t *children;
+
+ if ((! host) || (host->type != SDB_HOST) || (! name))
+ return NULL;
+
+ children = get_host_children(HOST(host), type);
+ if (! children)
+ return NULL;
+ return STORE_OBJ(sdb_avltree_lookup(children, name));
+} /* sdb_store_get_child */
+
int
sdb_store_fetch_timeseries(const char *hostname, const char *metric,
sdb_timeseries_opts_t *opts, sdb_strbuf_t *buf)
tmp.data.array.length = obj->backends_num;
tmp.data.array.values = obj->backends;
return sdb_data_copy(res, &tmp);
- break;
}
default:
return -1;
sdb_store_scan(int type, sdb_store_matcher_t *m, sdb_store_matcher_t *filter,
sdb_store_lookup_cb cb, void *user_data)
{
- sdb_avltree_iter_t *host_iter;
+ sdb_avltree_iter_t *host_iter = NULL;
int status = 0;
if (! cb)
pthread_rwlock_rdlock(&host_lock);
- host_iter = sdb_avltree_get_iter(hosts);
- if (! host_iter)
- status = -1;
+ if (hosts) {
+ host_iter = sdb_avltree_get_iter(hosts);
+ if (! host_iter)
+ status = -1;
+ }
/* has_next returns false if the iterator is NULL */
while (sdb_avltree_iter_has_next(host_iter)) {