U
    d                     @   s   d Z ddlZddlZddlZddl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 ddlmZmZ G dd	 d	Zeeef ed
ddZG dd dee ZdS )z2Helpers for the 'hello' and legacy hello commands.    N)AnyGenericListMappingOptionalSetTuple)ObjectId)common)SERVER_TYPE)ClusterTime_DocumentTypec                   @   s    e Zd ZdZdZdZdZdZdS )HelloCompatZhelloZismasterZisWritablePrimaryz
not masterN)__name__
__module____qualname__ZCMDZ
LEGACY_CMDPRIMARYLEGACY_PRIMARYZLEGACY_ERROR r   r   1/tmp/pip-unpacked-wheel-oblwsawz/pymongo/hello.pyr      s
   r   )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rtjS tjS n|  dd	krt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RSOtherr   r   	RSPrimaryr   RSSecondaryZ	RSArbiterMongos
Standalone)r   r   r   r   _get_server_type$   s*    






r$   c                   @   sj  e Zd ZdZdZd=eeddddZeedd	d
Z	ee
dddZeeeee
f  dddZeeeef dddZeeeee
f  dddZeee dddZee
dddZee
dddZee
dddZee
dddZee
dddZeee
 ddd Zeee dd!d"Zeee dd#d$Zeee
 dd%d&Z eedd'd(Z!eedd)d*Z"eeeee
f  dd+d,Z#eee$j$ dd-d.Z%eee&e  dd/d0Z'ee&e dd1d2Z(eeeeef  dd3d4Z)eeeeef  dd5d6Z*eedd7d8Z+eee dd9d:Z,eedd;d<Z-dS )>HellozHParse a hello response from the server.

    .. versionadded:: 3.12
    )_doc_server_type_is_writable_is_readable
_awaitableFN)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__H   s    
zHello.__init__)r   c                 C   s   t  | jS )zUThe complete hello command response document.

        .. versionadded:: 3.4
        )copyr&   r.   r   r   r   documentU   s    zHello.documentc                 C   s   | j S r,   )r'   r1   r   r   r   r-   ]   s    zHello.server_typec                 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   r1   r   r   r   	all_hostsa   s    zHello.all_hostsc                 C   s   | j di S )z&Replica set member tags or empty dict.tagsr&   r   r1   r   r   r   r:   o   s    z
Hello.tagsc                 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_noder1   r   r   r   r<   t   s    zHello.primaryc                 C   s   | j dS )zReplica set name or None.r   r;   r1   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_SIZEr1   r   r   r   max_bson_size   s    zHello.max_bson_sizec                 C   s   | j dd| j S )NZmaxMessageSizeBytes   )r&   r   r>   r1   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_SIZEr1   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_VERSIONr1   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_VERSIONr1   r   r   r   max_wire_version   s    zHello.max_wire_versionc                 C   s   | j dS )NZ
setVersionr;   r1   r   r   r   set_version   s    zHello.set_versionc                 C   s   | j dS )NZ
electionIdr;   r1   r   r   r   election_id   s    zHello.election_idc                 C   s   | j dS )Nz$clusterTimer;   r1   r   r   r   cluster_time   s    zHello.cluster_timec                 C   s   | j dS )NZlogicalSessionTimeoutMinutesr;   r1   r   r   r   logical_session_timeout_minutes   s    z%Hello.logical_session_timeout_minutesc                 C   s   | j S r,   )r(   r1   r   r   r   is_writable   s    zHello.is_writablec                 C   s   | j S r,   )r)   r1   r   r   r   is_readable   s    zHello.is_readablec                 C   s   | j d}|rt|S d S )Nme)r&   r   r
   r6   )r.   rJ   r   r   r   rJ      s    
zHello.mec                 C   s   | j di dS )NZ	lastWriteZlastWriteDater;   r1   r   r   r   last_write_date   s    zHello.last_write_datec                 C   s   | j dS )Ncompressionr;   r1   r   r   r   compressors   s    zHello.compressorsc                 C   s   | j dg S )zSupported authentication mechanisms for the current user.

        For example::

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

        ZsaslSupportedMechsr;   r1   r   r   r   sasl_supported_mechs   s    
zHello.sasl_supported_mechsc                 C   s   | j dS )z"The speculativeAuthenticate field.ZspeculativeAuthenticater;   r1   r   r   r   speculative_authenticate   s    zHello.speculative_authenticatec                 C   s   | j dS )NZtopologyVersionr;   r1   r   r   r   topology_version   s    zHello.topology_versionc                 C   s   | j S r,   )r*   r1   r   r   r   r+      s    zHello.awaitablec                 C   s   | j dS )Nr   r;   r1   r   r   r   
service_id   s    zHello.service_idc                 C   s   | j ddS )NZhelloOkFr;   r1   r   r   r   hello_ok   s    zHello.hello_ok)F).r   r   r   __doc__	__slots__r   boolr/   propertyr2   intr-   r   r   strr9   r   r   r:   r   r<   r=   r>   r@   rA   rB   rC   rD   r	   rE   r   rF   rG   rH   rI   rJ   datetimerK   r   rM   rN   rO   rP   r+   rQ   rR   r   r   r   r   r%   @   sn   r%   )rS   r0   rY   r7   typingr   r   r   r   r   r   r   Zbson.objectidr	   Zpymongor
   Zpymongo.server_typer   Zpymongo.typingsr   r   r   rX   rW   r$   r%   r   r   r   r   <module>   s   $