From: Michael Tremer Date: Thu, 25 Jan 2018 22:02:52 +0000 (+0000) Subject: python: Implement searching for ASes X-Git-Tag: 0.9.0~94 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=afb426df2b900a17035794b58496f2a34fc3793a;p=location%2Flibloc.git python: Implement searching for ASes Signed-off-by: Michael Tremer --- diff --git a/src/python/database.c b/src/python/database.c index 89d5780..3c9e024 100644 --- a/src/python/database.c +++ b/src/python/database.c @@ -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, +}; diff --git a/src/python/database.h b/src/python/database.h index 4dc9ea4..b8c766e 100644 --- a/src/python/database.h +++ b/src/python/database.h @@ -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 */ diff --git a/src/python/locationmodule.c b/src/python/locationmodule.c index 735d7dc..03e4cf5 100644 --- a/src/python/locationmodule.c +++ b/src/python/locationmodule.c @@ -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;