X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fcore%2Fstore_lookup.c;h=fa7a8dad7d98a1bb35ca28fb1b896131ee1f13a7;hb=31c79a0408f61f43310093e0e03681c7f5206483;hp=e6e0a180f9853448d9ea91d0916531fe03d46189;hpb=6af8978bd0a03f024aba517495aa32c89de71e5c;p=sysdb.git diff --git a/src/core/store_lookup.c b/src/core/store_lookup.c index e6e0a18..fa7a8da 100644 --- a/src/core/store_lookup.c +++ b/src/core/store_lookup.c @@ -71,6 +71,27 @@ lookup_iter(sdb_store_base_t *obj, void *user_data) return 0; } /* lookup_iter */ +static sdb_store_base_t * +attr_get(sdb_store_base_t *host, const char *name) +{ + sdb_llist_iter_t *iter = NULL; + sdb_store_base_t *attr = NULL; + + assert(host->type == SDB_HOST); + + iter = sdb_llist_get_iter(SDB_STORE_OBJ(host)->attributes); + while (sdb_llist_iter_has_next(iter)) { + sdb_attribute_t *a = SDB_ATTR(sdb_llist_iter_get_next(iter)); + + if (strcasecmp(name, SDB_OBJ(a)->name)) + continue; + attr = STORE_BASE(a); + break; + } + sdb_llist_iter_destroy(iter); + return attr; +} /* attr_get */ + /* * matcher implementations */ @@ -153,28 +174,20 @@ match_name(sdb_store_matcher_t *m, sdb_store_base_t *obj) static int match_attr(sdb_store_matcher_t *m, sdb_store_base_t *obj) { - sdb_llist_iter_t *iter = NULL; - int status = 0; + sdb_attribute_t *attr; assert(m->type == MATCHER_ATTR); + assert(ATTR_M(m)->name); - iter = sdb_llist_get_iter(SDB_STORE_OBJ(obj)->attributes); - while (sdb_llist_iter_has_next(iter)) { - sdb_attribute_t *attr = SDB_ATTR(sdb_llist_iter_get_next(iter)); + attr = SDB_ATTR(attr_get(obj, ATTR_M(m)->name)); + if (attr) { char buf[sdb_data_strlen(&attr->value) + 1]; - - if (ATTR_M(m)->name && strcasecmp(ATTR_M(m)->name, SDB_OBJ(attr)->name)) - continue; - if (sdb_data_format(&attr->value, buf, sizeof(buf), SDB_UNQUOTED) <= 0) return 0; - if (match_string(&ATTR_M(m)->value, buf)) { - status = 1; - break; - } + if (match_string(&ATTR_M(m)->value, buf)) + return 1; } - sdb_llist_iter_destroy(iter); - return status; + return 0; } /* match_attr */ typedef int (*matcher_cb)(sdb_store_matcher_t *, sdb_store_base_t *); @@ -449,6 +462,9 @@ sdb_store_name_matcher(int type, const char *name, _Bool re) sdb_store_matcher_t * sdb_store_attr_matcher(const char *name, const char *value, _Bool re) { + if (! name) + return NULL; + if (re) return M(sdb_object_create("attr-matcher", attr_type, name, NULL, value));