U
    ~fhF                  
   @  s  U d Z ddlmZ ddlZddlZddlZddlZddlmZ ddl	m
Z
mZmZmZ ddlZddlmZ ddlmZmZmZmZmZmZ e
rd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ediZ$de%d< ej&dr e' Z(e(e(e) e* de$d< nejdkrTe' e' e) e+ d de$d< nejdkre' d,e' e* fe) d,e- dd de$d< nej&dre. d \Z(Z/Z0e(e(e0e/de$d< nPe1e' e* e2 Z3e' d,dd e3dd  D e) e3d  de$d< e4 &d!rnd,e4 d",e5e6ej7d#d",e5e6ej8 fe$d$< npej&drd,e4 d",e5e6ej8d%d,e' e* f fe$d$< n$d,e4 d",e5e6ej8fe$d$< d&Z9d'Z:d(Z;d)Z<d*d+d,d-Z=d.d+d/d0Z>d.d+d1d2Z?d.d+d3d4Z@d.d+d5d6ZAd.d+d7d8ZBd9d:d;d<d=ZCdd+d>d?ZDd@ZEdAdBdCdDdEZFdFGdG G dHdI dIZHdS )JzPool options for AsyncMongoClient/MongoClient.

.. seealso:: This module is compatible with both the synchronous and asynchronous PyMongo APIs.
    )annotationsN)Path)TYPE_CHECKINGAnyMutableMappingOptional)__version__)MAX_CONNECTINGMAX_IDLE_TIME_SECMAX_POOL_SIZEMIN_POOL_SIZEWAIT_QUEUE_TIMEOUThas_c)MongoCredential)CompressionSettings)
DriverInfo)_EventListeners)
SSLContext)	ServerApidriverZPyMongo)nameversiondict[str, Any]	_METADATAlinux)typer   architecturer   osdarwinwin32 -      javac                 C  s   g | ]}|r|qS  r&   ).0partr&   r&   8/tmp/pip-unpacked-wheel-36gvocj8/pymongo/pool_options.py
<listcomp>a   s      r*      PyPy.z(Python %s)platformz(%s)z/.dockerenvZKUBERNETES_SERVICE_HOSTZdockerZ
kuberneteszdict[str, str]returnc                  C  s.   i } t t rt| d< ttr*t| d< | S )zReturns the runtime and orchestrator of a container.
    If neither value is present, the metadata client.env.container field will be omitted.ZruntimeZorchestrator)r   DOCKER_ENV_PATHexistsRUNTIME_NAME_DOCKERr   getenvENV_VAR_K8SORCHESTRATOR_NAME_K8S)	containerr&   r&   r)   get_container_env_info   s    
r8   boolc                  C  s*   t drdS t d} | r&| dS dS )NZAWS_LAMBDA_RUNTIME_APITZAWS_EXECUTION_ENVZAWS_Lambda_F)r   r4   
startswith)envr&   r&   r)   
_is_lambda   s    


r<   c                   C  s   t tdS )NZFUNCTIONS_WORKER_RUNTIMEr9   r   r4   r&   r&   r&   r)   _is_azure_func   s    r>   c                   C  s   t tdptdS )NZ	K_SERVICEZFUNCTION_NAMEr=   r&   r&   r&   r)   _is_gcp_func   s    r?   c                   C  s   t tdS )NZVERCELr=   r&   r&   r&   r)   
_is_vercel   s    r@   c                   C  s   t  pt pt pt S N)r<   r>   r?   r@   r&   r&   r&   r)   _is_faas   s    rB   strOptional[int])keyr0   c                 C  s8   t | }|sdS z
t|W S  tk
r2   Y dS X dS )zMLike os.getenv but returns an int, or None if the value is missing/malformed.N)r   r4   int
ValueError)rE   valr&   r&   r)   _getenv_int   s    

rI   c                  C  s  i } t  }|r|| d< t t t t fddkr8| S t rvd| d< td}|r\|| d< td}|d k	rt|| d	< nt rd
| d< n~t rd| d< td}|r|| d< td}|d k	r|| d	< td}|d k	r|| d< n(t rd| d< td}|r|| d< | S )Nr7   Tr"   z
aws.lambdar   Z
AWS_REGIONregionZAWS_LAMBDA_FUNCTION_MEMORY_SIZE	memory_mbz
azure.funczgcp.funcZFUNCTION_REGIONZFUNCTION_MEMORY_MBZFUNCTION_TIMEOUT_SECtimeout_secZvercelZVERCEL_REGION)	r8   r<   r>   r?   r@   countr   r4   rI   )r;   r7   rJ   rK   rL   r&   r&   r)   _metadata_env   sB    





rN   i   zMutableMapping[str, Any]None)metadatar0   c           	      C  s  t t| tkrdS | di d}|r8d|i| d< t t| tkrNdS | di d}|rpd|i| d< t t| tkrdS | dd t t| }|tkrdS |t }| dd}|r|d|  }|r|| d< n| dd t t| }|tkrdS |t }| di }|r|d	d|  }t |t td d	 kr^|| d d	< ntd d	 | d d	< t t| }|tkrdS |t }|dd|  }t |t td d kr|| d d< ntd d | d d< dS )
zPerform metadata truncation.Nr;   r   r   r   r.    r   r   )lenbsonencode_MAX_METADATA_SIZEgetpopr   )	rP   env_nameZos_typeZencoded_sizeZoverflowplatr   Zdriver_versionZdriver_namer&   r&   r)   _truncate_metadata   sR    


rZ   Zfooidnac                   @  s  e Zd ZdZdZeeeddedddddde	dddddfddddddd	d
dddddd
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d0d1Zeddd2d3Zeddd4d5Zeddd6d7Zeddd8d9Zeddd:d;Zeddd<d=ZdS )>PoolOptionsak  Read only connection pool options for an AsyncMongoClient/MongoClient.

    Should not be instantiated directly by application developers. Access
    a client's pool options via
    :attr:`~pymongo.client_options.ClientOptions.pool_options` instead::

      pool_opts = client.options.pool_options
      pool_opts.max_pool_size
      pool_opts.min_pool_size

    )Z__max_pool_sizeZ__min_pool_sizeZ__max_idle_time_secondsZ__connect_timeoutZ__socket_timeoutZ__wait_queue_timeoutZ__ssl_contextZ__tls_allow_invalid_hostnamesZ__event_listenersZ	__appnameZ__driverZ
__metadataZ__compression_settingsZ__max_connectingZ__pause_enabledZ__server_apiZ__load_balancedZ__credentialsNFTrF   rD   zOptional[float]zOptional[SSLContext]r9   zOptional[_EventListeners]zOptional[str]zOptional[DriverInfo]zOptional[CompressionSettings]zOptional[ServerApi]zOptional[bool]zOptional[MongoCredential])max_pool_sizemin_pool_sizemax_idle_time_secondsconnect_timeoutsocket_timeoutwait_queue_timeoutssl_contexttls_allow_invalid_hostnamesevent_listenersappnamer   compression_settingsmax_connectingpause_enabled
server_apiload_balancedcredentialsis_syncc                 C  sh  || _ || _|| _|| _|| _|| _|| _|| _|	| _|
| _	|| _
|| _|| _|| _|| _|| _|| _tt| _|
rd|
i| jd< t rd| jd d d| jd d< |sd| jd d d| jd d< |rD|jrd| jd d |j| jd d< |jr$dtd d |j| jd d< |jrDdtd |j| jd< t }|rZ|| jd	< t| j d S )
Nr   Zapplicationz{}|{}r   casyncr   r.   r;   )_PoolOptions__max_pool_size_PoolOptions__min_pool_size#_PoolOptions__max_idle_time_seconds_PoolOptions__connect_timeout_PoolOptions__socket_timeout _PoolOptions__wait_queue_timeout_PoolOptions__ssl_context)_PoolOptions__tls_allow_invalid_hostnames_PoolOptions__event_listeners_PoolOptions__appname_PoolOptions__driver"_PoolOptions__compression_settings_PoolOptions__max_connecting_PoolOptions__pause_enabled_PoolOptions__server_api_PoolOptions__load_balanced_PoolOptions__credentialscopydeepcopyr   _PoolOptions__metadatar   formatr   r   r.   rN   rZ   )selfr]   r^   r_   r`   ra   rb   rc   rd   re   rf   r   rg   rh   ri   rj   rk   rl   rm   r;   r&   r&   r)   __init__<  s^    


zPoolOptions.__init__r/   c                 C  s   | j S )z;A :class:`~pymongo.auth.MongoCredentials` instance or None.)r   r   r&   r&   r)   _credentials  s    zPoolOptions._credentialsr   c                 C  s   i }| j tkr| j |d< | jtkr,| j|d< | jtkrR| jdk	sDt| jd |d< | jtkrx| jdk	sjt| jd |d< | j	t
kr| j	|d< |S )zqThe non-default options this pool was created with.

        Added for CMAP's :class:`PoolCreatedEvent`.
        ZmaxPoolSizeZminPoolSizeNi  ZmaxIdleTimeMSZwaitQueueTimeoutMSZmaxConnecting)rp   r   rq   r   rr   r
   AssertionErrorru   r   r|   r	   )r   optsr&   r&   r)   non_default_options  s    







zPoolOptions.non_default_optionsfloatc                 C  s   | j S )aQ  The maximum allowable number of concurrent connections to each
        connected server. Requests to a server will block if there are
        `maxPoolSize` outstanding connections to the requested server.
        Defaults to 100. Cannot be 0.

        When a server's pool has reached `max_pool_size`, operations for that
        server block waiting for a socket to be returned to the pool. If
        ``waitQueueTimeoutMS`` is set, a blocked operation will raise
        :exc:`~pymongo.errors.ConnectionFailure` after a timeout.
        By default ``waitQueueTimeoutMS`` is not set.
        )rp   r   r&   r&   r)   r]     s    zPoolOptions.max_pool_sizec                 C  s   | j S )zThe minimum required number of concurrent connections that the pool
        will maintain to each connected server. Default is 0.
        )rq   r   r&   r&   r)   r^     s    zPoolOptions.min_pool_sizec                 C  s   | j S )zgThe maximum number of concurrent connection creation attempts per
        pool. Defaults to 2.
        )r|   r   r&   r&   r)   rh     s    zPoolOptions.max_connectingc                 C  s   | j S rA   )r}   r   r&   r&   r)   ri     s    zPoolOptions.pause_enabledc                 C  s   | j S )zThe maximum number of seconds that a connection can remain
        idle in the pool before being removed and replaced. Defaults to
        `None` (no limit).
        )rr   r   r&   r&   r)   r_     s    z!PoolOptions.max_idle_time_secondsc                 C  s   | j S )z>How long a connection can take to be opened before timing out.)rs   r   r&   r&   r)   r`     s    zPoolOptions.connect_timeoutc                 C  s   | j S )zBHow long a send or receive on a socket can take before timing out.)rt   r   r&   r&   r)   ra     s    zPoolOptions.socket_timeoutc                 C  s   | j S )zhHow long a thread will wait for a socket from the pool if the pool
        has no free sockets.
        )ru   r   r&   r&   r)   rb     s    zPoolOptions.wait_queue_timeoutc                 C  s   | j S )zAn SSLContext instance or None.)rv   r   r&   r&   r)   _ssl_context  s    zPoolOptions._ssl_contextc                 C  s   | j S )z If True skip ssl.match_hostname.)rw   r   r&   r&   r)   rd     s    z'PoolOptions.tls_allow_invalid_hostnamesc                 C  s   | j S )z2An instance of pymongo.monitoring._EventListeners.)rx   r   r&   r&   r)   _event_listeners  s    zPoolOptions._event_listenersc                 C  s   | j S )zAThe application name, for sending with hello in server handshake.)ry   r   r&   r&   r)   rf     s    zPoolOptions.appnamec                 C  s   | j S )z=Driver name and version, for sending with hello in handshake.)rz   r   r&   r&   r)   r     s    zPoolOptions.driverc                 C  s   | j S rA   )r{   r   r&   r&   r)   _compression_settings  s    z!PoolOptions._compression_settingsc                 C  s
   | j  S )zCA dict of metadata about the application, driver, os, and platform.)r   r   r   r&   r&   r)   rP     s    zPoolOptions.metadatac                 C  s   | j S )z'A pymongo.server_api.ServerApi or None.)r~   r   r&   r&   r)   rj     s    zPoolOptions.server_apic                 C  s   | j S )z6True if this Pool is configured in load balanced mode.)r   r   r&   r&   r)   rk     s    zPoolOptions.load_balanced)__name__
__module____qualname____doc__	__slots__r   r   r
   r   r	   r   propertyr   r   r]   r^   rh   ri   r_   r`   ra   rb   r   rd   r   rf   r   r   rP   rj   rk   r&   r&   r&   r)   r\     sv   2Qr\   )Ir   
__future__r   r   r   r.   syspathlibr   typingr   r   r   r   rS   Zpymongor   Zpymongo.commonr	   r
   r   r   r   r   Zpymongo.auth_sharedr   Zpymongo.compression_supportr   Zpymongo.driver_infor   Zpymongo.monitoringr   Zpymongo.pyopenssl_contextr   Zpymongo.server_apir   r   __annotations__r:   system_namemachinereleasemac_verjoin	win32_verjava_ver_verZ_archsystem_aliasr   Z_aliasedpython_implementationmaprC   pypy_version_infoversion_infor1   r5   r3   r6   r8   r<   r>   r?   r@   rB   rI   rN   rU   rZ   rT   r\   r&   r&   r&   r)   <module>   s    	



	%;
