o
    "4g                     @  s   d Z ddlmZ ddlZddlZddlmZ ddlmZ	 ddl
mZmZ ddlmZmZmZ dd	lmZ ed
ZdddZdddZdS )z8
Separate connection attempts from a connection string.
    )annotationsN)shuffle   )errors)ConnDictConnMapping)	get_paramis_ip_addressget_param_def)split_attemptspsycopgparamsr   returnlist[ConnDict]c                 C  s   d}g }t | D ])}z	|t| W q ty1 } ztd|d| |}W Y d}~qd}~ww |s?|s8J tt	|t
| ddkrJt| |S )a  Split a set of connection params on the single attempts to perform.

    A connection param can perform more than one attempt more than one ``host``
    is provided.

    Also perform async resolution of the hostname into hostaddr. Because a host
    can resolve to more than one address, this can lead to yield more attempts
    too. Raise `OperationalError` if no host could be resolved.

    Because the libpq async function doesn't honour the timeout, we need to
    reimplement the repeated attempts.
    Nzfailed to resolve host %r: %shostload_balance_hostsrandom)r   extend_resolve_hostnamesOSErrorloggerdebuggeteOperationalErrorstrr   r   )r   last_excattemptsattemptex r    c/var/www/html/authentication-server/venv/lib/python3.10/site-packages/psycopg/_conninfo_attempts.pyconninfo_attempts   s    r"   r   c                   s   t  d}|r|ds|dd dkr gS t  d}|r! gS t|r.i  d|igS t  d}|s@td}|r>|jp?d}tj||tjtjd	} fd
d|D S )aD  
    Perform async DNS lookup of the hosts and return a list of connection attempts.

    If a ``host`` param is present but not ``hostname``, resolve the host
    addresses asynchronously.

    :param params: The input parameters, for instance as returned by
        `~psycopg.conninfo.conninfo_to_dict()`. The function expects at most
        a single entry for host, hostaddr because it is designed to further
        process the input of split_attempts().

    :return: A list of attempts to make (to include the case of a hostname
        resolving to more than one IP).
    r   /r      :hostaddrport5432)prototypec                   s$   g | ]}i  d |d d iqS )r&      r   r    ).0itemr   r    r!   
<listcomp>`   s   $ z&_resolve_hostnames.<locals>.<listcomp>)	r   
startswithr	   r
   compiledsocketgetaddrinfoIPPROTO_TCPSOCK_STREAM)r   r   r&   r'   port_defansr    r.   r!   r   :   s    


r   )r   r   r   r   )r   r   r   r   )__doc__
__future__r   r2   loggingr   r    r   r   abcr   r   _conninfo_utilsr   r	   r
   r   	getLoggerr   r"   r   r    r    r    r!   <module>   s   

!