U
    d|/                     @  s  d Z ddlmZ ddlmZmZmZmZmZm	Z	m
Z
mZ ddlmZ ddlmZ ddlmZmZ ddlmZ ddlmZ dd	lmZ dd
lmZmZ ddlmZ ddlmZ ddl m!Z!m"Z"m#Z# ddl$m%Z% ddl&m'Z' ddl(m)Z) erddlm*Z* ddl+m,Z, ddl-m.Z. ddl/m0Z0 ddddddddZ1dddddZ2dd dd!d"Z3dd#dd$d%Z4dd&dd'd(Z5ddddd)dd*d+Z6G d,d- d-Z7d.S )/z$Tools to parse mongo client options.    )annotations)TYPE_CHECKINGAnyListMappingOptionalSequenceTuplecast)_parse_codec_options)common)MongoCredential_build_credentials_tuple)validate_boolean)CompressionSettings)ConfigurationError)_EventListener_EventListeners)PoolOptions)ReadConcern)_ServerModemake_read_preferenceread_pref_mode_from_name)any_server_selector)get_ssl_context)WriteConcern)CodecOptions)AutoEncryptionOpts)
SSLContext)_ServerSelectorstrOptional[str]Mapping[str, Any]zOptional[MongoCredential])usernamepassworddatabaseoptionsreturnc                 C  s<   | d| rdnd}| d}| s&|r8t||| |||S dS )z!Parse authentication credentials.ZauthmechanismDEFAULTNZ
authsource)getr   )r#   r$   r%   r&   Z	mechanismsource r+   :/tmp/pip-unpacked-wheel-oblwsawz/pymongo/client_options.py_parse_credentials-   s
    
r-   r   )r&   r'   c                 C  sF   d| kr| d S |  dd}t|}|  d}|  dd}t|||S )zParse read preference options.read_preferenceZreadpreferenceZprimaryZreadpreferencetagsZmaxstalenessseconds)r)   r   r   )r&   namemodetagsZmax_stalenessr+   r+   r,   _parse_read_preference8   s    
r3   r   c                 C  s6   |  d}|  d}|  d}|  d}t||||S )zParse write concern options.wZ
wtimeoutmsZjournalfsync)r)   r   )r&   concernZwtimeoutjr5   r+   r+   r,   _parse_write_concernD   s
    



r8   r   c                 C  s   |  d}t|S )zParse read concern options.Zreadconcernlevel)r)   r   )r&   r6   r+   r+   r,   _parse_read_concernM   s    
r9   z!Tuple[Optional[SSLContext], bool]c                 C  s  |  d}|dk	rtd| |  d}|  d}|  d}|  d}|  dd}|  d	d}|  d
d}g }	dD ]}
|
| krp| |
 rp|	|
 qpdD ]}
|
| kr| |
 s|	|
 q|	r|dkrd}n|stdd|	 |rt|||||||}||fS d|fS )zParse ssl options.ZtlsNtlscertificatekeyfiletlscertificatekeyfilepassword	tlscafile
tlscrlfiletlsallowinvalidcertificatesFtlsallowinvalidhostnamestlsdisableocspendpointcheck)r:   r;   r<   r=   )r>   r?   r@   TzmTLS has not been enabled but the following tls parameters have been set: %s. Please set `tls=True` or remove.z, )r)   r   appendr   joinr   )r&   Zuse_tlscertfileZ
passphraseca_certsZcrlfileZallow_invalid_certificatesZallow_invalid_hostnamesZdisable_ocsp_endpoint_checkZenabled_tls_optsoptctxr+   r+   r,   _parse_ssl_optionsS   sL    





	rG   r   c                 C  s  t | |||}|dtj}|dtj}|dtj}|dk	rP||krPtd|dtj}|d}	|dtj}
t	t
tt  |d	}|d
}|d}|d}t|dg |dd}t|\}}|d}|dtj}t|||||	|
||t||||||||dS )zParse connection pool options.ZmaxpoolsizeZminpoolsizeZmaxidletimemsNz3minPoolSize must be smaller or equal to maxPoolSizeZconnecttimeoutmsZsockettimeoutmsZwaitqueuetimeoutmsevent_listenersappnamedriver
server_apiZcompressorsZzlibcompressionlevelr/   loadbalancedZmaxconnecting)max_connectingrK   load_balancedcredentials)r-   r)   r   ZMAX_POOL_SIZEZMIN_POOL_SIZEZMAX_IDLE_TIME_SEC
ValueErrorZCONNECT_TIMEOUTZWAIT_QUEUE_TIMEOUTr
   r   r   r   r   rG   ZMAX_CONNECTINGr   r   )r#   r$   r%   r&   rO   Zmax_pool_sizeZmin_pool_sizeZmax_idle_time_secondsconnect_timeoutsocket_timeoutZwait_queue_timeoutrH   rI   rJ   rK   Zcompression_settingsssl_contextZtls_allow_invalid_hostnamesrN   rM   r+   r+   r,   _parse_pool_options   sL    




 

rT   c                   @  sz  e Zd ZdZdddddddZeddd	d
ZeddddZeddddZeddddZ	eddddZ
eddddZeddddZeddddZeddddZed dd!d"Zeddd#d$Zed%dd&d'Zed(dd)d*Zed+dd,d-Zed.dd/d0Zed.dd1d2Zed3dd4d5Zeddd6d7Zed8dd9d:Zd;S )<ClientOptionszRead only configuration options for a MongoClient.

    Should not be instantiated directly by application developers. Access
    a client's options via :attr:`pymongo.mongo_client.MongoClient.options`
    instead.
    r    r!   r"   )r#   r$   r%   r&   c                 C  s   || _ t|| _|d| _|dtj| _|dtj| _	t
||||| _t|| _|d| _t|| _t|| _|d| _|dtj| _|dtj| _|dtj| _|d	t| _|d
| _|d| _|d| _d S )NZdirectconnectionZlocalthresholdmsZserverselectiontimeoutmsZ
replicasetconnectZheartbeatfrequencymsZretrywritesZ
retryreadsserver_selectorauto_encryption_optsrL   Z	timeoutms)_ClientOptions__optionsr   _ClientOptions__codec_optionsr)   !_ClientOptions__direct_connectionr   ZLOCAL_THRESHOLD_MS"_ClientOptions__local_threshold_msZSERVER_SELECTION_TIMEOUT(_ClientOptions__server_selection_timeoutrT   _ClientOptions__pool_optionsr3   _ClientOptions__read_preference _ClientOptions__replica_set_namer8   _ClientOptions__write_concernr9   _ClientOptions__read_concern_ClientOptions__connectZHEARTBEAT_FREQUENCY#_ClientOptions__heartbeat_frequencyZRETRY_WRITES_ClientOptions__retry_writesZRETRY_READS_ClientOptions__retry_readsr   _ClientOptions__server_selector$_ClientOptions__auto_encryption_opts_ClientOptions__load_balanced_ClientOptions__timeout)selfr#   r$   r%   r&   r+   r+   r,   __init__   s*    
 


zClientOptions.__init__)r'   c                 C  s   | j S )z7The original options used to create this ClientOptions.)rY   rk   r+   r+   r,   _options   s    zClientOptions._optionszOptional[bool]c                 C  s   | j S )z>Whether to begin discovering a MongoDB topology automatically.)rc   rm   r+   r+   r,   rV      s    zClientOptions.connectr   c                 C  s   | j S )z5A :class:`~bson.codec_options.CodecOptions` instance.)rZ   rm   r+   r+   r,   codec_options   s    zClientOptions.codec_optionsc                 C  s   | j S )z:Whether to connect to the deployment in 'Single' topology.)r[   rm   r+   r+   r,   direct_connection   s    zClientOptions.direct_connectionintc                 C  s   | j S )z&The local threshold for this instance.)r\   rm   r+   r+   r,   local_threshold_ms   s    z ClientOptions.local_threshold_msc                 C  s   | j S )z:The server selection timeout for this instance in seconds.)r]   rm   r+   r+   r,   server_selection_timeout   s    z&ClientOptions.server_selection_timeoutr   c                 C  s   | j S )N)rg   rm   r+   r+   r,   rW      s    zClientOptions.server_selectorc                 C  s   | j S )z$The monitoring frequency in seconds.)rd   rm   r+   r+   r,   heartbeat_frequency   s    z!ClientOptions.heartbeat_frequencyr   c                 C  s   | j S )z.A :class:`~pymongo.pool.PoolOptions` instance.)r^   rm   r+   r+   r,   pool_options  s    zClientOptions.pool_optionsr   c                 C  s   | j S )zA read preference instance.)r_   rm   r+   r+   r,   r.     s    zClientOptions.read_preferencec                 C  s   | j S )zReplica set name or None.)r`   rm   r+   r+   r,   replica_set_name  s    zClientOptions.replica_set_namer   c                 C  s   | j S )z8A :class:`~pymongo.write_concern.WriteConcern` instance.)ra   rm   r+   r+   r,   write_concern  s    zClientOptions.write_concernr   c                 C  s   | j S )z6A :class:`~pymongo.read_concern.ReadConcern` instance.)rb   rm   r+   r+   r,   read_concern  s    zClientOptions.read_concernzOptional[float]c                 C  s   | j S )z^The configured timeoutMS converted to seconds, or None.

        .. versionadded: 4.2
        )rj   rm   r+   r+   r,   timeout  s    zClientOptions.timeoutboolc                 C  s   | j S )z9If this instance should retry supported write operations.)re   rm   r+   r+   r,   retry_writes#  s    zClientOptions.retry_writesc                 C  s   | j S )z8If this instance should retry supported read operations.)rf   rm   r+   r+   r,   retry_reads(  s    zClientOptions.retry_readszOptional[AutoEncryptionOpts]c                 C  s   | j S )z:A :class:`~pymongo.encryption.AutoEncryptionOpts` or None.)rh   rm   r+   r+   r,   rX   -  s    z"ClientOptions.auto_encryption_optsc                 C  s   | j S )z@True if the client was configured to connect to a load balancer.)ri   rm   r+   r+   r,   rN   2  s    zClientOptions.load_balancedzList[_EventListeners]c                 C  s   | j jdk	st| j j S )zThe event listeners registered for this client.

        See :mod:`~pymongo.monitoring` for details.

        .. versionadded:: 4.0
        N)r^   Z_event_listenersAssertionErrorrH   rm   r+   r+   r,   rH   7  s    zClientOptions.event_listenersN)__name__
__module____qualname____doc__rl   propertyrn   rV   ro   rp   rr   rs   rW   rt   ru   r.   rv   rw   rx   ry   r{   r|   rX   rN   rH   r+   r+   r+   r,   rU      sP   rU   N)8r   
__future__r   typingr   r   r   r   r   r   r	   r
   Zbson.codec_optionsr   Zpymongor   Zpymongo.authr   r   Zpymongo.commonr   Zpymongo.compression_supportr   Zpymongo.errorsr   Zpymongo.monitoringr   r   Zpymongo.poolr   Zpymongo.read_concernr   Zpymongo.read_preferencesr   r   r   Zpymongo.server_selectorsr   Zpymongo.ssl_supportr   Zpymongo.write_concernr   r   Zpymongo.encryptionr   Zpymongo.pyopenssl_contextr   Zpymongo.topology_descriptionr   r-   r3   r8   r9   rG   rT   rU   r+   r+   r+   r,   <module>   s6   (	;+