Code

data: Return the number of bytes that would have been returned.
[sysdb.git] / src / core / store_lookup.c
index a95f5877d38011dff4788e4655e8616bc27d420a..2e73780fbf8da67f51c7e040470d051668b20621 100644 (file)
@@ -142,7 +142,7 @@ match_regex_value(int op, sdb_data_t *v, sdb_data_t *re)
        else if (re->type != SDB_TYPE_REGEX)
                return 0;
 
-       if (sdb_data_format(v, value, sizeof(value), SDB_UNQUOTED) < 0)
+       if (! sdb_data_format(v, value, sizeof(value), SDB_UNQUOTED))
                status = 0;
        else if (! regexec(&re->data.re.regex, value, 0, NULL, 0))
                status = 1;
@@ -201,6 +201,8 @@ match_iter_array(sdb_store_matcher_t *m, sdb_store_obj_t *obj,
 
        int status;
 
+       assert(CMP_M(m)->left && CMP_M(m)->right);
+
        if ((ITER_M(m)->m->type < MATCHER_LT)
                        || (MATCHER_NREGEX < ITER_M(m)->m->type))
                return 0;
@@ -308,6 +310,7 @@ match_cmp(sdb_store_matcher_t *m, sdb_store_obj_t *obj,
                        || (m->type == MATCHER_NE)
                        || (m->type == MATCHER_GE)
                        || (m->type == MATCHER_GT));
+       assert(e1 && e2);
 
        if (expr_eval2(e1, &v1, e2, &v2, obj, filter))
                return 0;
@@ -326,7 +329,8 @@ match_in(sdb_store_matcher_t *m, sdb_store_obj_t *obj,
        sdb_data_t value = SDB_DATA_INIT, array = SDB_DATA_INIT;
        int status = 1;
 
-       assert(m->type == MATCHER_IN);
+       assert((m->type == MATCHER_IN) || (m->type == MATCHER_NIN));
+       assert(CMP_M(m)->left && CMP_M(m)->right);
 
        if (expr_eval2(CMP_M(m)->left, &value,
                                CMP_M(m)->right, &array, obj, filter))
@@ -336,6 +340,8 @@ match_in(sdb_store_matcher_t *m, sdb_store_obj_t *obj,
                status = sdb_data_inarray(&value, &array);
 
        expr_free_datum2(CMP_M(m)->left, &value, CMP_M(m)->right, &array);
+       if (m->type == MATCHER_NIN)
+               return !status;
        return status;
 } /* match_in */
 
@@ -348,6 +354,7 @@ match_regex(sdb_store_matcher_t *m, sdb_store_obj_t *obj,
 
        assert((m->type == MATCHER_REGEX)
                        || (m->type == MATCHER_NREGEX));
+       assert(CMP_M(m)->left && CMP_M(m)->right);
 
        if (expr_eval2(CMP_M(m)->left, &v, CMP_M(m)->right, &regex, obj, filter))
                return 0;
@@ -401,6 +408,7 @@ matchers[] = {
        match_iter,
        match_iter,
        match_in,
+       match_in,
 
        /* unary operators */
        match_isnull,
@@ -477,7 +485,7 @@ cmp_matcher_init(sdb_object_t *obj, va_list ap)
        CMP_M(obj)->right = va_arg(ap, sdb_store_expr_t *);
        sdb_object_ref(SDB_OBJ(CMP_M(obj)->right));
 
-       if ((! CMP_M(obj)->left) || (! CMP_M(obj)->right))
+       if (! CMP_M(obj)->right)
                return -1;
        return 0;
 } /* cmp_matcher_init */
@@ -633,6 +641,13 @@ sdb_store_in_matcher(sdb_store_expr_t *left, sdb_store_expr_t *right)
                                MATCHER_IN, left, right));
 } /* sdb_store_in_matcher */
 
+sdb_store_matcher_t *
+sdb_store_nin_matcher(sdb_store_expr_t *left, sdb_store_expr_t *right)
+{
+       return M(sdb_object_create("not-in-matcher", cmp_type,
+                               MATCHER_NIN, left, right));
+} /* sdb_store_in_matcher */
+
 sdb_store_matcher_t *
 sdb_store_regex_matcher(sdb_store_expr_t *left, sdb_store_expr_t *right)
 {