o
    DDi\                     @  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 dd
lmZ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)d#d$ZdS )*z5
Internal utilities to manipulate connection strings
    )annotationsN)	lru_cache)
ip_address)	dataclass   )errors)pq)ConnDictConnMapping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    P/var/www/Datamplify/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   W   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,   b   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_addresss   s   
rH   r	   c                 C  s   t t| dS )z7Return `true` if `gssencmode` was specified explicitly.
gssencmode)rF   r   r   r   r   r   gssapi_requested}   s   rJ   )r   r
   r   r   )r   r
   r*   r   r   r+   )r4   r   r;   r<   r   r=   )rE   r   r   rF   )r   r	   r   rF   )r9   
__future__r   r-   	functoolsr   	ipaddressr   dataclassesr   r>   r   r   r   abcr	   r
   r)   r   r3   r,   rH   rJ   r   r   r   r   <module>   s"    

0
	