index 501d7d198b5129c2de51b7bfa9d2a65c649b75e9..3920b80127c5a228792b299e06bc5e6e51f1187b 100644 (file)
--- a/src/core/store_lookup.c
+++ b/src/core/store_lookup.c
} /* sdb_store_gt_matcher */
static sdb_store_matcher_t *
-parse_attr_cmp(const char *attr, const char *op, const char *value)
+parse_attr_cmp(const char *attr, const char *op, const sdb_data_t *value)
{
sdb_store_matcher_t *(*matcher)(sdb_store_cond_t *) = NULL;
sdb_store_matcher_t *m;
sdb_store_cond_t *cond;
- sdb_data_t data;
+ _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;
- data.type = SDB_TYPE_STRING;
- data.data.string = strdup(value);
- if (! data.data.string)
- return NULL;
- cond = sdb_store_attr_cond(attr, &data);
- free(data.data.string);
+ cond = sdb_store_attr_cond(attr, value);
if (! cond)
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 */
sdb_store_matcher_t *
sdb_store_matcher_parse_cmp(const char *obj_type, const char *attr,
- const char *op, const char *value)
+ const char *op, const sdb_data_t *value)
{
int type = -1;
_Bool inv = 0;
else
return NULL;
+ 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, re);
+ m = sdb_store_name_matcher(type, value->data.string, re);
else if (type == SDB_ATTRIBUTE)
- m = sdb_store_attr_matcher(attr, value, re);
+ m = sdb_store_attr_matcher(attr, value->data.string, re);
if (! m)
return NULL;