Skip to content

Commit

Permalink
Implemented Issue maxmind#13 - Add reader mode information to reader …
Browse files Browse the repository at this point in the history
…metadata object.
  • Loading branch information
nickwilliams-eventbrite committed Apr 8, 2015
1 parent 57082e8 commit 3a0fc6b
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 32 deletions.
46 changes: 22 additions & 24 deletions maxminddb/extension/maxminddb.c
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ static PyObject *MaxMindDB_error;
typedef struct {
PyObject_HEAD /* no semicolon */
MMDB_s *mmdb;
PyObject *mode_auto;
PyObject *mode;
} Reader_obj;

Expand All @@ -26,8 +27,6 @@ typedef struct {
PyObject *languages;
PyObject *node_count;
PyObject *record_size;
PyObject *mode_auto;
PyObject *mode;
} Metadata_obj;

static PyObject *from_entry_data_list(MMDB_entry_data_list_s **entry_data_list);
Expand Down Expand Up @@ -102,7 +101,12 @@ static int Reader_init(PyObject *self, PyObject *args, PyObject *kwds)
}

mmdb_obj->mmdb = mmdb;
mmdb_obj->mode = PyInt_FromLong((long)mode);
if (mode == 0) {
mmdb_obj->mode_auto = PyBool_FromLong(1);
} else {
mmdb_obj->mode_auto = PyBool_FromLong(0);
}
mmdb_obj->mode = PyString_FromString("MODE_MMAP_EXT");
return 0;
}

Expand Down Expand Up @@ -196,14 +200,10 @@ static PyObject *Reader_metadata(PyObject *self, PyObject *UNUSED(args))
return NULL;
}

Py_INCREF(mmdb_obj->mode);
PyDict_SetItemString(metadata_dict, "mode", mmdb_obj->mode);

PyObject *metadata = PyObject_Call((PyObject *)&Metadata_Type, args,
metadata_dict);

Py_DECREF(metadata_dict);
Py_DECREF(mmdb_obj->mode);
return metadata;
}

Expand All @@ -227,13 +227,14 @@ static void Reader_dealloc(PyObject *self)
Reader_close(self, NULL);
}

Py_DECREF(obj->mode_auto);
Py_DECREF(obj->mode);
PyObject_Del(self);
}

static int Metadata_init(PyObject *self, PyObject *args, PyObject *kwds)
{

int mode = 0;
PyObject
*binary_format_major_version,
*binary_format_minor_version,
Expand All @@ -255,11 +256,10 @@ static int Metadata_init(PyObject *self, PyObject *args, PyObject *kwds)
"languages",
"node_count",
"record_size",
"mode",
NULL
};

if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OOOOOOOOOi", kwlist,
if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OOOOOOOOO", kwlist,
&binary_format_major_version,
&binary_format_minor_version,
&build_epoch,
Expand All @@ -268,8 +268,7 @@ static int Metadata_init(PyObject *self, PyObject *args, PyObject *kwds)
&ip_version,
&languages,
&node_count,
&record_size,
&mode)) {
&record_size)) {
return -1;
}

Expand All @@ -284,12 +283,6 @@ static int Metadata_init(PyObject *self, PyObject *args, PyObject *kwds)
obj->languages = languages;
obj->node_count = node_count;
obj->record_size = record_size;
if (mode == 0) {
obj->mode_auto = PyBool_FromLong(1);
} else {
obj->mode_auto = PyBool_FromLong(0);
}
obj->mode = PyString_FromString("MODE_MMAP_EXT");

Py_INCREF(obj->binary_format_major_version);
Py_INCREF(obj->binary_format_minor_version);
Expand All @@ -316,8 +309,6 @@ static void Metadata_dealloc(PyObject *self)
Py_DECREF(obj->languages);
Py_DECREF(obj->node_count);
Py_DECREF(obj->record_size);
Py_DECREF(obj->mode_auto);
Py_DECREF(obj->mode);
PyObject_Del(self);
}

Expand Down Expand Up @@ -477,12 +468,23 @@ static PyMethodDef Reader_methods[] = {
{ NULL, NULL, 0, NULL }
};

/* *INDENT-OFF* */
static PyMemberDef Reader_members[] = {
{ "mode_auto", T_OBJECT, offsetof(Reader_obj, mode_auto),
READONLY, NULL },
{ "mode", T_OBJECT, offsetof(Reader_obj, mode),
READONLY, NULL },
{ NULL, 0, 0, 0, NULL }
};
/* *INDENT-ON* */

static PyTypeObject Reader_Type = {
PyVarObject_HEAD_INIT(NULL, 0)
.tp_basicsize = sizeof(Reader_obj),
.tp_dealloc = Reader_dealloc,
.tp_doc = "Reader object",
.tp_flags = Py_TPFLAGS_DEFAULT,
.tp_members = Reader_members,
.tp_methods = Reader_methods,
.tp_name = "Reader",
.tp_init = Reader_init,
Expand Down Expand Up @@ -512,10 +514,6 @@ static PyMemberDef Metadata_members[] = {
READONLY, NULL },
{ "record_size", T_OBJECT, offsetof(Metadata_obj, record_size),
READONLY, NULL },
{ "mode_auto", T_OBJECT, offsetof(Metadata_obj, mode_auto),
READONLY, NULL },
{ "mode", T_OBJECT, offsetof(Metadata_obj, mode),
READONLY, NULL },
{ NULL, 0, 0, 0, NULL }
};
/* *INDENT-ON* */
Expand Down
12 changes: 4 additions & 8 deletions maxminddb/reader.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,22 +46,22 @@ def __init__(self, database, mode=MODE_AUTO):
* MODE_MEMORY - load database into memory.
* MODE_AUTO - tries MODE_MMAP and then MODE_FILE. Default.
"""
metadata_mode_auto = mode == MODE_AUTO
self.mode_auto = mode == MODE_AUTO
if (mode == MODE_AUTO and mmap) or mode == MODE_MMAP:
with open(database, 'rb') as db_file:
self._buffer = mmap.mmap(
db_file.fileno(), 0, access=mmap.ACCESS_READ)
self._buffer_size = self._buffer.size()
metadata_mode = 'MODE_MMAP'
self.mode = 'MODE_MMAP'
elif mode in (MODE_AUTO, MODE_FILE):
self._buffer = FileBuffer(database)
self._buffer_size = self._buffer.size()
metadata_mode = 'MODE_FILE'
self.mode = 'MODE_FILE'
elif mode == MODE_MEMORY:
with open(database, 'rb') as db_file:
self._buffer = db_file.read()
self._buffer_size = len(self._buffer)
metadata_mode = 'MODE_MEMORY'
self.mode = 'MODE_MEMORY'
else:
raise ValueError('Unsupported open mode ({0}). Only MODE_AUTO, '
' MODE_FILE, and MODE_MEMORY are support by the pure Python '
Expand All @@ -80,8 +80,6 @@ def __init__(self, database, mode=MODE_AUTO):
metadata_start += len(self._METADATA_START_MARKER)
metadata_decoder = Decoder(self._buffer, metadata_start)
(metadata, _) = metadata_decoder.decode(metadata_start)
metadata['mode_auto'] = metadata_mode_auto
metadata['mode'] = metadata_mode
self._metadata = Metadata(
**metadata) # pylint: disable=bad-option-value

Expand Down Expand Up @@ -208,8 +206,6 @@ def __init__(self, **kwargs):
'binary_format_minor_version']
self.build_epoch = kwargs['build_epoch']
self.description = kwargs['description']
self.mode_auto = kwargs.get('mode_auto', None)
self.mode = kwargs.get('mode', None)

@property
def node_byte_size(self):
Expand Down

0 comments on commit 3a0fc6b

Please sign in to comment.