diff --git a/src/core/store_expr.c b/src/core/store_expr.c
index 80c1f4ac25c756383d579a1a92042045f5df6cec..5e15f5350b9ca26d16564317e46957e8285fbcd3 100644 (file)
--- a/src/core/store_expr.c
+++ b/src/core/store_expr.c
#include "core/object.h"
#include <assert.h>
+#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
sdb_data_t array;
size_t array_idx;
+ bool free_array;
sdb_store_matcher_t *filter;
};
sdb_store_expr_iter_t *iter;
sdb_avltree_iter_t *tree = NULL;
sdb_data_t array = SDB_DATA_INIT;
+ bool free_array = 0;
if (! expr)
return NULL;
if (expr->data.type & SDB_TYPE_ARRAY)
array = expr->data;
}
- else
- return NULL;
+ else {
+ sdb_data_t value = SDB_DATA_INIT;
+ if (sdb_store_expr_eval(expr, obj, &value, filter))
+ return NULL;
+ if (! (value.type & SDB_TYPE_ARRAY)) {
+ sdb_data_free_datum(&value);
+ return NULL;
+ }
+ array = value;
+ free_array = 1;
+ }
if ((! tree) && (array.type == SDB_TYPE_NULL))
return NULL;
iter = calloc(1, sizeof(*iter));
- if (! iter)
+ if (! iter) {
+ if (free_array)
+ sdb_data_free_datum(&array);
return NULL;
+ }
sdb_object_ref(SDB_OBJ(obj));
sdb_object_ref(SDB_OBJ(expr));
iter->expr = expr;
iter->tree = tree;
iter->array = array;
+ iter->free_array = free_array;
iter->filter = filter;
return iter;
} /* sdb_store_expr_iter */
sdb_avltree_iter_destroy(iter->tree);
iter->tree = NULL;
+ if (iter->free_array)
+ sdb_data_free_datum(&iter->array);
iter->array = null;
iter->array_idx = 0;