
    (ph                        S r SSKJr  SSKrSSKJr  SSKJr  SSKJ	r	  SSK
Jr  SS	KJrJr  SS
K
Jr  SS jrSS jr\	 " S S5      5       r0 4SS jjr\SS j5       rg)z5
Internal utilities to manipulate connection strings
    )annotationsN)	lru_cache)
ip_address)	dataclass   )pq)ConnDictConnMapping)errorsc                  ^  SU 4S jjnU" S5      nU" S5      nU" S5      nU(       aN  U(       aG  [        U5      [        U5      :w  a/  [        R                  " S[        U5       S[        U5       S35      e[        [        U5      [        U5      5      nS[        U5      s=:  a  U:w  a2  O  O/[        R                  " S[        U5       S	[        U5       S
35      eUS::  a  0 T E/$ [        U5      S:X  a  XE-  n/ n[	        U5       HB  n0 T EnU(       a  X'   US'   U(       a  X7   US'   U(       a  XG   US'   UR                  U5        MD     U$ )zN
Split connection parameters with a sequence of hosts into separate attempts.
c                P   > [        TU 5      nU(       a  UR                  S5      $ / $ )N,)	get_paramsplit)keyvalparamss     J/var/www/html/venv/lib/python3.13/site-packages/psycopg/_conninfo_utils.py	split_val!split_attempts.<locals>.split_val   s$    $!$syy~,",    hosthostaddrportzcould not match z host names with z hostaddr valuesr   z port numbers to z hosts)r   strreturnz	list[str])leneOperationalErrormaxrangeappend)	r   r   hosts	hostaddrsportsnhostsrviattempts	   `        r   split_attemptsr*      sI   
- fE*%IfEs5zS^;  s5zl +^$$46
 	

 US^,F3u:  s5zl*;CJ<vN
 	

 {6
|
5zQ 
B6]V*#hGFO"+,GJ#hGFO
		'  Ir   c                    X;   a  [        X   5      $ [        U5      nU(       d  g[        R                  R	                  UR
                  5      nUb  U$ g)z]
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   nameparamdefenvs       r   r   r   C   sK     ~6<   T"H
**..
)C

r   c                  8    \ rS rSr% SrS\S'   S\S'   S\S'   Srg	)
ParamDefY   z?
Information about defaults and env vars for connection params
r   keywordr0   
str | Nonecompiled N)__name__
__module____qualname____firstlineno____doc____annotations____static_attributes__r:   r   r   r5   r5   Y   s     LKr   r5   c                   U(       d  [         R                  R                  5       nU H  n[        UR                  R                  5       UR                  (       a  UR                  R                  5       OSUR                  b  UR                  R                  5       OSS9nXAUR                  '   M     UR                  U 5      $ )z7
Return the ParamDef of a connection string parameter.
 N)r7   r0   r9   )	r   Conninfoget_defaultsr5   r7   decoder0   r9   r/   )r7   _cachedefsdcds        r   r,   r,   d   s     {{'')A		((*,-HHqxx("01

0F**,DB
 "$2::  ::gr   c                <     [        U 5        g! [         a     gf = f)z7Return True if the string represent a valid ip address.FT)r   
ValueError)ss    r   is_ip_addressrN   u   s'    1   s    
)r   r
   r   zlist[ConnDict])r   r
   r1   r   r   r8   )r7   r   rG   zdict[str, ParamDef]r   zParamDef | None)rM   r   r   bool)r?   
__future__r   r-   	functoolsr   	ipaddressr   dataclassesr   rC   r   abcr	   r
   r   r   r*   r   r5   r,   rN   r:   r   r   <module>rU      sg    # 	    !  & -`,    ?A "  r   