o
    6	f7-                     @   sT  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/Z0G d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                	   @   s,  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< dCdee fddZedee dd fddZeded fddZedefddZedDddZeded	 fddZdddded	 ded eej ddfd!d"Zdee d ejddfd#d$Zdee d ejddfd%d&Zd'ee dee deee  fd(d)Zd*ede fd+d,Z!d*ed edd-fd.d/Z"defd0d1Z#d2ed ejdd-fd3d4Z$d5ed6ed7e%e& de
e& fd8d9Z'd:ed7e%e& dee& fd;d<Z(d=eee  deedf fd>d?Z)d2ed ejdd@fdAdBZ*dS )E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                 C   st   d  | _  | _| _|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)    r7   K/home/ertert/spirit/venv/lib/python3.10/site-packages/psycopg/_transform.py__init__<   s   



zTransformer.__init__returnc                 C   s   t |tr|S | |S )z
        Return a Transformer from an AdaptContext.

        If the context is a Transformer instance, just return it.
        )
isinstancer#   )clsr)   r7   r7   r8   from_context^   s   
zTransformer.from_contextzBaseConnection[Any]c                 C      | j S N)r-   r6   r7   r7   r8   r,   j      zTransformer.connectionc                 C   s&   | j s| j}|rt|jnd| _ | j S )Nzutf-8)r5   r,   r   pgconn)r6   connr7   r7   r8   encodingn   s   zTransformer.encodingc                 C   r>   r?   )r&   r@   r7   r7   r8   r+   u   rA   zTransformer.adaptersc                 C   r>   r?   )r'   r@   r7   r7   r8   pgresulty   rA   zTransformer.pgresultT)set_loadersformatresultrF   rG   c                   s   _ sd __|rg _d S j_j }_|s d S |s'g _d S |d u r0dn|  fddt|D _d S )Nr   c                    s    g | ]} | jqS r7   )
get_loaderftypeload).0ifmtrH   r6   r7   r8   
<listcomp>   s    z,Transformer.set_pgresult.<locals>.<listcomp>)r'   _nfields_ntuplesr3   ntuplesnfieldsfformatrange)r6   rH   rF   rG   nfr7   rN   r8   set_pgresult}   s"   zTransformer.set_pgresultc                    s4    fdd|D _ t|_ gt| _d S )Nc                    s   g | ]} | qS r7   )get_dumper_by_oidrL   oidrG   r6   r7   r8   rP      s    z0Transformer.set_dumper_types.<locals>.<listcomp>)r2   tupler$   lenr%   r6   r$   rG   r7   r\   r8   set_dumper_types   s   
zTransformer.set_dumper_typesc                    s    fdd|D _ d S )Nc                    s   g | ]	} | jqS r7   )rI   rK   rZ   r\   r7   r8   rP      s    z0Transformer.set_loader_types.<locals>.<listcomp>r3   r_   r7   r\   r8   set_loader_types   s   zTransformer.set_loader_typesparamsc           
      C   s   t |}d g| }| jr't|D ]}|| }|d ur$| j| |||< q|S |  g| }tg| }t|D ]$}|| }|d u rBq7| ||| }	|	|||< |	j||< |	j||< q7t	|| _
|| _|S r?   )r^   r2   rV   dump_get_none_oidTEXT
get_dumperr[   rG   r]   r$   r%   )
r6   rc   r%   nparamsoutrM   paramr$   	pqformatsdumperr7   r7   r8   dump_sequence   s,   



zTransformer.dump_sequenceobjc                 C   s   |  |t}||}|j}|rb|rb|d dkrb|tkrbz| j| }W n6 tyY   | jj	|}|rP|dk r?|j
| j}n|j| j}||jkrO|d7 }nd}|| j|< Y nw |rbd||f }t|tskt|}|S )N'   i    s   []    s   %s::%s)rg   PY_TEXTquoter[   r   r4   KeyErrorr+   r$   getnameencoderD   regtype	array_oidr;   bytes)r6   rn   rl   rvr[   type_sqltir7   r7   r8   
as_literal   s.   


zTransformer.as_literalr   c           	      C   s   t |}| j| }z|| }W n, ty;   z	| j||}W n tjy/ } z|dd}~ww |||  ||< }Y nw |||}||u rH|S z|| W S  tyb   ||| }||< | Y S w )z:
        Return a Dumper instance to dump `!obj`.
        N)	typer/   rt   r+   rg   eProgrammingErrorget_keyupgrade)	r6   rn   rG   keycacherl   dclsexkey1r7   r7   r8   rg      s,   

zTransformer.get_dumperc                 C   sR   z| j W S  ty   Y nw z| jttj }| _ W |S  ty(   t	dw )NzNone dumper not found)
r(   AttributeErrorr&   rg   r   rr   r[   rt   r   InterfaceError)r6   r{   r7   r7   r8   re     s   
zTransformer._get_none_oidr[   c                 C   sZ   | j si i f| _ | j | }z|| W S  ty,   | j||}|t|  ||< }Y |S w )zO
        Return a Dumper to dump an object to the type with given oid.
        )r0   rt   r+   rY   r   )r6   r[   rG   r   r   rl   r7   r7   r8   rY     s   


zTransformer.get_dumper_by_oidrow0row1make_rowc           
      C   s   | j }|s
tdd|  kr| jkr#n nd|  kr"| jks,n td| j g }t||D ]*}d g| j }t| jD ]}|||}	|	d urU| j| |	||< q@||| q3|S )Nzresult not setr   z$rows must be included between 0 and )	r'   r   r   rR   rV   rQ   	get_valuer3   append)
r6   r   r   r   resrecordsrowrecordcolvalr7   r7   r8   	load_rows%  s"   
2
zTransformer.load_rowsr   c                 C   sv   | j }|sd S d|  kr| jk sd S  d S d g| j }t| jD ]}|||}|d ur6| j| |||< q!||S )Nr   )r'   rR   rQ   rV   r   r3   )r6   r   r   r   r   r   r   r7   r7   r8   load_row:  s   zTransformer.load_rowr   c                    sN   t  jt |krtdt | dt  j dt fddt|D S )Nzcannot load sequence of z items: z loaders registeredc                 3   s.    | ]\}}|d ur j | |nd V  qd S r?   ra   )rL   rM   r   r@   r7   r8   	<genexpr>Q  s
    
z,Transformer.load_sequence.<locals>.<genexpr>)r^   r3   r   r   r]   	enumerate)r6   r   r7   r@   r8   load_sequenceJ  s   zTransformer.load_sequencer   c                 C   sn   z| j | | W S  ty   Y nw | j||}|s)| jt|}|s)td|||  }| j | |< |S )Nzunknown oid loader not found)r1   rt   r&   rI   r   r   r   )r6   r[   rG   
loader_clsloaderr7   r7   r8   rI   V  s   
zTransformer.get_loaderr?   )r:   r   )+__name__
__module____qualname____doc__split	__slots__r   r   int__annotations__r   r   Formatr   r9   classmethodr=   propertyr,   strrD   r+   rE   boolrX   r   r`   rb   r   r   r   rm   rz   r~   rg   re   rY   r   r   r   r   r   rI   r7   r7   r7   r8   r#   "   sd   
 
"


!!""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   rf   rr   r#   r7   r7   r7   r8   <module>   s.      