
    i                    b   d Z ddlmZ ddlZddlZddlZddlmZ ddlm	Z	m
Z
mZmZmZ ddlmZ 	 ddlmZmZ ddlmZ dd	lmZ ddlmZ ddlmZ e	rddlmZ  e       Z e       e_         e       Z  e       e _        ddZ!ddZ"ddZ# G d de      Z$ G d d      Z%y# e$ r	  ed
      w xY w)z
DNS query support
    )annotationsN)randint)TYPE_CHECKINGAnyDefaultDict
NamedTupleSequence)defaultdict)CacheResolver)DNSException)r   zBthe module psycopg._dns requires the package 'dnspython' installed   )conninfo)errors)SRVc                8  K   t        j                  dt               g }g }g }t        j                  |        d{   D ]{  }|j                  d      |j                  |d          |j                  d      |j                  |d          |j                  d      _|j                  t        |d                } | j                         }dj                  |      x}r||d<   dj                  |      x}r||d<   dj                  |      }|r||d<   |S 7 ܭw)a  
    Perform async DNS lookup of the hosts and return a new params dict.

    .. deprecated:: 3.1
        The use of this function is not necessary anymore, because
        `psycopg.AsyncConnection.connect()` performs non-blocking name
        resolution automatically.
    z@from psycopg 3.1, resolve_hostaddr_async() is not needed anymoreNhosthostaddrport,)
warningswarnDeprecationWarningr   conninfo_attempts_asyncgetappendstrcopyjoin)	paramshosts	hostaddrsportsattemptoutshosts
shostaddrssportss	            l/var/www/html/hwPaymentPortal-be-dev/hw-payment-portal-api/venv/lib/python3.12/site-packages/psycopg/_dns.pyresolve_hostaddr_asyncr*   '   s     MMJ EIE!99&AA /;;v*LL);;z".WZ01;;v*LLWV_-./ ++-C% v FXXi((z($JXXe_FFJ# Bs   9DDA"DA:Dc                4    t               j                  |       S )z/Apply SRV DNS lookup as defined in :RFC:`2782`.)Rfc2782Resolverresolver    s    r)   resolve_srvr/   L   s    $$V,,    c                P   K   t               j                  |        d{   S 7 w)z$Async equivalent of `resolve_srv()`.N)r,   resolve_asyncr.   s    r)   resolve_srv_asyncr3   Q   s       "008888s   &$&c                  >    e Zd ZU ded<   ded<   dZded<   dZded	<   y)
HostPortr   r   r   FbooltotryNz
str | Nonetarget)__name__
__module____qualname____annotations__r7   r8    r0   r)   r5   r5   V   s     
I
IE4FJr0   r5   c                      e Zd ZdZ ej
                  d      ZddZddZddZ	ddZ
ddZ	 	 	 	 	 	 ddZ	 	 	 	 	 	 dd	Zdd
Zy)r,   zImplement SRV RR Resolution as per RFC 2782

    The class is organised to minimise code duplication between the sync and
    the async paths.
    z9^(?P<service>_[^\.]+)\.(?P<proto>_[^\.]+)\.(?P<target>.+)c                    | j                  |      x}s|S g }|D ]@  }|j                  r!|j                  | j                  |             0|j	                  |       B | j                  ||      S )5Update the parameters host and port after SRV lookup.)_get_attemptsr7   extend_resolve_srvr   _return_paramsselfr    attemptshpshps        r)   r-   zRfc2782Resolver.resolvef   so     ..v666M 	Bxx

4,,R01

2		 ""63//r0   c                   K   | j                  |      x}s|S g }|D ]H  }|j                  r)|j                  | j                  |       d{          8|j	                  |       J | j                  ||      S 7 .w)r@   N)rA   r7   rB   _resolve_srv_asyncr   rD   rE   s        r)   r2   zRfc2782Resolver.resolve_asynct   s{      ..v666M 	Bxx

!8!8!<<=

2		 ""63//	 =s   AA;
A9
/A;c           	     d   |j                  dt        j                  j                  dd            rg S |j                  dt        j                  j                  dd            }|j                  d      }t	        |j                  dt        j                  j                  dd                  }t        |j                  d      x}      d	k(  r|t        |      z  }t        |      t        |      k7  r.t        j                  d
t        |       dt        |       d      g }d}t        ||      D ]z  \  }}	| j                  j                  |      x}
s|	j                         dk(  r'd}|
r|
j                  d      nd}t        ||	d|      }nt        ||	      }|j                  |       | |r|S g S )z
        Return the list of host, and for each host if SRV lookup must be tried.

        Return an empty list if no lookup is requested.
        r   
PGHOSTADDR r   PGHOSTr   r   PGPORTr   zcannot match z hosts with z port numbersFsrvTr8   N)r   r   r7   r8   r   r   )r   osenvironsplitr   leneOperationalErrorzip	re_srv_rrmatchlowergroupr5   r   )rF   r    host_arghosts_inport_argports_inr%   	srv_foundr   r   mr8   rI   s                r)   rA   zRfc2782Resolver._get_attempts   sy    ::j"**..r"BCI

62::>>(B+GH>>#&FJJvrzz~~h/KLMHNN3//1Q6H%Hx=CM) $$Hl3x=/W  	h1 	JD$^^))$///DJJLE4I 	./*T4d$vN4d3JJrN	  s'R'r0   c                    	 t         j                  |j                  d      }| j	                  ||      S # t        $ r d}Y w xY wNr   r=   )resolverr-   r   r   _get_solved_entriesrF   rI   anss      r)   rC   zRfc2782Resolver._resolve_srv   sH    	""277E2C ''C00  	C	s    4 AAc                   K   	 t         j                  |j                  d       d {   }| j	                  ||      S 7 # t        $ r d}Y !w xY wwre   )async_resolverr-   r   r   rg   rh   s      r)   rK   z"Rfc2782Resolver._resolve_srv_async   sQ     	&..rww>>C ''C00 ? 	C	s5   A#A  >A  AA   AAAAc           	        |sM|j                   r?|j                  j                         dk7  r"t        |j                   |j                        gS g S t	        |      dk(  rt        |d   j                         dk(  rg S | j                  |      D cg c]D  }t        t        |j                         j                  d      t        |j                              F c}S c c}w )NrQ   rR   r   r   .)r8   r   r\   r5   rV   r   sort_rfc2782rstrip)rF   rI   entriesentrys       r)   rg   z#Rfc2782Resolver._get_solved_entries   s     yyRWW]]_5 biibgg>??	 w<1WQZ%6%6!73!>I **73
 #ell+2237c%**oN
 	
 
s   A	Cc                    |st        j                  d      |j                         }dj                  d |D              |d<   dj                  d |D              |d<   |S )Nz!no host found after SRV RR lookupr   c              3  4   K   | ]  }|j                     y wN)r   .0rI   s     r)   	<genexpr>z1Rfc2782Resolver._return_params.<locals>.<genexpr>   s     52rww5   r   c              3  F   K   | ]  }t        |j                          y wrt   )r   r   ru   s     r)   rw   z1Rfc2782Resolver._return_params.<locals>.<genexpr>   s     :s277|:s   !r   )rW   rX   r   r   )rF   r    rH   r%   s       r)   rD   zRfc2782Resolver._return_params   sY     $$%HIIkkmhh555Fhh:c::F
r0   c                   t        t              }g }|D ]   }||j                     j                  |       " t	        |j                               D ]  \  }}t        |      dk(  r|j                  |d          )|j                  d        t        d |D              }|sQt        d|      }d}	t        |      D ]  \  }
}|	|j                  z  }	|	|k\  s n |j                         ||j                  z  }|
= |r] |S )zM
        Implement the priority/weight ordering defined in RFC 2782.
        r   r   c                    | j                   S rt   weight)ents    r)   <lambda>z.Rfc2782Resolver.sort_rfc2782.<locals>.<lambda>   s
     r0   )keyc              3  4   K   | ]  }|j                     y wrt   r|   )rv   r~   s     r)   rw   z/Rfc2782Resolver.sort_rfc2782.<locals>.<genexpr>   s     =cszz=rx   )r
   listpriorityr   sorteditemsrV   sortsumr   	enumerater}   )rF   ri   
prioritiesr%   rq   prirp   total_weightrcsumir~   s               r)   rn   zRfc2782Resolver.sort_rfc2782   s   
 3>d2C
 	5Eu~~&--e4	5 #:#3#3#56 	LC7|q 

71:&LL3L4=W==LA|,'0 FAsCJJ&Dqy 

3

*AJ 	$ 
r0   Nr    dict[str, Any]returnr   )r    r   r   list[HostPort])rI   r5   r   r   )rI   r5   rp   Sequence[SRV]r   r   )r    r   rH   r   r   r   )ri   r   r   z	list[SRV])r9   r:   r;   __doc__recompilerZ   r-   r2   rA   rC   rK   rg   rD   rn   r=   r0   r)   r,   r,   ]   ss     

WXI00"(H11

%2
	
(
$
+9
	
r0   r,   r   )&r   
__future__r   rS   r   r   randomr   typingr   r   r   r   r	   collectionsr
   dns.resolverr   r   dns.exceptionr   dns.asyncresolverAsyncResolverImportErrorrN   r   r   rW   dns.rdtypes.IN.SRVr   rf   cacherk   r*   r/   r3   r5   r,   r=   r0   r)   <module>r      s    # 	 	   H H #,*;  &:w "J-
9
z S SQ  
L s   B   B.