1515
1616import struct
1717
18- from maxminddb .compat import byte_from_int , int_from_byte , compat_ip_address
18+ from maxminddb .compat import byte_from_int , compat_ip_address
1919from maxminddb .const import MODE_AUTO , MODE_MMAP , MODE_FILE , MODE_MEMORY
2020from maxminddb .decoder import Decoder
2121from maxminddb .errors import InvalidDatabaseError
2222from maxminddb .file import FileBuffer
2323
2424
2525class Reader (object ):
26-
2726 """
2827 Instances of this class provide a reader for the MaxMind DB format. IP
2928 addresses can be looked up using the ``get`` method.
@@ -60,13 +59,14 @@ def __init__(self, database, mode=MODE_AUTO):
6059 self ._buffer = db_file .read ()
6160 self ._buffer_size = len (self ._buffer )
6261 else :
63- raise ValueError ('Unsupported open mode ({0}). Only MODE_AUTO, '
64- ' MODE_FILE, and MODE_MEMORY are support by the pure Python '
65- 'Reader' .format (mode ))
62+ raise ValueError (
63+ 'Unsupported open mode ({0}). Only MODE_AUTO, '
64+ ' MODE_FILE, and MODE_MEMORY are support by the pure Python '
65+ 'Reader' .format (mode ))
6666
67- metadata_start = self ._buffer .rfind (self . _METADATA_START_MARKER ,
68- max (0 , self . _buffer_size
69- - 128 * 1024 ))
67+ metadata_start = self ._buffer .rfind (
68+ self . _METADATA_START_MARKER , max (0 ,
69+ self . _buffer_size - 128 * 1024 ))
7070
7171 if metadata_start == - 1 :
7272 self .close ()
@@ -77,11 +77,10 @@ def __init__(self, database, mode=MODE_AUTO):
7777 metadata_start += len (self ._METADATA_START_MARKER )
7878 metadata_decoder = Decoder (self ._buffer , metadata_start )
7979 (metadata , _ ) = metadata_decoder .decode (metadata_start )
80- self ._metadata = Metadata (
81- ** metadata ) # pylint: disable=bad-option-value
80+ self ._metadata = Metadata (** metadata ) # pylint: disable=bad-option-value
8281
83- self ._decoder = Decoder (self ._buffer , self ._metadata .search_tree_size
84- + self ._DATA_SECTION_SEPARATOR_SIZE )
82+ self ._decoder = Decoder (self ._buffer , self ._metadata .search_tree_size +
83+ self ._DATA_SECTION_SEPARATOR_SIZE )
8584
8685 def metadata (self ):
8786 """Return the metadata associated with the MaxMind DB file"""
@@ -98,23 +97,23 @@ def get(self, ip_address):
9897 address = compat_ip_address (ip_address )
9998
10099 if address .version == 6 and self ._metadata .ip_version == 4 :
101- raise ValueError ('Error looking up {0}. You attempted to look up '
102- 'an IPv6 address in an IPv4-only database.' . format (
103- ip_address ))
100+ raise ValueError (
101+ 'Error looking up {0}. You attempted to look up '
102+ 'an IPv6 address in an IPv4-only database.' . format ( ip_address ))
104103 pointer = self ._find_address_in_tree (address )
105104
106105 return self ._resolve_data_pointer (pointer ) if pointer else None
107106
108107 def _find_address_in_tree (self , ip_address ):
109- packed = ip_address .packed
108+ packed = bytearray ( ip_address .packed )
110109
111110 bit_count = len (packed ) * 8
112111 node = self ._start_node (bit_count )
113112
114113 for i in range (bit_count ):
115114 if node >= self ._metadata .node_count :
116115 break
117- bit = 1 & (int_from_byte ( packed [i >> 3 ]) >> 7 - (i % 8 ))
116+ bit = 1 & (packed [i >> 3 ] >> 7 - (i % 8 ))
118117 node = self ._read_node (node , bit )
119118 if node == self ._metadata .node_count :
120119 # Record is empty
@@ -149,21 +148,21 @@ def _read_node(self, node_number, index):
149148 offset = base_offset + index * 3
150149 node_bytes = b'\x00 ' + self ._buffer [offset :offset + 3 ]
151150 elif record_size == 28 :
152- (middle ,) = struct .unpack (
151+ (middle , ) = struct .unpack (
153152 b'!B' , self ._buffer [base_offset + 3 :base_offset + 4 ])
154153 if index :
155154 middle &= 0x0F
156155 else :
157156 middle = (0xF0 & middle ) >> 4
158157 offset = base_offset + index * 4
159- node_bytes = byte_from_int (
160- middle ) + self . _buffer [ offset : offset + 3 ]
158+ node_bytes = byte_from_int (middle ) + self . _buffer [ offset : offset +
159+ 3 ]
161160 elif record_size == 32 :
162161 offset = base_offset + index * 4
163162 node_bytes = self ._buffer [offset :offset + 4 ]
164163 else :
165- raise InvalidDatabaseError (
166- 'Unknown record size: {0}' . format ( record_size ))
164+ raise InvalidDatabaseError ('Unknown record size: {0}' . format (
165+ record_size ))
167166 return struct .unpack (b'!I' , node_bytes )[0 ]
168167
169168 def _resolve_data_pointer (self , pointer ):
@@ -185,7 +184,6 @@ def close(self):
185184
186185
187186class Metadata (object ):
188-
189187 """Metadata for the MaxMind DB reader"""
190188
191189 # pylint: disable=too-many-instance-attributes
0 commit comments