]> git.ipfire.org Git - people/ms/libloc.git/commitdiff
database: Pass flag to enumerator to flatten output
authorMichael Tremer <michael.tremer@ipfire.org>
Thu, 12 Nov 2020 19:21:13 +0000 (19:21 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Thu, 12 Nov 2020 19:21:13 +0000 (19:21 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/database.c
src/loc/database.h
src/perl/Location.xs
src/python/database.c

index fa1dad0b60f63069aa1ce0be8050ab7bdc20bf33..9baab335b2e132e661f54b782574ec005a3b8b97 100644 (file)
@@ -104,6 +104,9 @@ struct loc_database_enumerator {
        enum loc_network_flags flags;
        int family;
 
+       // Flatten output?
+       int flatten;
+
        // Index of the AS we are looking at
        unsigned int as_index;
 
@@ -933,7 +936,7 @@ LOC_EXPORT int loc_database_get_country(struct loc_database* db,
 // Enumerator
 
 LOC_EXPORT int loc_database_enumerator_new(struct loc_database_enumerator** enumerator,
-               struct loc_database* db, enum loc_database_enumerator_mode mode) {
+               struct loc_database* db, enum loc_database_enumerator_mode mode, int flags) {
        struct loc_database_enumerator* e = calloc(1, sizeof(*e));
        if (!e)
                return -ENOMEM;
@@ -944,6 +947,9 @@ LOC_EXPORT int loc_database_enumerator_new(struct loc_database_enumerator** enum
        e->mode = mode;
        e->refcount = 1;
 
+       // Flatten output?
+       e->flatten = (flags & LOC_DB_ENUMERATOR_FLAGS_FLATTEN);
+
        // Initialise graph search
        //e->network_stack[++e->network_stack_depth] = 0;
        e->network_stack_depth = 1;
index 43173dd513b4048057e57a70981e4830558f46a5..14eb5ea273d80453e959e36c4f5cb6fc1e0a4742 100644 (file)
@@ -55,9 +55,13 @@ enum loc_database_enumerator_mode {
        LOC_DB_ENUMERATE_COUNTRIES = 3,
 };
 
+enum loc_database_enumerator_flags {
+       LOC_DB_ENUMERATOR_FLAGS_FLATTEN = (1 << 0),
+};
+
 struct loc_database_enumerator;
 int loc_database_enumerator_new(struct loc_database_enumerator** enumerator,
-       struct loc_database* db, enum loc_database_enumerator_mode mode);
+       struct loc_database* db, enum loc_database_enumerator_mode mode, int flags);
 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);
 
index dcf3f0d79524801083aafe5497091f4abfd2aec6..b7676d2667f07b9ff5c7ec53b34c6b6e880037cd 100644 (file)
@@ -125,7 +125,7 @@ database_countries(db)
        PPCODE:
                // Create Database enumerator
                struct loc_database_enumerator* enumerator;
-               int err = loc_database_enumerator_new(&enumerator, db, LOC_DB_ENUMERATE_COUNTRIES);
+               int err = loc_database_enumerator_new(&enumerator, db, LOC_DB_ENUMERATE_COUNTRIES, 0);
 
                if (err) {
                        croak("Could not create a database enumerator\n");
index 1013a58808ececc24b75a5f2c5ec49654f9dd4dc..7f8c2c2ed9b8c27273fd486a1ff7d9205952dbd0 100644 (file)
@@ -207,10 +207,10 @@ static PyObject* new_database_enumerator(PyTypeObject* type, struct loc_database
        return (PyObject*)self;
 }
 
-static PyObject* Database_iterate_all(DatabaseObject* self, enum loc_database_enumerator_mode what) {
+static PyObject* Database_iterate_all(DatabaseObject* self, enum loc_database_enumerator_mode what, int flags) {
        struct loc_database_enumerator* enumerator;
 
-       int r = loc_database_enumerator_new(&enumerator, self->db, what);
+       int r = loc_database_enumerator_new(&enumerator, self->db, what, flags);
        if (r) {
                PyErr_SetFromErrno(PyExc_SystemError);
                return NULL;
@@ -223,7 +223,7 @@ static PyObject* Database_iterate_all(DatabaseObject* self, enum loc_database_en
 }
 
 static PyObject* Database_ases(DatabaseObject* self) {
-       return Database_iterate_all(self, LOC_DB_ENUMERATE_ASES);
+       return Database_iterate_all(self, LOC_DB_ENUMERATE_ASES, 0);
 }
 
 static PyObject* Database_search_as(DatabaseObject* self, PyObject* args) {
@@ -234,7 +234,7 @@ static PyObject* Database_search_as(DatabaseObject* self, PyObject* args) {
 
        struct loc_database_enumerator* enumerator;
 
-       int r = loc_database_enumerator_new(&enumerator, self->db, LOC_DB_ENUMERATE_ASES);
+       int r = loc_database_enumerator_new(&enumerator, self->db, LOC_DB_ENUMERATE_ASES, 0);
        if (r) {
                PyErr_SetFromErrno(PyExc_SystemError);
                return NULL;
@@ -250,7 +250,11 @@ static PyObject* Database_search_as(DatabaseObject* self, PyObject* args) {
 }
 
 static PyObject* Database_networks(DatabaseObject* self) {
-       return Database_iterate_all(self, LOC_DB_ENUMERATE_NETWORKS);
+       return Database_iterate_all(self, LOC_DB_ENUMERATE_NETWORKS, 0);
+}
+
+static PyObject* Database_networks_flattened(DatabaseObject *self) {
+       return Database_iterate_all(self, LOC_DB_ENUMERATE_NETWORKS, LOC_DB_ENUMERATOR_FLAGS_FLATTEN);
 }
 
 static PyObject* Database_search_networks(DatabaseObject* self, PyObject* args, PyObject* kwargs) {
@@ -264,7 +268,7 @@ static PyObject* Database_search_networks(DatabaseObject* self, PyObject* args,
                return NULL;
 
        struct loc_database_enumerator* enumerator;
-       int r = loc_database_enumerator_new(&enumerator, self->db, LOC_DB_ENUMERATE_NETWORKS);
+       int r = loc_database_enumerator_new(&enumerator, self->db, LOC_DB_ENUMERATE_NETWORKS, 0);
        if (r) {
                PyErr_SetFromErrno(PyExc_SystemError);
                return NULL;
@@ -317,7 +321,7 @@ static PyObject* Database_search_networks(DatabaseObject* self, PyObject* args,
 }
 
 static PyObject* Database_countries(DatabaseObject* self) {
-       return Database_iterate_all(self, LOC_DB_ENUMERATE_COUNTRIES);
+       return Database_iterate_all(self, LOC_DB_ENUMERATE_COUNTRIES, 0);
 }
 
 static struct PyMethodDef Database_methods[] = {
@@ -403,6 +407,13 @@ static struct PyGetSetDef Database_getsetters[] = {
                NULL,
                NULL,
        },
+       {
+               "networks_flattened",
+               (getter)Database_networks_flattened,
+               NULL,
+               NULL,
+               NULL,
+       },
        {
                "vendor",
                (getter)Database_get_vendor,