1414
1515
1616"""Functions and classes common to multiple pymongo modules."""
17+
1718import sys
18- from pymongo import read_preferences
19+ import warnings
1920
2021from pymongo .auth import MECHANISMS
2122from pymongo .errors import ConfigurationError
23+ from pymongo .read_preferences import (make_read_preference ,
24+ read_pref_mode_from_name ,
25+ ReadPreference ,
26+ ServerMode )
2227from pymongo .write_concern import WriteConcern
2328from bson .binary import (OLD_UUID_SUBTYPE , UUID_SUBTYPE ,
2429 JAVA_LEGACY , CSHARP_LEGACY )
@@ -194,7 +199,7 @@ def validate_timeout_or_none(option, value):
194199def validate_read_preference (dummy , value ):
195200 """Validate a read preference.
196201 """
197- if not isinstance (value , read_preferences . ServerMode ):
202+ if not isinstance (value , ServerMode ):
198203 raise ConfigurationError ("%r is not a "
199204 "valid read preference." % (value ,))
200205 return value
@@ -204,7 +209,7 @@ def validate_read_preference_mode(dummy, name):
204209 """Validate read preference mode for a MongoReplicaSetClient.
205210 """
206211 try :
207- return read_preferences . read_pref_mode_from_name (name )
212+ return read_pref_mode_from_name (name )
208213 except ValueError :
209214 raise ConfigurationError ("Not a valid read preference" )
210215
@@ -278,7 +283,8 @@ def validate_read_preference_tags(name, value):
278283 'read_preference' : validate_read_preference ,
279284 'readpreference' : validate_read_preference_mode ,
280285 'readpreferencetags' : validate_read_preference_tags ,
281- 'acceptablelatencyms' : validate_positive_float ,
286+ 'latencythresholdms' : validate_positive_float ,
287+ 'secondaryacceptablelatencyms' : validate_positive_float ,
282288 'auto_start_request' : validate_boolean ,
283289 'use_greenlets' : validate_boolean ,
284290 'authmechanism' : validate_auth_mechanism ,
@@ -329,25 +335,24 @@ class BaseObject(object):
329335
330336 def __init__ (self , ** options ):
331337
332- self .__read_pref = read_preferences . ReadPreference . PRIMARY
338+ self .__read_pref = None
333339 self .__uuid_subtype = OLD_UUID_SUBTYPE
334340 self .__write_concern = None
335341 self .__set_options (options )
336342
343+ if 'read_preference' not in options :
344+ mode = options .get ('readpreference' , 0 )
345+ latency = options .get ('secondaryacceptablelatencyms' ,
346+ options .get ('latencythresholdms' , 15 ))
347+ tags = options .get ('readpreferencetags' )
348+ self .__read_pref = make_read_preference (mode , latency , tags )
349+
337350 def __set_options (self , options ):
338351 """Validates and sets all options passed to this object."""
339352 wc_opts = {}
340353 for option , value in iteritems (options ):
341354 if option == 'read_preference' :
342355 self .__read_pref = validate_read_preference (option , value )
343- elif option == 'readpreference' :
344- klass = read_preferences .read_pref_class_from_mode (value )
345- if value == 0 :
346- # Primary, no tags
347- self .__read_pref = klass ()
348- continue
349- tags = options .get ('readpreferencetags' , None )
350- self .__read_pref = klass (tags )
351356 elif option == 'uuidrepresentation' :
352357 self .__uuid_subtype = validate_uuid_subtype (option , value )
353358 elif option in WRITE_CONCERN_OPTIONS :
@@ -436,6 +441,30 @@ def __set_read_pref(self, value):
436441
437442 read_preference = property (__get_read_pref , __set_read_pref )
438443
444+ def __get_latency (self ):
445+ return self .__read_pref .latency_threshold_ms
446+
447+ def __set_latency (self , latency ):
448+ warnings .warn ("The secondary_acceptable_latency_ms attribute is "
449+ "deprecated" , DeprecationWarning , stacklevel = 2 )
450+ mode = self .__read_pref .mode
451+ tag_sets = self .__read_pref .tag_sets
452+ self .__read_pref = make_read_preference (mode , latency , tag_sets )
453+
454+ secondary_acceptable_latency_ms = property (__get_latency , __set_latency )
455+
456+ def __get_tags (self ):
457+ return self .__read_pref .tag_sets
458+
459+ def __set_tags (self , tag_sets ):
460+ warnings .warn ("The tag_sets attribute is deprecated" ,
461+ DeprecationWarning , stacklevel = 2 )
462+ mode = self .__read_pref .mode
463+ latency = self .__read_pref .latency_threshold_ms
464+ self .__read_pref = make_read_preference (mode , latency , tag_sets )
465+
466+ tag_sets = property (__get_tags , __set_tags )
467+
439468 def __get_uuid_subtype (self ):
440469 """This attribute specifies which BSON Binary subtype is used when
441470 storing UUIDs. Historically UUIDs have been stored as BSON Binary
0 commit comments