Add database enumerator interface to perform iterative searches
authorMichael Tremer <michael.tremer@ipfire.org>
Thu, 25 Jan 2018 20:44:45 +0000 (20:44 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Thu, 25 Jan 2018 20:44:45 +0000 (20:44 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/database.c
src/loc/database.h

index 563546a..e37baa4 100644 (file)
@@ -61,6 +61,12 @@ struct loc_database {
        struct loc_stringpool* pool;
 };
 
+struct loc_database_enumerator {
+       struct loc_ctx* ctx;
+       struct loc_database* db;
+       int refcount;
+};
+
 static int loc_database_read_magic(struct loc_database* db, FILE* f) {
        struct loc_database_magic magic;
 
@@ -578,3 +584,48 @@ LOC_EXPORT int loc_database_lookup_from_string(struct loc_database* db,
 
        return loc_database_lookup(db, &address, network);
 }
+
+// Enumerator
+
+LOC_EXPORT int loc_database_enumerator_new(struct loc_database_enumerator** enumerator, struct loc_database* db) {
+       struct loc_database_enumerator* e = calloc(1, sizeof(*e));
+       if (!e)
+               return -ENOMEM;
+
+       // Reference context
+       e->ctx = loc_ref(db->ctx);
+       e->db = loc_database_ref(db);
+       e->refcount = 1;
+
+       DEBUG(e->ctx, "Database enumerator object allocated at %p\n", e);
+
+       *enumerator = e;
+       return 0;
+}
+
+LOC_EXPORT struct loc_database_enumerator* loc_database_enumerator_ref(struct loc_database_enumerator* enumerator) {
+       enumerator->refcount++;
+
+       return enumerator;
+}
+
+static void loc_database_enumerator_free(struct loc_database_enumerator* enumerator) {
+       DEBUG(enumerator->ctx, "Releasing database enumerator %p\n", enumerator);
+
+       // Release all references
+       loc_database_unref(enumerator->db);
+       loc_unref(enumerator->ctx);
+
+       free(enumerator);
+}
+
+LOC_EXPORT struct loc_database_enumerator* loc_database_enumerator_unref(struct loc_database_enumerator* enumerator) {
+       if (!enumerator)
+               return NULL;
+
+       if (--enumerator->refcount > 0)
+               return enumerator;
+
+       loc_database_enumerator_free(enumerator);
+       return NULL;
+}
index 2f46e61..e126f78 100644 (file)
@@ -43,4 +43,9 @@ int loc_database_lookup(struct loc_database* db,
 int loc_database_lookup_from_string(struct loc_database* db,
                const char* string, struct loc_network** network);
 
+struct loc_database_enumerator;
+int loc_database_enumerator_new(struct loc_database_enumerator** enumerator, struct loc_database* db);
+struct loc_database_enumerator* loc_database_enumerator_ref(struct loc_database_enumerator* enumerator);
+struct loc_database_enumerator* loc_database_enumerator_unref(struct loc_database_enumerator* enumerator);
+
 #endif