diff --git a/src/core/store_expr.c b/src/core/store_expr.c
index 11370bb438455f6fcf3b08a34a4bcfa5607a98af..6e39305a89ecd18718ad7984a4e7cc85f407728d 100644 (file)
--- a/src/core/store_expr.c
+++ b/src/core/store_expr.c
sdb_data_t value = { SDB_TYPE_INTEGER, { .integer = field } };
sdb_store_expr_t *e;
sdb_data_t value = { SDB_TYPE_INTEGER, { .integer = field } };
sdb_store_expr_t *e;
- if ((field < SDB_FIELD_NAME) || (SDB_FIELD_BACKEND < field))
+ if ((field < SDB_FIELD_NAME) || (SDB_FIELD_VALUE < field))
return NULL;
e = SDB_STORE_EXPR(sdb_object_create("store-fieldvalue", expr_type,
FIELD_VALUE, NULL, NULL, &value));
return NULL;
e = SDB_STORE_EXPR(sdb_object_create("store-fieldvalue", expr_type,
FIELD_VALUE, NULL, NULL, &value));
if ((context != SDB_HOST) && (context != SDB_SERVICE)
&& (context != SDB_METRIC) && (context != SDB_ATTRIBUTE))
return 0;
if ((context != SDB_HOST) && (context != SDB_SERVICE)
&& (context != SDB_METRIC) && (context != SDB_ATTRIBUTE))
return 0;
- return expr->data.data.integer == SDB_FIELD_BACKEND;
+ 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[<name>] syntax */
+ return 0;
}
else if (! expr->type) {
return !!(expr->data.type & SDB_TYPE_ARRAY);
}
else if (! expr->type) {
return !!(expr->data.type & SDB_TYPE_ARRAY);
sdb_avltree_iter_t *tree = NULL;
sdb_data_t array = SDB_DATA_INIT;
sdb_avltree_iter_t *tree = NULL;
sdb_data_t array = SDB_DATA_INIT;
- if ((! expr) || (! obj))
+ if (! expr)
return NULL;
if (expr->type == TYPED_EXPR) {
return NULL;
if (expr->type == TYPED_EXPR) {
+ if (! obj)
+ return NULL;
if (obj->type == SDB_HOST) {
if (expr->data.data.integer == SDB_SERVICE)
tree = sdb_avltree_get_iter(HOST(obj)->services);
if (obj->type == SDB_HOST) {
if (expr->data.data.integer == SDB_SERVICE)
tree = sdb_avltree_get_iter(HOST(obj)->services);
}
}
else if (expr->type == FIELD_VALUE) {
}
}
else if (expr->type == FIELD_VALUE) {
+ if (! obj)
+ return NULL;
if (expr->data.data.integer == SDB_FIELD_BACKEND) {
/* while scanning the store, we hold a read lock, so it's safe to
* access the data without copying */
if (expr->data.data.integer == SDB_FIELD_BACKEND) {
/* while scanning the store, we hold a read lock, so it's safe to
* access the data without copying */
if (! iter)
return 0;
if (! iter)
return 0;
- if (iter->tree)
+ if (iter->tree) {
+ /* this function may be called before get_next,
+ * so we'll have to apply filters here as well */
+ if (iter->filter) {
+ sdb_store_obj_t *child;
+ while ((child = STORE_OBJ(sdb_avltree_iter_peek_next(iter->tree)))) {
+ if (sdb_store_matcher_matches(iter->filter, child, NULL))
+ break;
+ (void)sdb_avltree_iter_get_next(iter->tree);
+ }
+ }
+
return sdb_avltree_iter_has_next(iter->tree);
return sdb_avltree_iter_has_next(iter->tree);
+ }
+
return iter->array_idx < iter->array.data.array.length;
} /* sdb_store_expr_iter_has_next */
return iter->array_idx < iter->array.data.array.length;
} /* sdb_store_expr_iter_has_next */
&& (! sdb_store_matcher_matches(iter->filter, child, NULL)))
continue;
&& (! sdb_store_matcher_matches(iter->filter, child, NULL)))
continue;
- if (sdb_store_expr_eval(iter->expr, iter->obj, &ret, iter->filter))
+ if (sdb_store_expr_eval(iter->expr, child, &ret, iter->filter))
return null;
break;
}
/* Skip over any filtered objects */
return null;
break;
}
/* Skip over any filtered objects */
- if (iter->filter)
- while ((child = STORE_OBJ(sdb_avltree_iter_peek_next(iter->tree))))
+ if (iter->filter) {
+ while ((child = STORE_OBJ(sdb_avltree_iter_peek_next(iter->tree)))) {
if (sdb_store_matcher_matches(iter->filter, child, NULL))
break;
if (sdb_store_matcher_matches(iter->filter, child, NULL))
break;
+ (void)sdb_avltree_iter_get_next(iter->tree);
+ }
+ }
return ret;
}
return ret;
}