99import re
1010import datetime
1111import time
12+ import logging
1213
1314from test import test_data , qcheck
1415
16+ _logger = logging .getLogger ("mongo.bson" )
17+ # _logger.setLevel(logging.DEBUG)
18+ # _logger.addHandler(logging.StreamHandler())
19+
1520class InvalidBSON (ValueError ):
1621 """Raised when trying to create a BSON object from invalid data.
1722 """
@@ -48,52 +53,63 @@ def _make_c_string(string):
4853 return string + "\x00 "
4954
5055def _validate_number (data ):
56+ _logger .debug ("validating number" )
5157 assert len (data ) >= 8
5258 return data [8 :]
5359
5460def _validate_string (data ):
61+ _logger .debug ("validating string" )
5562 (length , data ) = _get_int (data )
5663 assert len (data ) >= length
5764 assert data [length - 1 ] == "\x00 "
5865 return data [length :]
5966
6067def _validate_object (data ):
68+ _logger .debug ("validating object" )
6169 return _validate_document (data , None )
6270
6371_valid_array_name = re .compile ("^\d+$" )
6472def _validate_array (data ):
73+ _logger .debug ("validating array" )
6574 return _validate_document (data , _valid_array_name )
6675
6776def _validate_binary (data ):
77+ _logger .debug ("validating binary" )
6878 (length , data ) = _get_int (data )
6979 assert len (data ) >= length
7080 return data [length :]
7181
7282def _validate_undefined (data ):
83+ _logger .debug ("validating undefined" )
7384 return data
7485
7586_OID_SIZE = 12
7687def _validate_oid (data ):
88+ _logger .debug ("validating oid" )
7789 assert len (data ) >= _OID_SIZE
7890 return data [_OID_SIZE :]
7991
8092def _validate_boolean (data ):
93+ _logger .debug ("validating boolean" )
8194 assert len (data ) >= 1
8295 return data [1 :]
8396
8497_DATE_SIZE = 8
8598def _validate_date (data ):
99+ _logger .debug ("validating date" )
86100 assert len (data ) >= _DATE_SIZE
87101 return data [_DATE_SIZE :]
88102
89103_validate_null = _validate_undefined
90104
91105def _validate_regex (data ):
106+ _logger .debug ("validating regex" )
92107 (regex , data ) = _get_c_string (data )
93108 (options , data ) = _get_c_string (data )
94109 return data
95110
96111def _validate_ref (data ):
112+ _logger .debug ("validating ref" )
97113 (namespace , data ) = _get_c_string (data )
98114 return _validate_oid (data )
99115
@@ -102,6 +118,7 @@ def _validate_ref(data):
102118_validate_symbol = _validate_string
103119
104120def _validate_number_int (data ):
121+ _logger .debug ("validating int" )
105122 assert len (data ) >= 4
106123 return data [4 :]
107124
@@ -161,15 +178,19 @@ def _validate_document(data, valid_name=None):
161178 return data [obj_size :]
162179
163180def _get_number (data ):
181+ _logger .debug ("unpacking number" )
164182 return (struct .unpack ("<d" , data [:8 ])[0 ], data [8 :])
165183
166184def _get_string (data ):
185+ _logger .debug ("unpacking string" )
167186 return _get_c_string (data [4 :])
168187
169188def _get_object (data ):
189+ _logger .debug ("unpacking object" )
170190 return _document_to_dict (data )
171191
172192def _get_array (data ):
193+ _logger .debug ("unpacking array" )
173194 (dict , data ) = _get_object (data )
174195 result = []
175196 i = 0
@@ -182,35 +203,32 @@ def _get_array(data):
182203 return (result , data )
183204
184205def _get_binary (data ):
206+ _logger .debug ("unpacking binary" )
185207 (length , data ) = _get_int (data )
186208 return (data [:length ], data [length :])
187209
188210def _get_boolean (data ):
211+ _logger .debug ("unpacking boolean" )
189212 return (data [0 ] == "\x01 " , data [1 :])
190213
191214def _get_date (data ):
215+ _logger .debug ("unpacking date" )
192216 seconds = float (struct .unpack ("<q" , data [:8 ])[0 ]) / 1000.0
193217 return (datetime .datetime .fromtimestamp (seconds ), data [8 :])
194218
195219def _get_null (data ):
220+ _logger .debug ("unpacking null" )
196221 return (None , data )
197222
198- _re_stack = []
199-
200223def _get_regex (data ):
224+ _logger .debug ("unpacking regex" )
201225 (pattern , data ) = _get_c_string (data )
202- print "out %r" % pattern
203226 (bson_flags , data ) = _get_c_string (data )
204227 flags = 0
205228 if bson_flags .find ("i" ) > - 1 :
206229 flags |= re .IGNORECASE
207230 if bson_flags .find ("m" ) > - 1 :
208231 flags |= re .MULTILINE
209- print "out %r" % flags
210- res = re .compile (pattern , flags )
211- other = _re_stack .pop (0 )
212- assert res .pattern == other .pattern , "%r %r" % (res .pattern , other .pattern )
213- assert res == other , "%r %r" % (res .pattern , other .pattern )
214232 return (re .compile (pattern , flags ), data )
215233
216234_element_getter = {
@@ -259,39 +277,46 @@ def _int_64_to_bson(int):
259277_RE_TYPE = type (_valid_array_name )
260278def _value_to_bson (value ):
261279 if isinstance (value , types .FloatType ):
280+ _logger .debug ("packing float" )
262281 return ("\x01 " , struct .pack ("<d" , value ))
263282 if isinstance (value , types .UnicodeType ):
283+ _logger .debug ("packing string" )
264284 cstring = _make_c_string (value )
265285 length = _int_to_bson (len (cstring ))
266286 return ("\x02 " , length + cstring )
267287 if isinstance (value , types .DictType ):
288+ _logger .debug ("packing object" )
268289 return ("\x03 " , BSON .from_dict (value ))
269290 if isinstance (value , types .ListType ):
291+ _logger .debug ("packing array" )
270292 as_dict = dict (zip ([str (i ) for i in range (len (value ))], value ))
271293 return ("\x04 " , BSON .from_dict (as_dict ))
272294 if isinstance (value , types .StringType ):
295+ _logger .debug ("packing binary" )
273296 return ("\x05 " , _int_to_bson (len (value )) + value )
274297 if isinstance (value , types .BooleanType ):
298+ _logger .debug ("packing boolean" )
275299 if value :
276300 return ("\x08 " , "\x01 " )
277301 return ("\x08 " , "\x00 " )
278302 if isinstance (value , datetime .datetime ):
303+ _logger .debug ("packing date" )
279304 millis = int (time .mktime (value .timetuple ()) * 1000 + value .microsecond / 1000 )
280305 return ("\x09 " , _int_64_to_bson (millis ))
281306 if isinstance (value , types .NoneType ):
307+ _logger .debug ("packing null" )
282308 return ("\x0A " , "" )
283309 if isinstance (value , _RE_TYPE ):
284- _re_stack . append ( value )
310+ _logger . debug ( "packing regex" )
285311 pattern = value .pattern
286- print "in %r" % pattern
287- print "in %r" % value .flags
288312 flags = "g" # TODO should it be global by default?
289313 if value .flags & re .IGNORECASE :
290314 flags += "i"
291315 if value .flags & re .MULTILINE :
292316 flags += "m"
293317 return ("\x0B " , _make_c_string (pattern ) + _make_c_string (flags ))
294318 if isinstance (value , types .IntType ):
319+ _logger .debug ("packing int" )
295320 return ("\x10 " , _int_to_bson (value ))
296321 raise InvalidDocument ("cannot convert value of type %s to bson" % type (value ))
297322
@@ -418,8 +443,8 @@ def test_basic_from_dict(self):
418443 "\x0B \x00 \x00 \x00 \x0A \x74 \x65 \x73 \x74 \x00 \x00 " )
419444 self .assertEqual (BSON .from_dict ({"date" : datetime .datetime (2007 , 1 , 7 , 19 , 30 , 11 )}),
420445 "\x13 \x00 \x00 \x00 \x09 \x64 \x61 \x74 \x65 \x00 \x38 \xBE \x1C \xFF \x0F \x01 \x00 \x00 \x00 " )
421- # self.assertEqual(BSON.from_dict({"regex": re.compile("a*b", re.IGNORECASE)}),
422- # "\x13\x00\x00\x00\x0B\x72\x65\x67\x65\x78\x00\x61\x2A\x62\x00\x67\x69\x00\x00")
446+ self .assertEqual (BSON .from_dict ({"regex" : re .compile ("a*b" , re .IGNORECASE )}),
447+ "\x13 \x00 \x00 \x00 \x0B \x72 \x65 \x67 \x65 \x78 \x00 \x61 \x2A \x62 \x00 \x67 \x69 \x00 \x00 " )
423448
424449 def test_from_then_to_dict (self ):
425450 def helper (dict ):
@@ -433,8 +458,6 @@ def helper(dict):
433458 helper ({"an array" : [1 , True , 3.8 , u"world" ]})
434459 helper ({"an object" : {"test" : u"something" }})
435460
436- # helper({"re": re.compile(u"", re.MULTILINE)})
437-
438461 def from_then_to_dict (dict ):
439462 return dict == (BSON .from_dict (dict )).to_dict ()
440463
0 commit comments