diff --git a/src/core/store.c b/src/core/store.c
index 6f525c31462ed74e0d4256b889373cdcc38b4ee7..74cbea2703bdd727aca9011de1861a29b587d58f 100644 (file)
--- a/src/core/store.c
+++ b/src/core/store.c
} /* sdb_store_tojson */
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;
sdb_store_lookup_cb cb, void *user_data)
{
sdb_avltree_iter_t *host_iter;
if (! cb)
return -1;
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);
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;
/* 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);
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);
}
sdb_avltree_iter_destroy(host_iter);