U
    Û~fh8  ã                   @  sª   d Z ddlmZ ddlZddlZddlZddlmZmZ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
dœdd„ZG dd„ dƒZG dd„ dee ƒZdS )z2Helpers for the 'hello' and legacy hello commands.é    )ÚannotationsN)ÚAnyÚGenericÚMappingÚOptional)ÚObjectId)Úcommon)ÚSERVER_TYPE)ÚClusterTimeÚ_DocumentTypeúMapping[str, Any]Úint)ÚdocÚreturnc                 C  s´   |   d¡stjS |   d¡r tjS |   d¡r0tjS |   d¡r–|   d¡rJtjS |   tj¡r\tjS |   tj	¡rntjS |   d¡r~tj
S |   d¡rŽtjS tjS n|   d¡d	krªtjS tjS d
S )z0Determine the server type from a hello response.ÚokÚ	serviceIdZisreplicasetÚsetNameÚhiddenZ	secondaryZarbiterOnlyÚmsgZisdbgridN)Úgetr	   ÚUnknownÚLoadBalancerZRSGhostZRSOtherÚHelloCompatÚPRIMARYÚ	RSPrimaryÚLEGACY_PRIMARYÚRSSecondaryZ	RSArbiterÚMongosÚ
Standalone)r   © r   ú1/tmp/pip-unpacked-wheel-36gvocj8/pymongo/hello.pyÚ_get_server_type   s*    






r!   c                   @  s    e Zd ZdZdZdZdZdZdS )r   ZhelloZismasterZisWritablePrimaryz
not masterN)Ú__name__Ú
__module__Ú__qualname__ZCMDZ
LEGACY_CMDr   r   ZLEGACY_ERRORr   r   r   r    r   9   s
   r   c                   @  s  e Zd ZdZdZdNd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dd
œd3d4„ƒZedd
œd5d6„ƒZed7d
œd8d9„ƒZed:d
œd;d<„ƒZed=d
œd>d?„ƒZed@d
œdAdB„ƒZed@d
œdCdD„ƒZedd
œdEdF„ƒZed)d
œdGdH„ƒZedd
œdIdJ„ƒZ ed&d
œdKdL„ƒZ!dMS )OÚHellozHParse a hello response from the server.

    .. versionadded:: 3.12
    )Ú_docÚ_server_typeÚ_is_writableÚ_is_readableÚ
_awaitableFr   ÚboolÚNone)r   Ú	awaitabler   c                 C  sJ   t |ƒ| _|| _| jtjtjtjtjfk| _| j	tj
kp<| j| _|| _d S ©N)r!   r'   r&   r	   r   r   r   r   r(   Úserver_typer   r)   r*   )Úselfr   r-   r   r   r    Ú__init__I   s    
üzHello.__init__)r   c                 C  s   t   | j¡S )zUThe complete hello command response document.

        .. versionadded:: 3.4
        )Úcopyr&   ©r0   r   r   r    ÚdocumentV   s    zHello.documentr   c                 C  s   | j S r.   )r'   r3   r   r   r    r/   ^   s    zHello.server_typezset[tuple[str, int]]c                 C  s8   t ttjt | j dg ¡| j dg ¡| j dg ¡¡ƒƒS )z;List of hosts, passives, and arbiters known to this server.ÚhostsZpassivesZarbiters)ÚsetÚmapr   Ú
clean_nodeÚ	itertoolsÚchainr&   r   r3   r   r   r    Ú	all_hostsb   s    ýþÿzHello.all_hostsr   c                 C  s   | j  di ¡S )z&Replica set member tags or empty dict.Útags©r&   r   r3   r   r   r    r<   p   s    z
Hello.tagszOptional[tuple[str, int]]c                 C  s$   | j  d¡rt | j d ¡S dS dS )z8This server's opinion about who the primary is, or None.ÚprimaryN)r&   r   r   Zpartition_noder3   r   r   r    r>   u   s    zHello.primaryzOptional[str]c                 C  s   | j  d¡S )zReplica set name or None.r   r=   r3   r   r   r    Úreplica_set_name}   s    zHello.replica_set_namec                 C  s   | j  dtj¡S )NZmaxBsonObjectSize)r&   r   r   ZMAX_BSON_SIZEr3   r   r   r    Úmax_bson_size‚   s    zHello.max_bson_sizec                 C  s   | j  dd| j ¡S )NZmaxMessageSizeBytesé   )r&   r   r@   r3   r   r   r    Úmax_message_size†   s    zHello.max_message_sizec                 C  s   | j  dtj¡S )NZmaxWriteBatchSize)r&   r   r   ZMAX_WRITE_BATCH_SIZEr3   r   r   r    Úmax_write_batch_sizeŠ   s    zHello.max_write_batch_sizec                 C  s   | j  dtj¡S )NZminWireVersion)r&   r   r   ZMIN_WIRE_VERSIONr3   r   r   r    Úmin_wire_versionŽ   s    zHello.min_wire_versionc                 C  s   | j  dtj¡S )NZmaxWireVersion)r&   r   r   ZMAX_WIRE_VERSIONr3   r   r   r    Úmax_wire_version’   s    zHello.max_wire_versionzOptional[int]c                 C  s   | j  d¡S )NZ
setVersionr=   r3   r   r   r    Úset_version–   s    zHello.set_versionzOptional[ObjectId]c                 C  s   | j  d¡S )NZ
electionIdr=   r3   r   r   r    Úelection_idš   s    zHello.election_idzOptional[ClusterTime]c                 C  s   | j  d¡S )Nz$clusterTimer=   r3   r   r   r    Úcluster_timež   s    zHello.cluster_timec                 C  s   | j  d¡S )NZlogicalSessionTimeoutMinutesr=   r3   r   r   r    Úlogical_session_timeout_minutes¢   s    z%Hello.logical_session_timeout_minutesc                 C  s   | j S r.   )r(   r3   r   r   r    Úis_writable¦   s    zHello.is_writablec                 C  s   | j S r.   )r)   r3   r   r   r    Úis_readableª   s    zHello.is_readablec                 C  s   | j  d¡}|rt |¡S d S )NÚme)r&   r   r   r8   )r0   rL   r   r   r    rL   ®   s    
zHello.mezOptional[datetime.datetime]c                 C  s   | j  di ¡ d¡S )NZ	lastWriteZlastWriteDater=   r3   r   r   r    Úlast_write_dateµ   s    zHello.last_write_datezOptional[list[str]]c                 C  s   | j  d¡S )NÚcompressionr=   r3   r   r   r    Úcompressors¹   s    zHello.compressorsz	list[str]c                 C  s   | j  dg ¡S )z³Supported authentication mechanisms for the current user.

        For example::

            >>> hello.sasl_supported_mechs
            ["SCRAM-SHA-1", "SCRAM-SHA-256"]

        ZsaslSupportedMechsr=   r3   r   r   r    Úsasl_supported_mechs½   s    
zHello.sasl_supported_mechszOptional[Mapping[str, Any]]c                 C  s   | j  d¡S )z"The speculativeAuthenticate field.ZspeculativeAuthenticater=   r3   r   r   r    Úspeculative_authenticateÉ   s    zHello.speculative_authenticatec                 C  s   | j  d¡S )NZtopologyVersionr=   r3   r   r   r    Útopology_versionÎ   s    zHello.topology_versionc                 C  s   | j S r.   )r*   r3   r   r   r    r-   Ò   s    zHello.awaitablec                 C  s   | j  d¡S )Nr   r=   r3   r   r   r    Ú
service_idÖ   s    zHello.service_idc                 C  s   | j  dd¡S )NZhelloOkFr=   r3   r   r   r    Úhello_okÚ   s    zHello.hello_okc                 C  s   | j  d¡S )NZconnectionIdr=   r3   r   r   r    Úconnection_idÞ   s    zHello.connection_idN)F)"r"   r#   r$   Ú__doc__Ú	__slots__r1   Úpropertyr4   r/   r;   r<   r>   r?   r@   rB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rO   rP   rQ   rR   r-   rS   rT   rU   r   r   r   r    r%   A   sr   r%   )rV   Ú
__future__r   r2   Údatetimer9   Útypingr   r   r   r   Zbson.objectidr   Zpymongor   Zpymongo.server_typer	   Zpymongo.typingsr
   r   r!   r   r%   r   r   r   r    Ú<module>   s   