Code

data: Document that regexes are extended, case-insensitive POSIX regexes.
[sysdb.git] / src / core / store_lookup.c
index c3029c75078db3c0ee6d35b0fcbe602a799f41f6..302736754ed8434421596b0801d08cc5ad33f27e 100644 (file)
@@ -121,7 +121,7 @@ attr_cmp(sdb_store_obj_t *obj, sdb_store_cond_t *cond,
        if (! attr)
                status = INT_MAX;
        else if (attr->value.type != value.type)
-               status = INT_MAX;
+               status = sdb_data_strcmp(&attr->value, &value);
        else
                status = sdb_data_cmp(&attr->value, &value);
        sdb_data_free_datum(&value);
@@ -136,19 +136,17 @@ obj_cmp(sdb_store_obj_t *obj, sdb_store_cond_t *cond,
        sdb_data_t value = SDB_DATA_INIT;
        int status;
 
-       if (sdb_store_get_field(obj, OBJ_C(cond)->field, &obj_value))
-               return INT_MAX;
        if (sdb_store_expr_eval(OBJ_C(cond)->expr, obj, &value))
                return INT_MAX;
 
-       if (obj_value.type != value.type) {
-               sdb_data_free_datum(&value);
-               return INT_MAX;
-       }
-       else if (OBJ_C(cond)->field == SDB_FIELD_BACKEND) {
+       if (OBJ_C(cond)->field == SDB_FIELD_BACKEND) {
                /* this implementation is not actually a conditional but rather checks
                 * for equality (or rather, existence) only */
                size_t i;
+
+               if (value.type != SDB_TYPE_STRING)
+                       return INT_MAX;
+
                status = INT_MAX;
                for (i = 0; i < obj->backends_num; ++i) {
                        if (! strcasecmp(obj->backends[i], value.data.string)) {
@@ -156,10 +154,20 @@ obj_cmp(sdb_store_obj_t *obj, sdb_store_cond_t *cond,
                                break;
                        }
                }
+               sdb_data_free_datum(&value);
+               return status;
        }
-       else {
-               status = sdb_data_cmp(&obj_value, &value);
+
+       if (sdb_store_get_field(obj, OBJ_C(cond)->field, &obj_value))
+               return INT_MAX;
+       if (obj_value.type != value.type) {
+               sdb_data_free_datum(&obj_value);
+               sdb_data_free_datum(&value);
+               return INT_MAX;
        }
+
+       status = sdb_data_cmp(&obj_value, &value);
+       sdb_data_free_datum(&obj_value);
        sdb_data_free_datum(&value);
        return status;
 } /* obj_cmp */
@@ -857,6 +865,18 @@ sdb_store_isnull_matcher(const char *attr_name)
                                MATCHER_ISNULL, attr_name));
 } /* sdb_store_isnull_matcher */
 
+int
+sdb_store_parse_object_type_plural(const char *name)
+{
+       if (! strcasecmp(name, "hosts"))
+               return SDB_HOST;
+       else if (! strcasecmp(name, "services"))
+               return SDB_SERVICE;
+       else if (! strcasecmp(name, "metrics"))
+               return SDB_METRIC;
+       return -1;
+} /* sdb_store_parse_object_type_plural */
+
 int
 sdb_store_parse_field_name(const char *name)
 {
@@ -989,6 +1009,8 @@ sdb_store_matcher_parse_cmp(const char *obj_type, const char *attr,
                return NULL;
        if (value.type != SDB_TYPE_STRING) {
                sdb_data_free_datum(&value);
+               if (type != SDB_ATTRIBUTE)
+                       return NULL;
                return parse_attr_cmp(attr, op, expr);
        }