diff --git a/src/core/store.c b/src/core/store.c
index 6f525c31462ed74e0d4256b889373cdcc38b4ee7..a977954c473b171c6b09bc0bb0f815f8ccdca184 100644 (file)
--- a/src/core/store.c
+++ b/src/core/store.c
sdb_store_matcher_t *filter)
{
sdb_avltree_t *tree = NULL;
- sdb_avltree_iter_t *iter = NULL;
+ sdb_store_obj_t *attr;
if ((! obj) || (! name))
return -1;
if (! tree)
return -1;
- iter = sdb_avltree_get_iter(tree);
- while (sdb_avltree_iter_has_next(iter)) {
- sdb_object_t *attr = sdb_avltree_iter_get_next(iter);
-
- if (strcasecmp(SDB_OBJ(attr)->name, name))
- continue;
-
- if (filter&& (! sdb_store_matcher_matches(filter,
- STORE_OBJ(attr), NULL)))
- break; /* found it but it's filtered */
-
- assert(STORE_OBJ(attr)->type == SDB_ATTRIBUTE);
- if (res)
- sdb_data_copy(res, &ATTR(attr)->value);
- sdb_avltree_iter_destroy(iter);
- return 0;
+ attr = STORE_OBJ(sdb_avltree_lookup(tree, name));
+ if (! attr)
+ return -1;
+ if (filter && (! sdb_store_matcher_matches(filter, attr, NULL))) {
+ sdb_object_deref(SDB_OBJ(attr));
+ return -1;
}
- sdb_avltree_iter_destroy(iter);
- /* not found */
- return -1;
+ assert(STORE_OBJ(attr)->type == SDB_ATTRIBUTE);
+ if (res)
+ sdb_data_copy(res, &ATTR(attr)->value);
+ sdb_object_deref(SDB_OBJ(attr));
+ return 0;
} /* sdb_store_get_attr */
int
} /* sdb_store_tojson */
int
-sdb_store_scan(sdb_store_matcher_t *m, sdb_store_matcher_t *filter,
+sdb_store_scan(int type, sdb_store_matcher_t *m, sdb_store_matcher_t *filter,
sdb_store_lookup_cb cb, void *user_data)
{
sdb_avltree_iter_t *host_iter;
if (! cb)
return -1;
+ if ((type != SDB_HOST) && (type != SDB_SERVICE) && (type != SDB_METRIC))
+ return -1;
+
pthread_rwlock_rdlock(&host_lock);
host_iter = sdb_avltree_get_iter(hosts);
/* has_next returns false if the iterator is NULL */
while (sdb_avltree_iter_has_next(host_iter)) {
sdb_store_obj_t *host;
+ sdb_avltree_iter_t *iter = NULL;
host = STORE_OBJ(sdb_avltree_iter_get_next(host_iter));
assert(host);
- if (sdb_store_matcher_matches(m, host, filter)) {
- if (cb(host, user_data)) {
- status = -1;
- break;
+ if (! sdb_store_matcher_matches(filter, host, NULL))
+ continue;
+
+ if (type == SDB_SERVICE)
+ iter = sdb_avltree_get_iter(HOST(host)->services);
+ else if (type == SDB_METRIC)
+ iter = sdb_avltree_get_iter(HOST(host)->metrics);
+
+ if (iter) {
+ while (sdb_avltree_iter_has_next(iter)) {
+ sdb_store_obj_t *obj;
+ obj = STORE_OBJ(sdb_avltree_iter_get_next(iter));
+ assert(obj);
+
+ if (sdb_store_matcher_matches(m, obj, filter)) {
+ if (cb(obj, user_data)) {
+ status = -1;
+ break;
+ }
+ }
}
}
+ else if (sdb_store_matcher_matches(m, host, filter)) {
+ if (cb(host, user_data))
+ status = -1;
+ }
+
+ sdb_avltree_iter_destroy(iter);
+ if (status)
+ break;
}
sdb_avltree_iter_destroy(host_iter);