#include "locationmodule.h"
#include "as.h"
#include "database.h"
+#include "network.h"
static PyObject* Database_new(PyTypeObject* type, PyObject* args, PyObject* kwds) {
DatabaseObject* self = (DatabaseObject*)type->tp_alloc(type, 0);
- if (self) {
- self->ctx = loc_ref(loc_ctx);
- }
return (PyObject*)self;
}
if (self->db)
loc_database_unref(self->db);
- if (self->ctx)
- loc_unref(self->ctx);
+ if (self->path)
+ free(self->path);
Py_TYPE(self)->tp_free((PyObject* )self);
}
if (!PyArg_ParseTuple(args, "s", &path))
return -1;
+ self->path = strdup(path);
+
// Open the file for reading
- FILE* f = fopen(path, "r");
+ FILE* f = fopen(self->path, "r");
if (!f)
return -1;
// Load the database
- int r = loc_database_new(self->ctx, &self->db, f);
+ int r = loc_database_new(loc_ctx, &self->db, f);
fclose(f);
// Return on any errors
return 0;
}
+static PyObject* Database_repr(DatabaseObject* self) {
+ return PyUnicode_FromFormat("<Database %s>", self->path);
+}
+
static PyObject* Database_get_description(DatabaseObject* self) {
const char* description = loc_database_get_description(self->db);
return PyUnicode_FromString(vendor);
}
+static PyObject* Database_get_license(DatabaseObject* self) {
+ const char* license = loc_database_get_license(self->db);
+
+ return PyUnicode_FromString(license);
+}
+
static PyObject* Database_get_created_at(DatabaseObject* self) {
time_t created_at = loc_database_created_at(self->db);
// Try to retrieve the AS
int r = loc_database_get_as(self->db, &as, number);
- if (r)
- return NULL;
- // Create an AS object
- if (as) {
+ // We got an AS
+ if (r == 0) {
PyObject* obj = new_as(&ASType, as);
loc_as_unref(as);
return obj;
+
+ // Nothing found
+ } else if (r == 1) {
+ Py_RETURN_NONE;
}
+ // Unexpected error
+ return NULL;
+}
+
+static PyObject* Database_lookup(DatabaseObject* self, PyObject* args) {
+ struct loc_network* network = NULL;
+ const char* address = NULL;
+
+ if (!PyArg_ParseTuple(args, "s", &address))
+ return NULL;
+
+ // Try to retrieve a matching network
+ int r = loc_database_lookup_from_string(self->db, address, &network);
+
+ // We got a network
+ if (r == 0) {
+ PyObject* obj = new_network(&NetworkType, network);
+ loc_network_unref(network);
+
+ return obj;
+
// Nothing found
- Py_RETURN_NONE;
+ } else if (r == 1) {
+ Py_RETURN_NONE;
+ }
+
+ // Unexpected error
+ return NULL;
}
static struct PyMethodDef Database_methods[] = {
METH_VARARGS,
NULL,
},
+ {
+ "lookup",
+ (PyCFunction)Database_lookup,
+ METH_VARARGS,
+ NULL,
+ },
{ NULL },
};
NULL,
NULL,
},
+ {
+ "license",
+ (getter)Database_get_license,
+ NULL,
+ NULL,
+ NULL,
+ },
{
"vendor",
(getter)Database_get_vendor,
tp_doc: "Database object",
tp_methods: Database_methods,
tp_getset: Database_getsetters,
+ tp_repr: (reprfunc)Database_repr,
};