
    *Jf7-                        U d Z ddlmZmZmZmZmZ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 dd	lmZ dd
lmZmZmZmZmZmZ ddlmZmZ ddlmZmZ ddlm Z  e	rddlm!Z!m"Z" ddl#m$Z$ ddl%m&Z& ddl'm(Z( eedf         Z)ee*d<   ee+df         Z,ee*d<   ee+df         Z-ee*d<   ej.        j/        Z/ej/        Z0 G d de          Z1dS )zA
Helper object to transform values between Python and PostgreSQL
    )AnyDictListOptionalSequenceTuple)DefaultDictTYPE_CHECKING)defaultdict)	TypeAlias   )pq)postgres)errors)BufferLoadFuncAdaptContextPyFormat	DumperKeyNoneType)RowRowMaker)INVALID_OIDTEXT_OID)pgconn_encoding)DumperLoader)AdaptersMap)PGresult)BaseConnectionr   DumperCacheOidDumperCacher   LoaderCachec            	       `   e Zd ZU dZdZd                                Zeeedf                  e	d<   ee
ej                          e	d<   de	d<   ed	         e	d
<   ee	d<   d1dee         fdZedee         dd fd            Zeded         fd            Zedefd            Zed2d            Zeded	         fd            Zdddded	         dedeej                 ddfdZdee         dej        ddfdZdee         dej        ddfdZdee         dee         deee                  fdZd ede fd!Z!d ededd"fd#Z"defd$Z#d%edej        dd"fd&Z$d'ed(ed)e%e&         de
e&         fd*Z'd+ed)e%e&         dee&         fd,Z(d-eee                  deedf         fd.Z)d%edej        dd/fd0Z*dS )3TransformeraJ  
    An object that can adapt efficiently between Python and PostgreSQL.

    The life cycle of the object is the query, so it is assumed that attributes
    such as the server version or the connection encoding will not change. The
    object have its state so adapting several values of the same type can be
    optimised.

    zpsycopg.adaptz
        types formats
        _conn _adapters _pgresult _dumpers _loaders _encoding _none_oid
        _oid_dumpers _oid_types _row_dumpers _row_loaders
        .typesformatsr   	_adaptersr   	_pgresult	_none_oidNcontextc                 (   d x| _         x| _        | _        |r|j        | _        |j        | _        nt          j        | _        d | _        |  t          t                    | _
        |  d | _        i i f| _        d | _        g | _        i | _        d| _        d S )N )r)   r&   r'   adaptersr(   
connection_connr   r   dict_dumpers_oid_dumpers_loaders_row_dumpers_row_loaders
_oid_types	_encoding)selfr+   s     U/home/alex/cs2snipeproduction/venv/lib/python3.11/site-packages/psycopg/_transform.py__init__zTransformer.__init__<   s    5999dl  	$-DN +DJJ%.DNDJ 	9#D)) 	J  ;=b6: -/ -/    returnc                 F    t          |t                    r|S  | |          S )z
        Return a Transformer from an AdaptContext.

        If the context is a Transformer instance, just return it.
        )
isinstancer%   )clsr+   s     r:   from_contextzTransformer.from_context^   s)     g{++ 	 N3w<<r<   zBaseConnection[Any]c                     | j         S N)r0   r9   s    r:   r/   zTransformer.connectionj   s
    zr<   c                 f    | j         s$| j        }|rt          |j                  nd| _         | j         S )Nzutf-8)r8   r/   r   pgconn)r9   conns     r:   encodingzTransformer.encodingn   s7    ~ 	O?D=AN_T[999wDN~r<   c                     | j         S rC   )r(   rD   s    r:   r.   zTransformer.adaptersu   
    ~r<   c                     | j         S rC   )r)   rD   s    r:   pgresultzTransformer.pgresulty   rJ   r<   T)set_loadersformatresultrM   rN   c                     _         sdx _         _        |rg  _        d S j         _        j        x} _        |sd S |s	g  _        d S |                    d          n| fdt          |          D              _        d S )Nr   c                 l    g | ]0}                                         |                    j        1S  )
get_loaderftypeload).0ifmtrO   r9   s     r:   
<listcomp>z,Transformer.set_pgresult.<locals>.<listcomp>   sA     
 
 
;<DOOFLLOOS116
 
 
r<   )r)   _nfields_ntuplesr6   ntuplesnfieldsfformatrange)r9   rO   rM   rN   nfrX   s   ``   @r:   set_pgresultzTransformer.set_pgresult}   s       	,--DMDM '$&!F#^+T] 	F 	 "DF $*>fnnQv
 
 
 
 
 
@Eb		
 
 
r<   c                       fd|D              _         t          |           _        gt          |          z   _        d S )Nc                 <    g | ]}                     |          S rR   )get_dumper_by_oidrV   oidrN   r9   s     r:   rY   z0Transformer.set_dumper_types.<locals>.<listcomp>   s)    RRRST33C@@RRRr<   )r5   tupler&   lenr'   r9   r&   rN   s   ` `r:   set_dumper_typeszTransformer.set_dumper_types   sH    RRRRRERRR5\\
x#e**,r<   c                 2      fd|D              _         d S )Nc                 F    g | ]}                     |          j        S rR   )rS   rU   re   s     r:   rY   z0Transformer.set_loader_types.<locals>.<listcomp>   s*    PPP3T__S&99>PPPr<   r6   ri   s   ` `r:   set_loader_typeszTransformer.set_loader_types   s)    PPPPP%PPPr<   paramsc                    t          |          }d g|z  }| j        rAt          |          D ]/}||         }|#| j        |                             |          ||<   0|S |                                 g|z  }t
          g|z  }t          |          D ]U}||         }||                     |||                   }	|	                    |          ||<   |	j        ||<   |	j        ||<   Vt          |          | _
        || _        |S rC   )rh   r5   r_   dump_get_none_oidTEXT
get_dumperrf   rN   rg   r&   r'   )
r9   ro   r'   nparamsoutrW   paramr&   	pqformatsdumpers
             r:   dump_sequencezTransformer.dump_sequence   s    f++'+fw&6
  	7^^ > >q	$!.q166u==CFJ##%%&0FW$	w 	) 	)A1IE}__UGAJ77F[[''CFzE!H!=IaLL5\\
 
r<   objc                 H   |                      |t                    }|                    |          }|j        }|r|r|d         dk    r|t          k    r	 | j        |         }n# t          $ r | j        j        	                    |          }|rV|dk     r |j
                            | j                  }n|j                            | j                  }||j        k    r|dz  }nd}|| j        |<   Y nw xY w|rd||fz  }t          |t                     st!          |          }|S )N'   i    s   []r<   s   %s::%s)rt   PY_TEXTquoterf   r   r7   KeyErrorr.   r&   getnameencoderH   regtype	array_oidr?   bytes)r9   r{   ry   rvrf   type_sqltis          r:   
as_literalzTransformer.as_literal   sB   g..\\# j 	02 	0"R&G++x0?3/ 0 0 0](,,S11 	#Tzz#%7>>$-#@#@#%:#4#4T]#C#Cbl** E)"H'/$$$0  0"h/"e$$ 	rB	s   A" "BC21C2r   c                    t          |          }| j        |         }	 ||         }nX# t          $ rK 	 | j                            ||          } |||           x||<   }n# t
          j        $ r}|dd}~ww xY wY nw xY w|                    ||          }||u r|S 	 ||         S # t          $ r  |                    ||          x}||<   |cY S w xY w)z:
        Return a Dumper instance to dump `!obj`.
        N)	typer2   r   r.   rt   eProgrammingErrorget_keyupgrade)	r9   r{   rN   keycachery   dclsexkey1s	            r:   rt   zTransformer.get_dumper   s%   
 3ii f%
	63ZFF 	6 	6 	66}//V<< '+d3oo5c
VV % # # #d"# $V	6 ~~c6**3;;M	; 	 	 	#)>>#v#>#>>FU4[MMM	sD   ' 
A<AA<A6.A11A66A<;A<B$ $'CCc                     	 | j         S # t          $ r Y nw xY w	 | j                            t          t
                    j        x}| _         n"# t          $ r t          j	        d          w xY w|S )NzNone dumper not found)
r*   AttributeErrorr(   rt   r   r   rf   r   r   InterfaceError)r9   r   s     r:   rr   zTransformer._get_none_oid  s    	>! 	 	 	D		<"&.";";Hg"N"N"RRB 	< 	< 	<"#:;;;	< 	s   	 
1A A+rf   c                     | j         s	i i f| _         | j         |         }	 ||         S # t          $ r4 | j                            ||          } |t          |           x||<   }Y nw xY w|S )zO
        Return a Dumper to dump an object to the type with given oid.
        )r3   r   r.   rd   r   )r9   rf   rN   r   r   ry   s         r:   rd   zTransformer.get_dumper_by_oid  s       	)!#RD !&)	7: 	7 	7 	7 =223??D"&$x"6"66E#J		7 s   ' ;A%$A%row0row1make_rowc                    | j         }|st          j        d          d|cxk    r| j        k    rn nd|cxk    r| j        k    sn t          j        d| j                   g }t	          ||          D ]s}d g| j        z  }t	          | j                  D ]3}|                    ||          }	|	 | j        |         |	          ||<   4|                     ||                     t|S )Nzresult not setr   z$rows must be included between 0 and )	r)   r   r   r[   r_   rZ   	get_valuer6   append)
r9   r   r   r   resrecordsrowrecordcolvals
             r:   	load_rowszTransformer.load_rows%  s(   n 	5"#3444T****T]*****qD/I/I/I/IDM/I/I/I/I"Ft}FF   t$$ 	- 	-C!% 6FT]++ > >mmC--?"8$"3C"8"="=F3KNN88F++,,,,r<   r   c                     | j         }|sd S d|cxk    r| j        k     sn d S d g| j        z  }t          | j                  D ]3}|                    ||          }| | j        |         |          ||<   4 ||          S )Nr   )r)   r[   rZ   r_   r   r6   )r9   r   r   r   r   r   r   s          r:   load_rowzTransformer.load_row:  s    n 	4C''''$-''''4!FT]2'' 	: 	:C--S))C4d/4S99sxr<   r   c                     t           j                  t          |          k    r:t          j        dt          |           dt           j                   d          t	           fdt          |          D                       S )Nzcannot load sequence of z items: z loaders registeredc              3   R   K   | ]!\  }}| j         |         |          nd V  "d S rC   rm   )rV   rW   r   r9   s      r:   	<genexpr>z,Transformer.load_sequence.<locals>.<genexpr>Q  sW       
 
3 +./!Tq!#&&&t
 
 
 
 
 
r<   )rh   r6   r   r   rg   	enumerate)r9   r   s   ` r:   load_sequencezTransformer.load_sequenceJ  s    t !!S[[00$@3v;; @ @)**@ @ @  
  
 
 
 
#F++
 
 
 
 
 	
r<   r   c                 ,   	 | j         |         |         S # t          $ r Y nw xY w| j                            ||          }|s6| j                            t          |          }|st          j        d           |||           x}| j         |         |<   |S )Nzunknown oid loader not found)r4   r   r(   rS   r   r   r   )r9   rf   rN   
loader_clsloaders        r:   rS   zTransformer.get_loaderV  s    	=(-- 	 	 	D	 ^..sF;;
 	G22;GGJ G&'EFFF.8jd.C.CCv&s+s    
""rC   )r=   r   )+__name__
__module____qualname____doc__split	__slots__r   r   int__annotations__r   r   Formatr   r;   classmethodrA   propertyr/   strrH   r.   rL   boolra   r   rj   rn   r   r   r   rz   r   r   rt   rr   rd   r   r   r   r   r   rS   rR   r<   r:   r%   r%   "   s          !J EGG	  E#s(O$$$$d29o&&&&
####NNN    6        D 	 8L#9 	 m 	  	  	  [	  H%:;    X #    X    X (:.    X !&*
 
 
$
 	

 #
 

 
 
 
>-hsm -RY -4 - - - -
Qhsm QRY Q4 Q Q Q Qsm.6x.@	(6"	#   Bc e    >c 8     Bs    S ")     &c   $s)    * C  8C=  Xc]         

HXf-=$> 

5c? 

 

 

 

c 29       r<   r%   N)2r   typingr   r   r   r   r   r   r	   r
   collectionsr   typing_extensionsr   r-   r   r   r   r   abcr   r   r   r   r   r   rowsr   r   r   r   
_encodingsr   r   r   adaptr   pq.abcr   r/   r    r!   r   r   r"   r#   r   rs   r   r%   rR   r<   r:   <module>r      s     > = = = = = = = = = = = = = = = - - - - - - - - # # # # # # ' ' ' ' ' '                   N N N N N N N N N N N N N N N N         + + + + + + + + ' ' ' ' ' ' +########""""""      ******i12Y 2 2 2 h/	 / / /c8m,Y , , ,	y~
-@ @ @ @ @, @ @ @ @ @r<   