X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Fcore%2Fstore_expr.c;h=6405002cfda3187177dc9b49dae9ce2bc8e82322;hb=060c0cebbae60bd3d90691858465d462fba0d952;hp=5e15f5350b9ca26d16564317e46957e8285fbcd3;hpb=026ce2bb377f4055e3a0a1d20a2f91e5a73a49b0;p=sysdb.git diff --git a/src/core/store_expr.c b/src/core/store_expr.c index 5e15f53..6405002 100644 --- a/src/core/store_expr.c +++ b/src/core/store_expr.c @@ -263,44 +263,6 @@ sdb_store_expr_eval(sdb_store_expr_t *expr, sdb_store_obj_t *obj, return status; } /* sdb_store_expr_eval */ -bool -sdb_store_expr_iterable(sdb_store_expr_t *expr, int context) -{ - if (expr->type == TYPED_EXPR) { - if ((context != SDB_HOST) && (context != SDB_SERVICE) - && (context != SDB_METRIC)) - return 0; - if (context == expr->data.data.integer) - return 0; - if ((expr->data.data.integer != SDB_SERVICE) - && (expr->data.data.integer != SDB_METRIC) - && (expr->data.data.integer != SDB_ATTRIBUTE)) - return 0; - if ((context == SDB_SERVICE) - && (expr->data.data.integer == SDB_METRIC)) - return 0; - else if ((context == SDB_METRIC) - && (expr->data.data.integer == SDB_SERVICE)) - return 0; - return 1; - } - else if (expr->type == FIELD_VALUE) { - if ((context != SDB_HOST) && (context != SDB_SERVICE) - && (context != SDB_METRIC) && (context != SDB_ATTRIBUTE)) - return 0; - if (expr->data.data.integer == SDB_FIELD_BACKEND) - return 1; - else if (expr->data.data.integer == SDB_FIELD_VALUE) - /* we don't current support this just like when using - * the attribute[] syntax */ - return 0; - } - else if (! expr->type) { - return !!(expr->data.type & SDB_TYPE_ARRAY); - } - return 0; -} /* sdb_store_expr_iterable */ - sdb_store_expr_iter_t * sdb_store_expr_iter(sdb_store_expr_t *expr, sdb_store_obj_t *obj, sdb_store_matcher_t *filter) @@ -313,6 +275,23 @@ sdb_store_expr_iter(sdb_store_expr_t *expr, sdb_store_obj_t *obj, if (! expr) return NULL; + while (expr->type == TYPED_EXPR) { + int type = (int)expr->data.data.integer; + + if (obj->type == type) { + /* self reference */ + } + else if ((type == SDB_HOST) + && ((obj->type == SDB_SERVICE) + || (obj->type == SDB_METRIC))) { + /* reference to parent host */ + obj = obj->parent; + } + else + break; + expr = expr->left; + } + if (expr->type == TYPED_EXPR) { if (! obj) return NULL;