X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fcore%2Fstore_lookup.c;h=c3029c75078db3c0ee6d35b0fcbe602a799f41f6;hb=dfa8850d084337223b41c03385317bf7359c8643;hp=124c4514c59170a82e2fb575ccc35583bc8d18e1;hpb=90ada5c7c86cf280b2a4468e285671e9314e0d29;p=sysdb.git diff --git a/src/core/store_lookup.c b/src/core/store_lookup.c index 124c451..c3029c7 100644 --- a/src/core/store_lookup.c +++ b/src/core/store_lookup.c @@ -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;