Code

store: Added core support for “metrics” objects.
[sysdb.git] / src / core / store_lookup.c
index 1ec1dbb68e702f6c5e4a9722e885f1042494cf38..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);
@@ -138,7 +138,7 @@ obj_cmp(sdb_store_obj_t *obj, sdb_store_cond_t *cond,
 
        if (sdb_store_get_field(obj, OBJ_C(cond)->field, &obj_value))
                return INT_MAX;
-       if (sdb_store_expr_eval(OBJ_C(cond)->expr, &value))
+       if (sdb_store_expr_eval(OBJ_C(cond)->expr, obj, &value))
                return INT_MAX;
 
        if (obj_value.type != value.type) {
@@ -233,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;
@@ -577,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)
@@ -854,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)
 {
@@ -939,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
@@ -966,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);
@@ -996,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;