
    *Jf                        d 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mZ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	lmZ n# e$ r  ed
          w xY w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e	e"ef         de	e"ef         fdZ#de	e"ef         de	e"ef         fdZ$de	e"ef         de	e"ef         fdZ% G d de          Z& G d d          Z'dS )z
DNS query support
    N)randint)AnyDefaultDictDictList
NamedTupleOptionalSequence)TYPE_CHECKING)defaultdict)ResolverCache)r   )DNSExceptionzBthe module psycopg._dns requires the package 'dnspython' installed   )errors)conninfo)SRVparamsreturnc                   K   t          j        dt                     g }g }g }t          j        |            d{V D ]}|                    d          |                    |d                    |                    d          |                    |d                    |                    d          (|                    t          |d                              |                                 }d	                    |          }|r||d<   d	                    |          }|r||d<   d	                    |          }|r||d<   |S )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)	r   hosts	hostaddrsportsattemptoutshosts
shostaddrssportss	            O/home/alex/cs2snipeproduction/venv/lib/python3.11/site-packages/psycopg/_dns.pyresolve_hostaddr_asyncr-   &   sW      MJ   EIE!9&AAAAAAAA / /;;v*LL)));;z"".WZ0111;;v*LLWV_--...
++--CXXe__F F)$$J %$JXXe__F FJ    c                 D    t                                          |           S )z/Apply SRV DNS lookup as defined in :RFC:`2782`.)Rfc2782Resolverresolver   s    r,   resolve_srvr3   M   s    $$V,,,r.   c                 T   K   t                                          |            d{V S )z$Async equivalent of `resolve_srv()`.N)r0   resolve_asyncr2   s    r,   resolve_srv_asyncr6   R   s2       ""00888888888r.   c                   L    e Zd ZU eed<   eed<   dZeed<   dZee         ed<   dS )HostPortr   r   FtotryNtarget)	__name__
__module____qualname__r!   __annotations__r9   boolr:   r	    r.   r,   r8   r8   W   sH         
III
IIIE4 FHSM     r.   r8   c                   ^   e Zd ZdZ ej        d          Zdeee	f         deee	f         fdZ
deee	f         deee	f         fdZdeee	f         dee         fdZdedee         fd	Zdedee         fd
Zdedddee         fdZdeee	f         dee         deee	f         fdZddZdS )r0   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>.+)r   r   c                     |                      |          }|s|S g }|D ]G}|j        r)|                    |                     |                     2|                    |           H|                     ||          S )5Update the parameters host and port after SRV lookup.)_get_attemptsr9   extend_resolve_srvr    _return_paramsselfr   attemptshpshps        r,   r1   zRfc2782Resolver.resolveg   s    %%f-- 	M 	 	Bx 

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

2""63///r.   c                   K   |                      |          }|s|S g }|D ]M}|j        r/|                    |                     |           d{V            8|                    |           N|                     ||          S )rC   N)rD   r9   rE   _resolve_srv_asyncr    rG   rH   s        r,   r5   zRfc2782Resolver.resolve_asyncv   s      %%f-- 	M 	 	Bx 

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

2""63///r.   c           	         |                     dt          j                             dd                    rg S |                     dt          j                             dd                    }|                    d          }t	          |                     dt          j                             dd                              }|                    d          }t          |          d	k    r|t          |          z  }t          |          t          |          k    r5t          j        d
t          |           dt          |           d          g }d}t          ||          D ]\  }}	| j	        
                    |          }
|
s|	                                dk    r/d}|
r|
                    d          nd}t          ||	d|          }nt          ||	          }|                    |           |r|n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srvTr:   N)r   r   r9   r:   r   r   )r   osenvironsplitr!   leneOperationalErrorzip	re_srv_rrmatchlowergroupr8   r    )rI   r   host_arghosts_inport_argports_inr(   	srv_foundr   r   mr:   rL   s                r,   rD   zRfc2782Resolver._get_attempts   s    ::j"*..r"B"BCC 	I

62:>>(B+G+GHH>>#&&FJJvrz~~h/K/KLLMM>>#&&x==AH%Hx==CMM)) $WHWW3x==WWW   	h11 	 	JD$$$T**A 4DJJLLE)) 	./9***T4d$vNNN4d333JJrNNNN'ssR'r.   rL   c                     	 t                               |j        d          }n# t          $ r d}Y nw xY w|                     ||          S Nr   r@   )resolverr1   r   r   _get_solved_entriesrI   rL   anss      r,   rF   zRfc2782Resolver._resolve_srv   sZ    	""27E22CC 	 	 	CCC	''C000s    # 22c                    K   	 t                               |j        d           d {V }n# t          $ r d}Y nw xY w|                     ||          S rh   )async_resolverr1   r   r   rj   rk   s      r,   rN   z"Rfc2782Resolver._resolve_srv_async   sp      	&..rw>>>>>>>>CC 	 	 	CCC	''C000s   &+ ::entriesSequence[SRV]c                 .   |sB|j         r9|j                                        dk    rt          |j         |j                  gS g S t	          |          dk    r t          |d         j                   dk    rg S d |                     |          D             S )NrT   rU   r   r   .c                     g | ]J}t          t          |j                                      d           t          |j                            KS )rr   rU   )r8   r!   r:   rstripr   ).0entrys     r,   
<listcomp>z7Rfc2782Resolver._get_solved_entries.<locals>.<listcomp>   sU     
 
 
 #el++22377c%*ooNNN
 
 
r.   )r:   r   r_   r8   rY   r!   sort_rfc2782)rI   rL   ro   s      r,   rj   z#Rfc2782Resolver._get_solved_entries   s      	y RW]]__55 bibg>>>??	 w<<1WQZ%6!7!73!>!>I
 
**733
 
 
 	
r.   rK   c                     |st          j        d          |                                }d                    d |D                       |d<   d                    d |D                       |d<   |S )Nz!no host found after SRV RR lookupr   c              3   $   K   | ]}|j         V  d S N)r   ru   rL   s     r,   	<genexpr>z1Rfc2782Resolver._return_params.<locals>.<genexpr>   s$      552rw555555r.   r   c              3   >   K   | ]}t          |j                  V  d S r{   )r!   r   r|   s     r,   r}   z1Rfc2782Resolver._return_params.<locals>.<genexpr>   s*      ::s27||::::::r.   r   )rZ   r[   r"   r#   )rI   r   rK   r(   s       r,   rG   zRfc2782Resolver._return_params   sy      	J$%HIIIkkmmhh5555555Fhh::c:::::F
r.   rl   	List[SRV]c                 F   t          t                    }g }|D ]"}||j                                     |           #t	          |                                          D ]\  }}t          |          dk    r|                    |d                    4|                    d            t          d |D                       }|r]t          d|          }d}	t          |          D ]\  }
}|	|j        z  }	|	|k    r n|                    |           ||j        z  }||
= |]|S )zM
        Implement the priority/weight ordering defined in RFC 2782.
        r   r   c                     | j         S r{   weight)ents    r,   <lambda>z.Rfc2782Resolver.sort_rfc2782.<locals>.<lambda>   s     r.   )keyc              3   $   K   | ]}|j         V  d S r{   r   )ru   r   s     r,   r}   z/Rfc2782Resolver.sort_rfc2782.<locals>.<genexpr>   s$      ==csz======r.   )r   listpriorityr    sorteditemsrY   sortsumr   	enumerater   )rI   rl   
prioritiesr(   rv   priro   total_weightrcsumir   s               r,   rx   zRfc2782Resolver.sort_rfc2782   sS   
 5@4E4E
 	5 	5Eu~&--e4444":#3#3#5#566 	 	LC7||q  

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

3
*AJ  	 
r.   N)rl   rp   r   r   )r;   r<   r=   __doc__recompiler]   r   r!   r   r1   r5   r   r8   rD   rF   rN   rj   rG   rx   r@   r.   r,   r0   r0   ^   s         
WXXI0d38n 0c3h 0 0 0 00$sCx. 0T#s(^ 0 0 0 0%(DcN %(tH~ %( %( %( %(N1x 1DN 1 1 1 118 1X 1 1 1 1

%4
	h
 
 
 
(
38n
+/>
	c3h
 
 
 
     r.   r0   )(r   rV   r   r   randomr   typingr   r   r   r   r   r	   r
   r   collectionsr   dns.resolverr   r   dns.asyncresolverAsyncResolverdns.exceptionr   ImportErrorrQ   r   rZ   r   dns.rdtypes.IN.SRVr   ri   cachern   r!   r-   r3   r6   r8   r0   r@   r.   r,   <module>r      s|    
			 				        O O O O O O O O O O O O O O O O O O             # # # # # #,,,,,,,,;;;;;;*******   
+L  
             '&&&&&&8::uww $c3h $DcN $ $ $ $N-S#X -4S> - - - -
9DcN 9tCH~ 9 9 9 9
! ! ! ! !z ! ! !X X X X X X X X X Xs   A	 	A