60
60
from pymongo .network import (command ,
61
61
receive_message )
62
62
from pymongo .read_preferences import ReadPreference
63
+ from pymongo .server_api import _add_to_command
63
64
from pymongo .server_type import SERVER_TYPE
64
65
from pymongo .socket_checker import SocketChecker
65
66
# Always use our backport so we always have support for IP address matching
@@ -311,7 +312,7 @@ class PoolOptions(object):
311
312
'__ssl_context' , '__ssl_match_hostname' , '__socket_keepalive' ,
312
313
'__event_listeners' , '__appname' , '__driver' , '__metadata' ,
313
314
'__compression_settings' , '__max_connecting' ,
314
- '__pause_enabled' )
315
+ '__pause_enabled' , '__server_api' )
315
316
316
317
def __init__ (self , max_pool_size = MAX_POOL_SIZE ,
317
318
min_pool_size = MIN_POOL_SIZE ,
@@ -321,8 +322,7 @@ def __init__(self, max_pool_size=MAX_POOL_SIZE,
321
322
ssl_match_hostname = True , socket_keepalive = True ,
322
323
event_listeners = None , appname = None , driver = None ,
323
324
compression_settings = None , max_connecting = MAX_CONNECTING ,
324
- pause_enabled = True ):
325
-
325
+ pause_enabled = True , server_api = None ):
326
326
self .__max_pool_size = max_pool_size
327
327
self .__min_pool_size = min_pool_size
328
328
self .__max_idle_time_seconds = max_idle_time_seconds
@@ -339,6 +339,7 @@ def __init__(self, max_pool_size=MAX_POOL_SIZE,
339
339
self .__compression_settings = compression_settings
340
340
self .__max_connecting = max_connecting
341
341
self .__pause_enabled = pause_enabled
342
+ self .__server_api = server_api
342
343
self .__metadata = copy .deepcopy (_METADATA )
343
344
if appname :
344
345
self .__metadata ['application' ] = {'name' : appname }
@@ -495,6 +496,12 @@ def metadata(self):
495
496
"""
496
497
return self .__metadata .copy ()
497
498
499
+ @property
500
+ def server_api (self ):
501
+ """A pymongo.server_api.ServerApi or None.
502
+ """
503
+ return self .__server_api
504
+
498
505
499
506
def _negotiate_creds (all_credentials ):
500
507
"""Return one credential that needs mechanism negotiation, if any.
@@ -705,6 +712,7 @@ def command(self, dbname, spec, slave_ok=False,
705
712
raise ConfigurationError (
706
713
'Must be connected to MongoDB 3.4+ to use a collation.' )
707
714
715
+ self .add_server_api (spec , session )
708
716
if session :
709
717
session ._apply_to (spec , retryable_write , read_preference )
710
718
self .send_cluster_time (spec , session , client )
@@ -894,6 +902,14 @@ def send_cluster_time(self, command, session, client):
894
902
if self .max_wire_version >= 6 and client :
895
903
client ._send_cluster_time (command , session )
896
904
905
+ def add_server_api (self , command , session ):
906
+ """Add server_api parameters."""
907
+ if (session and session .in_transaction and
908
+ not session ._starting_transaction ):
909
+ return
910
+ if self .opts .server_api :
911
+ _add_to_command (command , self .opts .server_api )
912
+
897
913
def update_last_checkin_time (self ):
898
914
self .last_checkin_time = _time ()
899
915
0 commit comments