]> git.ipfire.org Git - people/ms/libloc.git/commitdiff
python: Implement searching for ASes
authorMichael Tremer <michael.tremer@ipfire.org>
Thu, 25 Jan 2018 22:02:52 +0000 (22:02 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Thu, 25 Jan 2018 22:02:52 +0000 (22:02 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/python/database.c
src/python/database.h
src/python/locationmodule.c

index 89d578022db7dd4974904afc497515cbf271a1a9..3c9e02420dca8f2d25f3bdad593f44124686ae72 100644 (file)
@@ -149,6 +149,38 @@ static PyObject* Database_lookup(DatabaseObject* self, PyObject* args) {
        return NULL;
 }
 
+static PyObject* new_database_enumerator(PyTypeObject* type, struct loc_database_enumerator* enumerator) {
+       DatabaseEnumeratorObject* self = (DatabaseEnumeratorObject*)type->tp_alloc(type, 0);
+       if (self) {
+               self->enumerator = loc_database_enumerator_ref(enumerator);
+       }
+
+       return (PyObject*)self;
+}
+
+static PyObject* Database_search_as(DatabaseObject* self, PyObject* args) {
+       const char* string = NULL;
+
+       if (!PyArg_ParseTuple(args, "s", &string))
+               return NULL;
+
+       struct loc_database_enumerator* enumerator;
+
+       int r = loc_database_enumerator_new(&enumerator, self->db);
+       if (r) {
+               PyErr_SetFromErrno(PyExc_SystemError);
+               return NULL;
+       }
+
+       // Search string we are searching for
+       loc_database_enumerator_set_string(enumerator, string);
+
+       PyObject* obj = new_database_enumerator(&DatabaseEnumeratorType, enumerator);
+       loc_database_enumerator_unref(enumerator);
+
+       return obj;
+}
+
 static struct PyMethodDef Database_methods[] = {
        {
                "get_as",
@@ -162,6 +194,12 @@ static struct PyMethodDef Database_methods[] = {
                METH_VARARGS,
                NULL,
        },
+       {
+               "search_as",
+               (PyCFunction)Database_search_as,
+               METH_VARARGS,
+               NULL,
+       },
        { NULL },
 };
 
@@ -210,3 +248,41 @@ PyTypeObject DatabaseType = {
        tp_getset:              Database_getsetters,
        tp_repr:                (reprfunc)Database_repr,
 };
+
+static PyObject* DatabaseEnumerator_new(PyTypeObject* type, PyObject* args, PyObject* kwds) {
+       DatabaseEnumeratorObject* self = (DatabaseEnumeratorObject*)type->tp_alloc(type, 0);
+
+       return (PyObject*)self;
+}
+
+static void DatabaseEnumerator_dealloc(DatabaseEnumeratorObject* self) {
+       loc_database_enumerator_unref(self->enumerator);
+
+       Py_TYPE(self)->tp_free((PyObject* )self);
+}
+
+static PyObject* DatabaseEnumerator_next(DatabaseEnumeratorObject* self) {
+       struct loc_as* as = loc_database_enumerator_next_as(self->enumerator);
+       if (as) {
+               PyObject* obj = new_as(&ASType, as);
+               loc_as_unref(as);
+
+               return obj;
+       }
+
+       // Nothing found, that means the end
+       PyErr_SetNone(PyExc_StopIteration);
+       return NULL;
+}
+
+PyTypeObject DatabaseEnumeratorType = {
+       PyVarObject_HEAD_INIT(NULL, 0)
+       tp_name:                "location.DatabaseEnumerator",
+       tp_basicsize:           sizeof(DatabaseEnumeratorObject),
+       tp_flags:               Py_TPFLAGS_DEFAULT,
+       tp_alloc:               PyType_GenericAlloc,
+       tp_new:                 DatabaseEnumerator_new,
+       tp_dealloc:             (destructor)DatabaseEnumerator_dealloc,
+       tp_iter:                PyObject_SelfIter,
+       tp_iternext:            (iternextfunc)DatabaseEnumerator_next,
+};
index 4dc9ea48ba67e8ea960ad8f040c7e3ff3601550f..b8c766ec8931ad44303b76e678c95808b4ff0280 100644 (file)
@@ -29,4 +29,11 @@ typedef struct {
 
 extern PyTypeObject DatabaseType;
 
+typedef struct {
+       PyObject_HEAD
+       struct loc_database_enumerator* enumerator;
+} DatabaseEnumeratorObject;
+
+extern PyTypeObject DatabaseEnumeratorType;
+
 #endif /* PYTHON_LOCATION_DATABASE_H */
index 735d7dcf86f7bb2e53a93abf2157f9333e5b2fbb..03e4cf55c394569497761befa9aa0ef49c74991c 100644 (file)
@@ -67,6 +67,13 @@ PyMODINIT_FUNC PyInit_location(void) {
        Py_INCREF(&DatabaseType);
        PyModule_AddObject(m, "Database", (PyObject *)&DatabaseType);
 
+       // Database Enumerator
+       if (PyType_Ready(&DatabaseEnumeratorType) < 0)
+               return NULL;
+
+       Py_INCREF(&DatabaseEnumeratorType);
+       //PyModule_AddObject(m, "DatabaseEnumerator", (PyObject *)&DatabaseEnumeratorType);
+
        // Network
        if (PyType_Ready(&NetworkType) < 0)
                return NULL;