Code

store: Let sdb_store_scan() support other object types besides hosts.
[sysdb.git] / src / core / store.c
index 6f525c31462ed74e0d4256b889373cdcc38b4ee7..74cbea2703bdd727aca9011de1861a29b587d58f 100644 (file)
@@ -1092,7 +1092,7 @@ sdb_store_tojson(sdb_strbuf_t *buf, sdb_store_matcher_t *filter, int flags)
 } /* 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;
@@ -1101,6 +1101,9 @@ sdb_store_scan(sdb_store_matcher_t *m, sdb_store_matcher_t *filter,
        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);
@@ -1110,16 +1113,41 @@ sdb_store_scan(sdb_store_matcher_t *m, sdb_store_matcher_t *filter,
        /* 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);