Code

data: Let sdb_data_array_get support DATETIME, BINARY, REGEX values.
[sysdb.git] / src / core / store_expr.c
index 230c95795f5046944ee665ce3c86f69efd19e5a7..d9f6e0462b65c39e5e67c4b787139507c3969e43 100644 (file)
@@ -374,6 +374,7 @@ sdb_store_expr_iter_destroy(sdb_store_expr_iter_t *iter)
        iter->array_idx = 0;
 
        sdb_object_deref(SDB_OBJ(iter->obj));
+       sdb_object_deref(SDB_OBJ(iter->expr));
        sdb_object_deref(SDB_OBJ(iter->filter));
        free(iter);
 } /* sdb_store_expr_iter_destroy */
@@ -394,6 +395,7 @@ sdb_store_expr_iter_get_next(sdb_store_expr_iter_t *iter)
 {
        sdb_data_t null = SDB_DATA_INIT;
        sdb_data_t ret = SDB_DATA_INIT;
+       sdb_data_t tmp = SDB_DATA_INIT;
 
        if (! iter)
                return null;
@@ -409,26 +411,32 @@ sdb_store_expr_iter_get_next(sdb_store_expr_iter_t *iter)
                                        && (! 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 */
-               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;
+                               (void)sdb_avltree_iter_get_next(iter->tree);
+                       }
+               }
 
                return ret;
        }
 
        if (iter->array_idx >= iter->array.data.array.length)
                return null;
-       if (sdb_data_array_get(&iter->array, iter->array_idx, &ret))
-               return null;
 
        ++iter->array_idx;
+       if (sdb_data_array_get(&iter->array, iter->array_idx - 1, &ret))
+               return null;
+       if (sdb_data_copy(&tmp, &ret))
+               return null;
+       ret = tmp;
        return ret;
 } /* sdb_store_expr_iter_get_next */