diff --git a/bson.py b/bson.py index e6fc13aa5..395782fbb 100644 --- a/bson.py +++ b/bson.py @@ -9,9 +9,14 @@ import random import re import datetime import time +import logging from test import test_data, qcheck +_logger = logging.getLogger("mongo.bson") +# _logger.setLevel(logging.DEBUG) +# _logger.addHandler(logging.StreamHandler()) + class InvalidBSON(ValueError): """Raised when trying to create a BSON object from invalid data. """ @@ -48,52 +53,63 @@ def _make_c_string(string): return string + "\x00" def _validate_number(data): + _logger.debug("validating number") assert len(data) >= 8 return data[8:] def _validate_string(data): + _logger.debug("validating string") (length, data) = _get_int(data) assert len(data) >= length assert data[length - 1] == "\x00" return data[length:] def _validate_object(data): + _logger.debug("validating object") return _validate_document(data, None) _valid_array_name = re.compile("^\d+$") def _validate_array(data): + _logger.debug("validating array") return _validate_document(data, _valid_array_name) def _validate_binary(data): + _logger.debug("validating binary") (length, data) = _get_int(data) assert len(data) >= length return data[length:] def _validate_undefined(data): + _logger.debug("validating undefined") return data _OID_SIZE = 12 def _validate_oid(data): + _logger.debug("validating oid") assert len(data) >= _OID_SIZE return data[_OID_SIZE:] def _validate_boolean(data): + _logger.debug("validating boolean") assert len(data) >= 1 return data[1:] _DATE_SIZE = 8 def _validate_date(data): + _logger.debug("validating date") assert len(data) >= _DATE_SIZE return data[_DATE_SIZE:] _validate_null = _validate_undefined def _validate_regex(data): + _logger.debug("validating regex") (regex, data) = _get_c_string(data) (options, data) = _get_c_string(data) return data def _validate_ref(data): + _logger.debug("validating ref") (namespace, data) = _get_c_string(data) return _validate_oid(data) @@ -102,6 +118,7 @@ _validate_code = _validate_string _validate_symbol = _validate_string def _validate_number_int(data): + _logger.debug("validating int") assert len(data) >= 4 return data[4:] @@ -161,15 +178,19 @@ def _validate_document(data, valid_name=None): return data[obj_size:] def _get_number(data): + _logger.debug("unpacking number") return (struct.unpack(" -1: flags |= re.IGNORECASE if bson_flags.find("m") > -1: flags |= re.MULTILINE - print "out %r" % flags - res = re.compile(pattern, flags) - other = _re_stack.pop(0) - assert res.pattern == other.pattern, "%r %r" % (res.pattern, other.pattern) - assert res == other, "%r %r" % (res.pattern, other.pattern) return (re.compile(pattern, flags), data) _element_getter = { @@ -259,32 +277,38 @@ def _int_64_to_bson(int): _RE_TYPE = type(_valid_array_name) def _value_to_bson(value): if isinstance(value, types.FloatType): + _logger.debug("packing float") return ("\x01", struct.pack(" 0.5: