1717
1818from maxminddb .compat import (byte_from_int , compat_ip_address , string_type ,
1919 string_type_name )
20- from maxminddb .const import MODE_AUTO , MODE_MMAP , MODE_FILE , MODE_MEMORY
20+ from maxminddb .const import MODE_AUTO , MODE_MMAP , MODE_FILE , MODE_MEMORY , MODE_FD
2121from maxminddb .decoder import Decoder
2222from maxminddb .errors import InvalidDatabaseError
2323from maxminddb .file import FileBuffer
@@ -38,30 +38,39 @@ def __init__(self, database, mode=MODE_AUTO):
3838 """Reader for the MaxMind DB file format
3939
4040 Arguments:
41- database -- A path to a valid MaxMind DB file such as a GeoIP2
42- database file.
41+ database -- A path to a valid MaxMind DB file such as a GeoIP2 database
42+ file, or a file descriptor in the case of MODE_FD .
4343 mode -- mode to open the database with. Valid mode are:
4444 * MODE_MMAP - read from memory map.
4545 * MODE_FILE - read database as standard file.
4646 * MODE_MEMORY - load database into memory.
4747 * MODE_AUTO - tries MODE_MMAP and then MODE_FILE. Default.
48+ * MODE_FD - the param passed via database is a file descriptor, not
49+ a path. This mode implies MODE_MEMORY.
4850 """
4951 if (mode == MODE_AUTO and mmap ) or mode == MODE_MMAP :
5052 with open (database , 'rb' ) as db_file :
5153 self ._buffer = mmap .mmap (
5254 db_file .fileno (), 0 , access = mmap .ACCESS_READ )
5355 self ._buffer_size = self ._buffer .size ()
56+ filename = database
5457 elif mode in (MODE_AUTO , MODE_FILE ):
5558 self ._buffer = FileBuffer (database )
5659 self ._buffer_size = self ._buffer .size ()
60+ filename = database
5761 elif mode == MODE_MEMORY :
5862 with open (database , 'rb' ) as db_file :
5963 self ._buffer = db_file .read ()
6064 self ._buffer_size = len (self ._buffer )
65+ filename = database
66+ elif mode == MODE_FD :
67+ self ._buffer = database .read ()
68+ self ._buffer_size = len (self ._buffer )
69+ filename = database .name
6170 else :
6271 raise ValueError (
63- 'Unsupported open mode ({0}). Only MODE_AUTO, '
64- ' MODE_FILE, and MODE_MEMORY are support by the pure Python '
72+ 'Unsupported open mode ({0}). Only MODE_AUTO, MODE_FILE, '
73+ 'MODE_MEMORY and MODE_FD are supported by the pure Python '
6574 'Reader' .format (mode ))
6675
6776 metadata_start = self ._buffer .rfind (
@@ -72,7 +81,7 @@ def __init__(self, database, mode=MODE_AUTO):
7281 self .close ()
7382 raise InvalidDatabaseError ('Error opening database file ({0}). '
7483 'Is this a valid MaxMind DB file?'
75- '' .format (database ))
84+ '' .format (filename ))
7685
7786 metadata_start += len (self ._METADATA_START_MARKER )
7887 metadata_decoder = Decoder (self ._buffer , metadata_start )
0 commit comments