// Open the file for reading
FILE* f = fopen(self->path, "r");
- if (!f)
+ if (!f) {
+ PyErr_SetFromErrno(PyExc_IOError);
return -1;
+ }
// Load the database
int r = loc_database_new(loc_ctx, &self->db, f);
struct loc_database_enumerator* enumerator;
- int r = loc_database_enumerator_new(&enumerator, self->db);
+ int r = loc_database_enumerator_new(&enumerator, self->db, LOC_DB_ENUMERATE_ASES);
if (r) {
PyErr_SetFromErrno(PyExc_SystemError);
return NULL;
return obj;
}
+static PyObject* Database_search_networks(DatabaseObject* self, PyObject* args, PyObject* kwargs) {
+ char* kwlist[] = { "country_code", "asn", NULL };
+ const char* country_code = NULL;
+ unsigned int asn = 0;
+
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|si", kwlist, &country_code, &asn))
+ return NULL;
+
+ struct loc_database_enumerator* enumerator;
+ int r = loc_database_enumerator_new(&enumerator, self->db, LOC_DB_ENUMERATE_NETWORKS);
+ if (r) {
+ PyErr_SetFromErrno(PyExc_SystemError);
+ return NULL;
+ }
+
+ // Set country code we are searching for
+ if (country_code) {
+ r = loc_database_enumerator_set_country_code(enumerator, country_code);
+
+ if (r) {
+ PyErr_SetFromErrno(PyExc_SystemError);
+ return NULL;
+ }
+ }
+
+ // Set the ASN we are searching for
+ if (asn) {
+ r = loc_database_enumerator_set_asn(enumerator, asn);
+
+ if (r) {
+ PyErr_SetFromErrno(PyExc_SystemError);
+ return NULL;
+ }
+ }
+
+ PyObject* obj = new_database_enumerator(&DatabaseEnumeratorType, enumerator);
+ loc_database_enumerator_unref(enumerator);
+
+ return obj;
+}
+
static struct PyMethodDef Database_methods[] = {
{
"get_as",
METH_VARARGS,
NULL,
},
+ {
+ "search_networks",
+ (PyCFunction)Database_search_networks,
+ METH_VARARGS|METH_KEYWORDS,
+ NULL,
+ },
{ NULL },
};
PyTypeObject DatabaseType = {
PyVarObject_HEAD_INIT(NULL, 0)
- tp_name: "location.Database",
- tp_basicsize: sizeof(DatabaseObject),
- tp_flags: Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE,
- tp_new: Database_new,
- tp_dealloc: (destructor)Database_dealloc,
- tp_init: (initproc)Database_init,
- tp_doc: "Database object",
- tp_methods: Database_methods,
- tp_getset: Database_getsetters,
- tp_repr: (reprfunc)Database_repr,
+ .tp_name = "location.Database",
+ .tp_basicsize = sizeof(DatabaseObject),
+ .tp_flags = Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE,
+ .tp_new = Database_new,
+ .tp_dealloc = (destructor)Database_dealloc,
+ .tp_init = (initproc)Database_init,
+ .tp_doc = "Database object",
+ .tp_methods = Database_methods,
+ .tp_getset = Database_getsetters,
+ .tp_repr = (reprfunc)Database_repr,
};
static PyObject* DatabaseEnumerator_new(PyTypeObject* type, PyObject* args, PyObject* kwds) {
}
static PyObject* DatabaseEnumerator_next(DatabaseEnumeratorObject* self) {
+ // Enumerate all networks
+ struct loc_network* network = loc_database_enumerator_next_network(self->enumerator);
+ if (network) {
+ PyObject* obj = new_network(&NetworkType, network);
+ loc_network_unref(network);
+
+ return obj;
+ }
+
+ // Enumerate all ASes
struct loc_as* as = loc_database_enumerator_next_as(self->enumerator);
if (as) {
PyObject* obj = new_as(&ASType, as);
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,
+ .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,
};