Code

store: Added core support for “metrics” objects.
[sysdb.git] / src / core / store_lookup.c
index 124c4514c59170a82e2fb575ccc35583bc8d18e1..c3029c75078db3c0ee6d35b0fcbe602a799f41f6 100644 (file)
@@ -114,7 +114,7 @@ attr_cmp(sdb_store_obj_t *obj, sdb_store_cond_t *cond,
        if (obj->type != SDB_HOST)
                return INT_MAX;
 
-       if (sdb_store_expr_eval(ATTR_C(cond)->expr, &value))
+       if (sdb_store_expr_eval(ATTR_C(cond)->expr, obj, &value))
                return INT_MAX;
 
        attr = attr_get(HOST(obj), ATTR_C(cond)->name, filter);
@@ -136,28 +136,9 @@ obj_cmp(sdb_store_obj_t *obj, sdb_store_cond_t *cond,
        sdb_data_t value = SDB_DATA_INIT;
        int status;
 
-       switch (OBJ_C(cond)->field) {
-               case SDB_FIELD_LAST_UPDATE:
-                       obj_value.type = SDB_TYPE_DATETIME;
-                       obj_value.data.datetime = obj->last_update;
-                       break;
-               case SDB_FIELD_AGE:
-                       obj_value.type = SDB_TYPE_DATETIME;
-                       obj_value.data.datetime = sdb_gettime() - obj->last_update;
-                       break;
-               case SDB_FIELD_INTERVAL:
-                       obj_value.type = SDB_TYPE_DATETIME;
-                       obj_value.data.datetime = obj->interval;
-                       break;
-               case SDB_FIELD_BACKEND:
-                       obj_value.type = SDB_TYPE_STRING;
-                       obj_value.data.string = NULL; /* handled separately */
-                       break;
-               default:
-                       return INT_MAX;
-       }
-
-       if (sdb_store_expr_eval(OBJ_C(cond)->expr, &value))
+       if (sdb_store_get_field(obj, OBJ_C(cond)->field, &obj_value))
+               return INT_MAX;
+       if (sdb_store_expr_eval(OBJ_C(cond)->expr, obj, &value))
                return INT_MAX;
 
        if (obj_value.type != value.type) {
@@ -252,6 +233,9 @@ match_name(sdb_store_matcher_t *m, sdb_store_obj_t *obj,
                case SDB_SERVICE:
                        iter = sdb_avltree_get_iter(HOST(obj)->services);
                        break;
+               case SDB_METRIC:
+                       iter = sdb_avltree_get_iter(HOST(obj)->metrics);
+                       break;
                case SDB_ATTRIBUTE:
                        iter = sdb_avltree_get_iter(HOST(obj)->attributes);
                        break;
@@ -596,7 +580,7 @@ cond_tostring(sdb_store_matcher_t *m, char *buf, size_t buflen)
                return buf;
        }
 
-       if (sdb_store_expr_eval(expr, &value))
+       if (sdb_store_expr_eval(expr, NULL, &value))
                snprintf(value_str, sizeof(value_str), "ERR");
        else if (sdb_data_format(&value, value_str, sizeof(value_str),
                                SDB_SINGLE_QUOTED) < 0)
@@ -873,6 +857,20 @@ sdb_store_isnull_matcher(const char *attr_name)
                                MATCHER_ISNULL, attr_name));
 } /* sdb_store_isnull_matcher */
 
+int
+sdb_store_parse_field_name(const char *name)
+{
+       if (! strcasecmp(name, "last_update"))
+               return SDB_FIELD_LAST_UPDATE;
+       else if (! strcasecmp(name, "age"))
+               return SDB_FIELD_AGE;
+       else if (! strcasecmp(name, "interval"))
+               return SDB_FIELD_INTERVAL;
+       else if (! strcasecmp(name, "backend"))
+               return SDB_FIELD_BACKEND;
+       return -1;
+} /* sdb_store_parse_field_name */
+
 static sdb_store_matcher_t *
 maybe_inv_matcher(sdb_store_matcher_t *m, _Bool inv)
 {
@@ -958,6 +956,8 @@ sdb_store_matcher_parse_cmp(const char *obj_type, const char *attr,
                type = SDB_HOST;
        else if (! strcasecmp(obj_type, "service"))
                type = SDB_SERVICE;
+       else if (! strcasecmp(obj_type, "metric"))
+               type = SDB_METRIC;
        else if (! strcasecmp(obj_type, "attribute"))
                type = SDB_ATTRIBUTE;
        else
@@ -985,7 +985,7 @@ sdb_store_matcher_parse_cmp(const char *obj_type, const char *attr,
        if (! expr)
                return NULL;
 
-       if (sdb_store_expr_eval(expr, &value))
+       if (sdb_store_expr_eval(expr, NULL, &value))
                return NULL;
        if (value.type != SDB_TYPE_STRING) {
                sdb_data_free_datum(&value);
@@ -1015,20 +1015,12 @@ sdb_store_matcher_parse_field_cmp(const char *name, const char *op,
        if (! expr)
                return NULL;
 
-       if (! strcasecmp(name, "last_update"))
-               field = SDB_FIELD_LAST_UPDATE;
-       else if (! strcasecmp(name, "age"))
-               field = SDB_FIELD_AGE;
-       else if (! strcasecmp(name, "interval"))
-               field = SDB_FIELD_INTERVAL;
-       else if (! strcasecmp(name, "backend"))
-               field = SDB_FIELD_BACKEND;
-       else
+       field = sdb_store_parse_field_name(name);
+       if (field < 0)
                return NULL;
 
        if (parse_cond_op(op, &matcher, &inv))
                return NULL;
-
        cond = sdb_store_obj_cond(field, expr);
        if (! cond)
                return NULL;