Code

store: Let store_metric() accept non-NULL but empty metric-store.
[sysdb.git] / src / core / store.c
index b2062831c7447cff2feeea535e9ee325e45e70b1..98b3a96d28ee6186518ba1f9bd5a16ef2a84e22f 100644 (file)
@@ -43,6 +43,7 @@
 #include <stdlib.h>
 #include <string.h>
 
+#include <math.h>
 #include <pthread.h>
 
 /*
@@ -255,7 +256,7 @@ static sdb_type_t sdb_attribute_type = {
  */
 
 static sdb_host_t *
-lookup_host(const char *name, _Bool canonicalize)
+lookup_host(const char *name, bool canonicalize)
 {
        sdb_host_t *host;
        char *cname;
@@ -426,8 +427,9 @@ store_attr(sdb_store_obj_t *parent, sdb_avltree_t *attributes,
 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;
@@ -479,8 +481,13 @@ ts_tojson(sdb_timeseries_t *ts, sdb_strbuf_t *buf)
                                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, ",");
@@ -533,7 +540,7 @@ sdb_store_host(const char *name, sdb_time_t last_update)
        return status;
 } /* sdb_store_host */
 
-_Bool
+bool
 sdb_store_has_host(const char *name)
 {
        sdb_host_t *host;
@@ -674,8 +681,13 @@ sdb_store_metric(const char *hostname, const char *name,
 
        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);
@@ -762,6 +774,20 @@ sdb_store_metric_attr(const char *hostname, const char *metric,
        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)
@@ -857,7 +883,6 @@ sdb_store_get_field(sdb_store_obj_t *obj, int field, sdb_data_t *res)
                        tmp.data.array.length = obj->backends_num;
                        tmp.data.array.values = obj->backends;
                        return sdb_data_copy(res, &tmp);
-                       break;
                }
                default:
                        return -1;