U
    ڲg                     @  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ddZddddddZe	G dd dZi fddddddZedddddZdS ) z5
Internal utilities to manipulate connection strings
    )annotationsN)	lru_cache)
ip_address)	dataclass   )pq)ConnDictConnMapping)errorsr	   zlist[ConnDict])paramsreturnc           	        s0  ddd fdd}|d}|d}|d}|rd|rdt |t |krdtd	t | d
t | dtt |t |}dt |  k r|krn n td	t | dt | d|dkr gS t |dkr||9 }g }t|D ]H} }|r|| |d< |r|| |d< |r || |d< || q|S )zV
    Split connection parameters with a sequence of hosts into separate attempts.
    strz	list[str])keyr   c                   s   t  | }|r|dS g S )N,)	get_paramsplit)r   valr    ;/tmp/pip-unpacked-wheel-b_ea6rx_/psycopg/_conninfo_utils.py	split_val   s    
z!split_attempts.<locals>.split_valhostZhostaddrportzcould not match z host names with z hostaddr valuesr   z port numbers to z hosts)leneZOperationalErrormaxrangeappend)	r   r   hostsZ	hostaddrsZportsZnhostsrviattemptr   r   r   split_attempts   s8    r"   r   
str | None)r   namer   c                 C  sB   || krt | | S t|}|s$dS tj|j}|dk	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$   Z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   keywordr)   r#   compiledN)__name__
__module____qualname____doc____annotations__r   r   r   r   r+   Y   s   
r+   zdict[str, ParamDef]zParamDef | None)r,   _cacher   c                 C  sd   |sZt j }|D ]F}t|j |jr0|j nd|jdk	rF|j ndd}|||j< q|| S )z?
    Return the ParamDef of a connection string parameter.
     N)r,   r)   r-   )	r   ZConninfoZget_defaultsr+   r,   decoder)   r-   r(   )r,   r3   ZdefsdZcdr   r   r   r%   d   s    
r%   bool)sr   c                 C  s(   zt |  W n tk
r"   Y dS X dS )z7Return True if the string represent a valid ip address.FT)r   
ValueError)r8   r   r   r   is_ip_addressu   s
    r:   )r1   
__future__r   r&   	functoolsr   	ipaddressr   Zdataclassesr   r4   r   abcr   r	   r
   r   r"   r   r+   r%   r:   r   r   r   r   <module>   s   0
