3
]ð]$  ã               @   sè   d Z ddlmZ ddlmZ ddlmZ ddlmZ ddl	m
Z
 ddl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 dd„ Zdd„ Zdd„ Zdd„ Zdd„ Z dd„ Z!G dd„ de"ƒZ#dS )z$Tools to parse mongo client options.é    )Ú_parse_codec_options)Ú_build_credentials_tuple)Úvalidate_boolean)Úcommon)ÚCompressionSettings)ÚConfigurationError)Ú_EventListeners)ÚPoolOptions)ÚReadConcern)Úmake_read_preferenceÚread_pref_mode_from_name)Úany_server_selector)Úget_ssl_context)ÚWriteConcernc             C   s<   |j d| rdndƒ}|j dƒ}| s&|r8t||| |||ƒS dS )z!Parse authentication credentials.ZauthmechanismÚDEFAULTNZ
authsource)Úgetr   )ÚusernameÚpasswordÚdatabaseÚoptionsZ	mechanismÚsource© r   ú9/tmp/pip-build-20mum3z4/pymongo/pymongo/client_options.pyÚ_parse_credentials!   s    
r   c             C   sF   d| kr| d S | j ddƒ}t|ƒ}| j dƒ}| j 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_preference+   s    
r    c             C   s6   | j dƒ}| j dƒ}| j dƒ}| j dƒ}t||||ƒS )zParse write concern options.ÚwZ
wtimeoutmsZjournalÚfsync)r   r   )r   ÚconcernZwtimeoutÚjr"   r   r   r   Ú_parse_write_concern7   s
    



r%   c             C   s   | j dƒ}t|ƒS )zParse read concern options.Zreadconcernlevel)r   r
   )r   r#   r   r   r   Ú_parse_read_concern@   s    
r&   c                sÐ   ˆ j dƒ}|dk	rtd|ƒ ˆ j dƒ}ˆ j dƒ}ˆ j dƒ}ˆ j dƒ}ˆ j dƒ}ˆ j dd	ƒ}ˆ j d
ƒ}‡ fdd„ˆ D ƒ}	|dkr”|	r”tddj|	ƒ ƒ‚|	r¤|dkr¤d	}|d	krÈt|||||||ƒ}
|
|fS d|fS )zParse ssl options.ÚsslNZssl_certfileZssl_keyfileZssl_pem_passphraseZssl_ca_certsZssl_cert_reqsÚssl_match_hostnameTZssl_crlfilec                s"   g | ]}|j d ƒrˆ | r|‘qS )Ússl_)Ú
startswith)Ú.0Úk)r   r   r   ú
<listcomp>T   s    z&_parse_ssl_options.<locals>.<listcomp>Fzmssl has not been enabled but the following ssl parameters have been set: %s. Please set `ssl=True` or remove.z, )r   r   r   Újoinr   )r   Zuse_sslÚcertfileÚkeyfileZ
passphraseÚca_certsÚ	cert_reqsÚmatch_hostnameZcrlfileZssl_kwarg_keysÚctxr   )r   r   Ú_parse_ssl_optionsF   s6    







r5   c             C   sè   | j dtjƒ}| j dtjƒ}| j dtjƒ}|dk	rB||krBtdƒ‚| j dtjƒ}| j ddƒ}| j d	ƒ}| j d
tjƒ}| j dƒ}| j dƒ}	| j dƒ}
| j dƒ}t| j dg ƒ| j ddƒƒ}t	| ƒ\}}t
||||||||||t|	ƒ|
||ƒS )zParse connection pool options.ZmaxpoolsizeZminpoolsizeZmaxidletimemsNz3minPoolSize must be smaller or equal to maxPoolSizeZconnecttimeoutmsZsocketkeepaliveTZsockettimeoutmsZwaitqueuetimeoutmsZwaitqueuemultipleÚevent_listenersÚappnameÚdriverZcompressorsZzlibcompressionlevelr   r   )r   r   ZMAX_POOL_SIZEZMIN_POOL_SIZEZMAX_IDLE_TIME_SECÚ
ValueErrorZCONNECT_TIMEOUTZWAIT_QUEUE_TIMEOUTr   r5   r	   r   )r   Zmax_pool_sizeZmin_pool_sizeZmax_idle_time_secondsÚconnect_timeoutZsocket_keepaliveÚsocket_timeoutZwait_queue_timeoutZwait_queue_multipler6   r7   r8   Zcompression_settingsÚssl_contextr(   r   r   r   Ú_parse_pool_optionsm   s:    







r=   c               @   sØ   e Zd Zd Zdd„ Zedd„ ƒZedd„ ƒZedd„ ƒZed	d
„ ƒZ	edd„ ƒZ
edd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd „ ƒZed!d"„ ƒZd#S )$ÚClientOptionsc             C   sÎ   || _ t|ƒ| _t||||ƒ| _|jdtjƒ| _|jdtj	ƒ| _
t|ƒ| _t|ƒ| _|jdƒ| _t|ƒ| _t|ƒ| _|jdƒ| _|jdtjƒ| _|jdtjƒ| _|jdtjƒ| _|jdtƒ| _|jd	ƒ| _d S )
NZlocalthresholdmsZserverselectiontimeoutmsZ
replicasetÚconnectZheartbeatfrequencymsZretrywritesZ
retryreadsÚserver_selectorÚauto_encryption_opts)Ú_ClientOptions__optionsr   Ú_ClientOptions__codec_optionsr   Ú_ClientOptions__credentialsr   r   ZLOCAL_THRESHOLD_MSÚ"_ClientOptions__local_threshold_msZSERVER_SELECTION_TIMEOUTÚ(_ClientOptions__server_selection_timeoutr=   Ú_ClientOptions__pool_optionsr    Ú_ClientOptions__read_preferenceÚ _ClientOptions__replica_set_namer%   Ú_ClientOptions__write_concernr&   Ú_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)Úselfr   r   r   r   r   r   r   Ú__init__’   s*    





zClientOptions.__init__c             C   s   | j S )z7The original options used to create this ClientOptions.)rB   )rR   r   r   r   Ú_options¬   s    zClientOptions._optionsc             C   s   | j S )z>Whether to begin discovering a MongoDB topology automatically.)rL   )rR   r   r   r   r?   ±   s    zClientOptions.connectc             C   s   | j S )z5A :class:`~bson.codec_options.CodecOptions` instance.)rC   )rR   r   r   r   Úcodec_options¶   s    zClientOptions.codec_optionsc             C   s   | j S )z;A :class:`~pymongo.auth.MongoCredentials` instance or None.)rD   )rR   r   r   r   Úcredentials»   s    zClientOptions.credentialsc             C   s   | j S )z&The local threshold for this instance.)rE   )rR   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.)rF   )rR   r   r   r   Úserver_selection_timeoutÅ   s    z&ClientOptions.server_selection_timeoutc             C   s   | j S )N)rP   )rR   r   r   r   r@   Ê   s    zClientOptions.server_selectorc             C   s   | j S )z$The monitoring frequency in seconds.)rM   )rR   r   r   r   Úheartbeat_frequencyÎ   s    z!ClientOptions.heartbeat_frequencyc             C   s   | j S )z.A :class:`~pymongo.pool.PoolOptions` instance.)rG   )rR   r   r   r   Úpool_optionsÓ   s    zClientOptions.pool_optionsc             C   s   | j S )zA read preference instance.)rH   )rR   r   r   r   r   Ø   s    zClientOptions.read_preferencec             C   s   | j S )zReplica set name or None.)rI   )rR   r   r   r   Úreplica_set_nameÝ   s    zClientOptions.replica_set_namec             C   s   | j S )z8A :class:`~pymongo.write_concern.WriteConcern` instance.)rJ   )rR   r   r   r   Úwrite_concernâ   s    zClientOptions.write_concernc             C   s   | j S )z6A :class:`~pymongo.read_concern.ReadConcern` instance.)rK   )rR   r   r   r   Úread_concernç   s    zClientOptions.read_concernc             C   s   | j S )z9If this instance should retry supported write operations.)rN   )rR   r   r   r   Úretry_writesì   s    zClientOptions.retry_writesc             C   s   | j S )z8If this instance should retry supported read operations.)rO   )rR   r   r   r   Úretry_readsñ   s    zClientOptions.retry_readsc             C   s   | j S )z:A :class:`~pymongo.encryption.AutoEncryptionOpts` or None.)rQ   )rR   r   r   r   rA   ö   s    z"ClientOptions.auto_encryption_optsN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__rS   ÚpropertyrT   r?   rU   rV   rW   rX   r@   rY   rZ   r   r[   r\   r]   r^   r_   rA   r   r   r   r   r>   Ž   s$   r>   N)$rc   Zbson.codec_optionsr   Zpymongo.authr   Zpymongo.commonr   Zpymongor   Zpymongo.compression_supportr   Zpymongo.errorsr   Zpymongo.monitoringr   Zpymongo.poolr	   Zpymongo.read_concernr
   Zpymongo.read_preferencesr   r   Zpymongo.server_selectorsr   Zpymongo.ssl_supportr   Zpymongo.write_concernr   r   r    r%   r&   r5   r=   Úobjectr>   r   r   r   r   Ú<module>   s(   
	'!