Basic support for min and maxWireVersion PYTHON-587

This commit is contained in:
behackett 2013-11-25 13:44:34 -08:00
parent b62750971c
commit ce7ce38ffd
9 changed files with 83 additions and 0 deletions

View File

@ -27,6 +27,8 @@
.. autoattribute:: tz_aware
.. autoattribute:: max_bson_size
.. autoattribute:: max_message_size
.. autoattribute:: min_wire_version
.. autoattribute:: max_wire_version
.. autoattribute:: read_preference
.. autoattribute:: tag_sets
.. autoattribute:: secondary_acceptable_latency_ms

View File

@ -27,6 +27,8 @@
.. autoattribute:: tz_aware
.. autoattribute:: max_bson_size
.. autoattribute:: max_message_size
.. autoattribute:: min_wire_version
.. autoattribute:: max_wire_version
.. autoattribute:: read_preference
.. autoattribute:: tag_sets
.. autoattribute:: secondary_acceptable_latency_ms

View File

@ -27,6 +27,8 @@
.. autoattribute:: tz_aware
.. autoattribute:: max_bson_size
.. autoattribute:: max_message_size
.. autoattribute:: min_wire_version
.. autoattribute:: max_wire_version
.. autoattribute:: auto_start_request
.. autoattribute:: read_preference
.. autoattribute:: tag_sets

View File

@ -27,6 +27,8 @@
.. autoattribute:: tz_aware
.. autoattribute:: max_bson_size
.. autoattribute:: max_message_size
.. autoattribute:: min_wire_version
.. autoattribute:: max_wire_version
.. autoattribute:: auto_start_request
.. autoattribute:: read_preference
.. autoattribute:: tag_sets

View File

@ -39,6 +39,8 @@ if sys.platform.startswith('java'):
# Defaults until we connect to a server and get updated limits.
MAX_BSON_SIZE = 16 * (1024 ** 2)
MAX_MESSAGE_SIZE = 2 * MAX_BSON_SIZE
MIN_WIRE_VERSION = 0
MAX_WIRE_VERSION = 0
def raise_config_error(key, dummy):

View File

@ -85,6 +85,9 @@ class MongoClient(common.BaseObject):
__max_bson_size = common.MAX_BSON_SIZE
__max_message_size = common.MAX_MESSAGE_SIZE
__min_wire_version = common.MIN_WIRE_VERSION
# TODO: write commands with _connect=False
__max_wire_version = common.MAX_WIRE_VERSION
def __init__(self, host=None, port=None, max_pool_size=100,
document_class=dict, tz_aware=False, _connect=True,
@ -595,6 +598,26 @@ class MongoClient(common.BaseObject):
"""
return self.__max_message_size
@property
def min_wire_version(self):
"""The minWireVersion reported by the server.
Returns ``0`` when connected to server versions prior to MongoDB 2.6.
.. versionadded:: 2.7
"""
return self.__min_wire_version
@property
def max_wire_version(self):
"""The maxWireVersion reported by the server.
Returns ``0`` when connected to server versions prior to MongoDB 2.6.
.. versionadded:: 2.7
"""
return self.__max_wire_version
def __simple_command(self, sock_info, dbname, spec):
"""Send a command to the server.
"""
@ -639,6 +662,10 @@ class MongoClient(common.BaseObject):
self.__max_bson_size = response["maxBsonObjectSize"]
if "maxMessageSizeBytes" in response:
self.__max_message_size = response["maxMessageSizeBytes"]
if "minWireVersion" in response:
self.__min_wire_version = response["minWireVersion"]
if "maxWireVersion" in response:
self.__max_wire_version = response["maxWireVersion"]
# Replica Set?
if not self.__direct:

View File

@ -422,6 +422,10 @@ class Member(object):
'maxBsonObjectSize', common.MAX_BSON_SIZE)
self.max_message_size = ismaster_response.get(
'maxMessageSizeBytes', 2 * self.max_bson_size)
self.min_wire_version = ismaster_response.get('minWireVersion',
common.MIN_WIRE_VERSION)
self.max_wire_version = ismaster_response.get('maxWireVersion',
common.MAX_WIRE_VERSION)
def clone_with(self, ismaster_response, ping_time_sample):
"""Get a clone updated with ismaster response and a single ping time.
@ -1017,6 +1021,32 @@ class MongoReplicaSetClient(common.BaseObject):
return rs_state.primary_member.max_message_size
return common.MAX_MESSAGE_SIZE
@property
def min_wire_version(self):
"""The minWireVersion reported by the server.
Returns ``0`` when connected to server versions prior to MongoDB 2.6.
.. versionadded:: 2.7
"""
rs_state = self.__rs_state
if rs_state.primary_member:
return rs_state.primary_member.min_wire_version
return common.MIN_WIRE_VERSION
@property
def max_wire_version(self):
"""The maxWireVersion reported by the server.
Returns ``0`` when connected to server versions prior to MongoDB 2.6.
.. versionadded:: 2.7
"""
rs_state = self.__rs_state
if rs_state.primary_member:
return rs_state.primary_member.max_wire_version
return common.MAX_WIRE_VERSION
@property
def auto_start_request(self):
"""Is auto_start_request enabled?

View File

@ -97,6 +97,8 @@ class TestClient(unittest.TestCase, TestRequestMixin):
self.assertEqual(dict, c.get_document_class())
self.assertIsInstance(c.tz_aware, bool)
self.assertIsInstance(c.max_bson_size, int)
self.assertIsInstance(c.min_wire_version, int)
self.assertIsInstance(c.max_wire_version, int)
self.assertEqual(None, c.host)
self.assertEqual(None, c.port)
@ -104,6 +106,12 @@ class TestClient(unittest.TestCase, TestRequestMixin):
self.assertEqual(host, c.host)
self.assertEqual(port, c.port)
if version.at_least(c, (2, 5, 4, -1)):
self.assertTrue(c.max_wire_version > 0)
else:
self.assertEqual(c.max_wire_version, 0)
self.assertTrue(c.min_wire_version >= 0)
bad_host = "somedomainthatdoesntexist.org"
c = MongoClient(bad_host, port, connectTimeoutMS=1, _connect=False)
self.assertRaises(ConnectionFailure, c.pymongo_test.test.find_one)

View File

@ -129,6 +129,8 @@ class TestReplicaSetClient(TestReplicaSetClientBase, TestRequestMixin):
self.assertIsInstance(c.auto_start_request, bool)
self.assertIsInstance(c.tz_aware, bool)
self.assertIsInstance(c.max_bson_size, int)
self.assertIsInstance(c.min_wire_version, int)
self.assertIsInstance(c.max_wire_version, int)
self.assertIsInstance(c.seeds, set)
self.assertIsInstance(c.hosts, frozenset)
self.assertIsInstance(c.arbiters, frozenset)
@ -140,6 +142,12 @@ class TestReplicaSetClient(TestReplicaSetClientBase, TestRequestMixin):
self.assertTrue(c.primary)
self.assertTrue(c.secondaries)
if version.at_least(c, (2, 5, 4, -1)):
self.assertTrue(c.max_wire_version > 0)
else:
self.assertEqual(c.max_wire_version, 0)
self.assertTrue(c.min_wire_version >= 0)
c = self._get_client(_connect=False)
c.pymongo_test.test.update({}, {}) # Auto-connect for write.
self.assertTrue(c.primary)