index 658f931ab30bc3fe64dd30b53e439416ad6a9ae6..3920b80127c5a228792b299e06bc5e6e51f1187b 100644 (file)
--- a/src/core/store_lookup.c
+++ b/src/core/store_lookup.c
sdb_store_matcher_t *(*matcher)(sdb_store_cond_t *) = NULL;
sdb_store_matcher_t *m;
sdb_store_cond_t *cond;
+ _Bool inv = 0;
/* TODO: this will reject any attributes called "name";
* use a different syntax for querying objects by name */
else if (! strcasecmp(op, "<="))
matcher = sdb_store_le_matcher;
else if (! strcasecmp(op, "="))
- /* XXX: this is still handled by sdb_store_matcher_parse_cmp */
matcher = sdb_store_eq_matcher;
else if (! strcasecmp(op, ">="))
matcher = sdb_store_ge_matcher;
else if (! strcasecmp(op, ">"))
matcher = sdb_store_gt_matcher;
+ else if (! strcasecmp(op, "!=")) {
+ matcher = sdb_store_eq_matcher;
+ inv = 1;
+ }
else
return NULL;
m = matcher(cond);
/* pass ownership to 'm' or destroy in case of an error */
sdb_object_deref(SDB_OBJ(cond));
+ if (! m)
+ return NULL;
+
+ if (inv) {
+ sdb_store_matcher_t *tmp;
+ tmp = sdb_store_inv_matcher(m);
+ /* pass ownership to the inverse matcher */
+ sdb_object_deref(SDB_OBJ(m));
+ m = tmp;
+ }
return m;
} /* parse_attr_cmp */
else
return NULL;
- if (value->type != SDB_TYPE_STRING)
+ if (value->type != SDB_TYPE_STRING) {
+ if (type == SDB_ATTRIBUTE)
+ return parse_attr_cmp(attr, op, value);
return NULL;
+ }
if (! strcasecmp(attr, "name"))
m = sdb_store_name_matcher(type, value->data.string, re);