o
    'hT                     @  s   d Z ddlm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 er0ddlmZ dZdddZdddZdddZdZG dd dZdS )zASupport for resolving hosts and options from mongodb+srv:// URIs.    )annotationsN)TYPE_CHECKINGAnyOptionalUnion)CONNECT_TIMEOUT)ConfigurationErrorresolverTreturnboolc                  C  s$   zdd l } W dS  ty   Y dS w )Nr   TF)dnsImportError)r    r   \/var/www/html/olx_land/venv/lib/python3.10/site-packages/pymongo/synchronous/srv_resolver.py_have_dnspython   s   r   textUnion[str, bytes]strc                 C  s   t | tr	|  S | S )N)
isinstancebytesdecode)r   r   r   r   maybe_decode*   s   
r   argsr   kwargsresolver.Answerc                  O  sh   t rddlm} t|dr|j| i |S |j| i |S ddlm} t|dr0|j| i |S td)Nr   r	   resolve)asyncresolverzWUpgrade to dnspython version >= 2.0 to use MongoClient with mongodb+srv:// connections.)_IS_SYNCr   r
   hasattrr   queryr   r   )r   r   r
   r   r   r   r   _resolve1   s   

r!   zdInvalid URI host: %s is not a valid hostname for 'mongodb+srv://'. Did you mean to use 'mongodb://'?c                   @  sL   e Zd Z	ddd	d
Zd ddZd!ddZd"ddZd#ddZd$ddZdS )%_SrvResolverr   fqdnr   connect_timeoutOptional[float]srv_service_namesrv_max_hostsintc                 C  s   || _ || _|p	t| _|pd| _zt| ttd  t	y$   Y nw z| j 
d}t|dkr8|dd  n|| _W n tyK   tt|f d w t| j| _t|| _d S )Nr   )zan IP address.      )_SrvResolver__fqdn_SrvResolver__srvr   _SrvResolver__connect_timeout_SrvResolver__srv_max_hosts	ipaddress
ip_addressr   _INVALID_HOST_MSG
ValueErrorsplitlen_SrvResolver__plist	Exception_SrvResolver__slennparts)selfr#   r$   r&   r'   
split_fqdnr   r   r   __init__L   s$   


"z_SrvResolver.__init__r   Optional[str]c              
   C  s   ddl m} zt| jd| jd}W n  |j|jfy   Y d S  ty1 } ztt	|d d }~ww t
|dkr<tdddd	 |D d
S )Nr   r	   TXTlifetimer+   z Only one TXT record is supported   &c                 S  s   g | ]}d  |jqS )    )joinstrings.0resr   r   r   
<listcomp>q   s    z,_SrvResolver.get_options.<locals>.<listcomp>zutf-8)r   r
   r!   r,   r.   NoAnswerNXDOMAINr7   r   r   r5   rC   r   )r:   r
   resultsexcr   r   r   get_optionse   s   z_SrvResolver.get_optionsencapsulate_errorsr   r   c              
   C  sT   zt d| j d | j d| jd}W |S  ty) } z
|s tt|d d }~ww )N_z._tcp.SRVr?   )r!   r-   r,   r.   r7   r   r   )r:   rN   rK   rL   r   r   r   _resolve_uris   s   	z_SrvResolver._resolve_uri-tuple[resolver.Answer, list[tuple[str, Any]]]c              	   C  s   |  |}dd |D }|D ]G}|d  }| j|kr$| jdk r$tdz|ddd  | j d  }W n tyF   td|d  d w | j|krUtd|d  q| j	ret
|t| j	t|}||fS )	Nc                 S  s$   g | ]}t |jjd d|jfqS )T)omit_final_dot)r   targetto_textportrE   r   r   r   rH      s    z<_SrvResolver._get_srv_response_and_hosts.<locals>.<listcomp>r      z=Invalid SRV host: return address is identical to SRV hostnamer)   r+   zInvalid SRV host: )rQ   lowerr,   r9   r   r4   r8   r7   r6   r/   randomsampleminr5   )r:   rN   rK   nodesnodesrv_hostnlistr   r   r   _get_srv_response_and_hosts   s*   
"
z(_SrvResolver._get_srv_response_and_hostslist[tuple[str, Any]]c                 C  s   |  d\}}|S )NT)r`   )r:   rO   r\   r   r   r   	get_hosts   s   z_SrvResolver.get_hosts!tuple[list[tuple[str, Any]], int]c                 C  s*   |  d\}}|j}|r|jnd}||fS )NFr   )r`   rrsetttl)r:   rK   r\   rd   re   r   r   r   get_hosts_and_min_ttl   s   z"_SrvResolver.get_hosts_and_min_ttlN)r   )r#   r   r$   r%   r&   r   r'   r(   )r   r=   )rN   r   r   r   )rN   r   r   rR   )r   ra   )r   rc   )	__name__
__module____qualname__r<   rM   rQ   r`   rb   rf   r   r   r   r   r"   K   s    



r"   )r   r   )r   r   r   r   )r   r   r   r   r   r   )__doc__
__future__r   r0   rY   typingr   r   r   r   pymongo.commonr   pymongo.errorsr   r   r
   r   r   r   r!   r2   r"   r   r   r   r   <module>   s    


