From: Michael Tremer Date: Thu, 25 Jan 2018 20:44:45 +0000 (+0000) Subject: Add database enumerator interface to perform iterative searches X-Git-Tag: 0.9.0~96 X-Git-Url: http://git.ipfire.org/?p=people%2Fms%2Flibloc.git;a=commitdiff_plain;h=7e13db74322eb181dde415bc55a9d75cc2edaf5a Add database enumerator interface to perform iterative searches Signed-off-by: Michael Tremer --- diff --git a/src/database.c b/src/database.c index 563546a..e37baa4 100644 --- a/src/database.c +++ b/src/database.c @@ -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; +} diff --git a/src/loc/database.h b/src/loc/database.h index 2f46e61..e126f78 100644 --- a/src/loc/database.h +++ b/src/loc/database.h @@ -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