Skip to content

Commit a91e8e1

Browse files
Implemented Issue maxmind#13 - Add reader mode information to reader metadata object.
1 parent 641729d commit a91e8e1

File tree

2 files changed

+26
-32
lines changed

2 files changed

+26
-32
lines changed

Diff for: maxminddb/extension/maxminddb.c

+22-24
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ static PyObject *MaxMindDB_error;
1212
typedef struct {
1313
PyObject_HEAD /* no semicolon */
1414
MMDB_s *mmdb;
15+
PyObject *mode_auto;
1516
PyObject *mode;
1617
} Reader_obj;
1718

@@ -26,8 +27,6 @@ typedef struct {
2627
PyObject *languages;
2728
PyObject *node_count;
2829
PyObject *record_size;
29-
PyObject *mode_auto;
30-
PyObject *mode;
3130
} Metadata_obj;
3231

3332
static PyObject *from_entry_data_list(MMDB_entry_data_list_s **entry_data_list);
@@ -102,7 +101,12 @@ static int Reader_init(PyObject *self, PyObject *args, PyObject *kwds)
102101
}
103102

104103
mmdb_obj->mmdb = mmdb;
105-
mmdb_obj->mode = PyInt_FromLong((long)mode);
104+
if (mode == 0) {
105+
mmdb_obj->mode_auto = PyBool_FromLong(1);
106+
} else {
107+
mmdb_obj->mode_auto = PyBool_FromLong(0);
108+
}
109+
mmdb_obj->mode = PyString_FromString("MODE_MMAP_EXT");
106110
return 0;
107111
}
108112

@@ -196,14 +200,10 @@ static PyObject *Reader_metadata(PyObject *self, PyObject *UNUSED(args))
196200
return NULL;
197201
}
198202

199-
Py_INCREF(mmdb_obj->mode);
200-
PyDict_SetItemString(metadata_dict, "mode", mmdb_obj->mode);
201-
202203
PyObject *metadata = PyObject_Call((PyObject *)&Metadata_Type, args,
203204
metadata_dict);
204205

205206
Py_DECREF(metadata_dict);
206-
Py_DECREF(mmdb_obj->mode);
207207
return metadata;
208208
}
209209

@@ -227,13 +227,14 @@ static void Reader_dealloc(PyObject *self)
227227
Reader_close(self, NULL);
228228
}
229229

230+
Py_DECREF(obj->mode_auto);
231+
Py_DECREF(obj->mode);
230232
PyObject_Del(self);
231233
}
232234

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

236-
int mode = 0;
237238
PyObject
238239
*binary_format_major_version,
239240
*binary_format_minor_version,
@@ -255,11 +256,10 @@ static int Metadata_init(PyObject *self, PyObject *args, PyObject *kwds)
255256
"languages",
256257
"node_count",
257258
"record_size",
258-
"mode",
259259
NULL
260260
};
261261

262-
if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OOOOOOOOOi", kwlist,
262+
if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OOOOOOOOO", kwlist,
263263
&binary_format_major_version,
264264
&binary_format_minor_version,
265265
&build_epoch,
@@ -268,8 +268,7 @@ static int Metadata_init(PyObject *self, PyObject *args, PyObject *kwds)
268268
&ip_version,
269269
&languages,
270270
&node_count,
271-
&record_size,
272-
&mode)) {
271+
&record_size)) {
273272
return -1;
274273
}
275274

@@ -284,12 +283,6 @@ static int Metadata_init(PyObject *self, PyObject *args, PyObject *kwds)
284283
obj->languages = languages;
285284
obj->node_count = node_count;
286285
obj->record_size = record_size;
287-
if (mode == 0) {
288-
obj->mode_auto = PyBool_FromLong(1);
289-
} else {
290-
obj->mode_auto = PyBool_FromLong(0);
291-
}
292-
obj->mode = PyString_FromString("MODE_MMAP_EXT");
293286

294287
Py_INCREF(obj->binary_format_major_version);
295288
Py_INCREF(obj->binary_format_minor_version);
@@ -316,8 +309,6 @@ static void Metadata_dealloc(PyObject *self)
316309
Py_DECREF(obj->languages);
317310
Py_DECREF(obj->node_count);
318311
Py_DECREF(obj->record_size);
319-
Py_DECREF(obj->mode_auto);
320-
Py_DECREF(obj->mode);
321312
PyObject_Del(self);
322313
}
323314

@@ -477,12 +468,23 @@ static PyMethodDef Reader_methods[] = {
477468
{ NULL, NULL, 0, NULL }
478469
};
479470

471+
/* *INDENT-OFF* */
472+
static PyMemberDef Reader_members[] = {
473+
{ "mode_auto", T_OBJECT, offsetof(Reader_obj, mode_auto),
474+
READONLY, NULL },
475+
{ "mode", T_OBJECT, offsetof(Reader_obj, mode),
476+
READONLY, NULL },
477+
{ NULL, 0, 0, 0, NULL }
478+
};
479+
/* *INDENT-ON* */
480+
480481
static PyTypeObject Reader_Type = {
481482
PyVarObject_HEAD_INIT(NULL, 0)
482483
.tp_basicsize = sizeof(Reader_obj),
483484
.tp_dealloc = Reader_dealloc,
484485
.tp_doc = "Reader object",
485486
.tp_flags = Py_TPFLAGS_DEFAULT,
487+
.tp_members = Reader_members,
486488
.tp_methods = Reader_methods,
487489
.tp_name = "Reader",
488490
.tp_init = Reader_init,
@@ -512,10 +514,6 @@ static PyMemberDef Metadata_members[] = {
512514
READONLY, NULL },
513515
{ "record_size", T_OBJECT, offsetof(Metadata_obj, record_size),
514516
READONLY, NULL },
515-
{ "mode_auto", T_OBJECT, offsetof(Metadata_obj, mode_auto),
516-
READONLY, NULL },
517-
{ "mode", T_OBJECT, offsetof(Metadata_obj, mode),
518-
READONLY, NULL },
519517
{ NULL, 0, 0, 0, NULL }
520518
};
521519
/* *INDENT-ON* */

Diff for: maxminddb/reader.py

+4-8
Original file line numberDiff line numberDiff line change
@@ -46,22 +46,22 @@ def __init__(self, database, mode=MODE_AUTO):
4646
* MODE_MEMORY - load database into memory.
4747
* MODE_AUTO - tries MODE_MMAP and then MODE_FILE. Default.
4848
"""
49-
metadata_mode_auto = mode == MODE_AUTO
49+
self.mode_auto = mode == MODE_AUTO
5050
if (mode == MODE_AUTO and mmap) or mode == MODE_MMAP:
5151
with open(database, 'rb') as db_file:
5252
self._buffer = mmap.mmap(
5353
db_file.fileno(), 0, access=mmap.ACCESS_READ)
5454
self._buffer_size = self._buffer.size()
55-
metadata_mode = 'MODE_MMAP'
55+
self.mode = 'MODE_MMAP'
5656
elif mode in (MODE_AUTO, MODE_FILE):
5757
self._buffer = FileBuffer(database)
5858
self._buffer_size = self._buffer.size()
59-
metadata_mode = 'MODE_FILE'
59+
self.mode = 'MODE_FILE'
6060
elif mode == MODE_MEMORY:
6161
with open(database, 'rb') as db_file:
6262
self._buffer = db_file.read()
6363
self._buffer_size = len(self._buffer)
64-
metadata_mode = 'MODE_MEMORY'
64+
self.mode = 'MODE_MEMORY'
6565
else:
6666
raise ValueError('Unsupported open mode ({0}). Only MODE_AUTO, '
6767
' MODE_FILE, and MODE_MEMORY are support by the pure Python '
@@ -80,8 +80,6 @@ def __init__(self, database, mode=MODE_AUTO):
8080
metadata_start += len(self._METADATA_START_MARKER)
8181
metadata_decoder = Decoder(self._buffer, metadata_start)
8282
(metadata, _) = metadata_decoder.decode(metadata_start)
83-
metadata['mode_auto'] = metadata_mode_auto
84-
metadata['mode'] = metadata_mode
8583
self._metadata = Metadata(**metadata) # pylint: disable=star-args
8684

8785
self._decoder = Decoder(self._buffer, self._metadata.search_tree_size
@@ -206,8 +204,6 @@ def __init__(self, **kwargs):
206204
'binary_format_minor_version']
207205
self.build_epoch = kwargs['build_epoch']
208206
self.description = kwargs['description']
209-
self.mode_auto = kwargs.get('mode_auto', None)
210-
self.mode = kwargs.get('mode', None)
211207

212208
@property
213209
def node_byte_size(self):

0 commit comments

Comments
 (0)