o
    "4g                     @  s   d Z ddlmZ ddl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mZ dd
l
mZ d"ddZd#ddZe	G dd dZi fd$ddZed%d d!ZdS )&z5
Internal utilities to manipulate connection strings
    )annotationsN)	lru_cache)
ip_address)	dataclass   )pq)ConnDictConnMapping)errorsparamsr	   returnlist[ConnDict]c           	        s*  d fdd}|d}|d}|d	}|r/|r/t |t |kr/td
t | dt | dtt |t |}dt |  k rD|krVn ntd
t | dt | d|dkr_i  gS t |dkri||9 }g }t|D ]#}i  }|r}|| |d< |r|| |d< |r|| |d	< || qo|S )zV
    Split connection parameters with a sequence of hosts into separate attempts.
    keystrr   	list[str]c                   s   t  | }|r|dS g S )N,)	get_paramsplit)r   valr    `/var/www/html/authentication-server/venv/lib/python3.10/site-packages/psycopg/_conninfo_utils.py	split_val   s   
z!split_attempts.<locals>.split_valhosthostaddrportzcould not match z host names with z hostaddr valuesr   z port numbers to z hostsN)r   r   r   r   )leneOperationalErrormaxrangeappend)	r   r   hosts	hostaddrsportsnhostsrviattemptr   r   r   split_attempts   s<   
r)   namer   
str | Nonec                 C  sB   || v r
t | | S t|}|sdS tj|j}|dur|S dS )zi
    Return a value from a connection string.

    The value may be also specified in a PG* env var.
    N)r   get_param_defosenvirongetenvvar)r   r*   paramdefenvr   r   r   r   C   s   r   c                   @  s*   e Zd ZU dZded< ded< ded< dS )ParamDefzG
    Information about defaults and env vars for connection params
    r   keywordr0   r+   compiledN)__name__
__module____qualname____doc____annotations__r   r   r   r   r3   Y   s
   
 r3   r4   _cachedict[str, ParamDef]ParamDef | Nonec                 C  sd   |s-t j }|D ]#}t|j |jr|j nd|jdur#|j ndd}|||j< q	|| S )z?
    Return the ParamDef of a connection string parameter.
     N)r4   r0   r5   )	r   Conninfoget_defaultsr3   r4   decoder0   r5   r/   )r4   r;   defsdcdr   r   r   r,   d   s   

r,   sboolc                 C  s$   zt |  W dS  ty   Y dS w )z7Return True if the string represent a valid ip address.FT)r   
ValueError)rE   r   r   r   is_ip_addressu   s   
rH   )r   r	   r   r   )r   r	   r*   r   r   r+   )r4   r   r;   r<   r   r=   )rE   r   r   rF   )r9   
__future__r   r-   	functoolsr   	ipaddressr   dataclassesr   r>   r   abcr   r	   r
   r   r)   r   r3   r,   rH   r   r   r   r   <module>   s     

0
