o
    6	fu                     @   s  d Z ddlZddlZddlZddlZddlmZmZm	Z	m
Z
 ddlmZmZ ddlmZmZmZ ddlmZ dd	lmZ ed
ZejZG dd deZG dd deZG dd deZede	e fddZdde
eef dedefddZdedefddZdS )z@
Various functionalities to make easier to work with the libpq.
    N)cast
NamedTupleOptionalUnion   )PGconnPGresult)
ConnStatusTransactionStatusPipelineStatus   )cache)pgconn_encodingz
psycopg.pqc                   @   s&   e Zd ZU eed< eed< eed< dS )PGnotifyrelnamebe_pidextraN__name__
__module____qualname__bytes__annotations__int r   r   H/home/ertert/spirit/venv/lib/python3.10/site-packages/psycopg/pq/misc.pyr      s   
 r   c                   @   sR   e Zd ZU eed< ee ed< ee ed< ee ed< eed< eed< eed< dS )	ConninfoOptionkeywordenvvarcompiledvallabeldispchardispsizeN)r   r   r   r   r   r   r   r   r   r   r   r      s   
 r   c                   @   sF   e Zd ZU eed< eed< eed< eed< eed< eed< eed< dS )	PGresAttDescnametableidcolumnidformattypidtyplen	atttypmodNr   r   r   r   r   r$   '   s   
 r$   returnc               
   C   s   t jdkrtjd} | S t jdkrZtjd} | sXz$dd l}|ddg  }t	j
|d} t	j
| s<d } W | S W | S  tyW } ztd| W Y d }~| S d }~ww | S tjd	} | S )
Nwin32z	libpq.dlldarwinzlibpq.dylibr   	pg_configz--libdirz(couldn't use pg_config to find libpq: %spq)sysplatformctypesutilfind_library
subprocesscheck_outputstripdecodeospathjoinexists	Exceptionloggerdebug)libnamesplibdirexr   r   r   find_libpq_full_path1   s.   

rE   utf8objencodingc                 C   s   t | drtt| } | j}|r|ddd  }n(t | dr8| jtkr(t| }| j}|r7|ddd  }n
t	dt
| j |rL||d}|S d}|S )	a0  
    Return an error message from a `PGconn` or `PGresult`.

    The return value is a `!str` (unlike pq data which is usually `!bytes`):
    use the connection encoding if available, otherwise the `!encoding`
    parameter as a fallback for decoding. Don't raise exceptions on decoding
    errors.

    error_field   :r   error_messagez!PGconn or PGresult expected, got replacezno details available)hasattrr   r   rL   splitr8   statusOKr   	TypeErrortyper   r9   )rG   rH   bmsgmsgr   r   r   rL   L   s&   



rL   pgconnc                 C   s   g }| j tkrUt| jj}| jr|dt| jj 7 }| jds+|	d| j
 f | jdkr:|	d| j
 f | j| jkrJ|	d| j
 f |	d| j
 f nt| j j}dd	d
 |D }|rmd| d}d| d| S )zN
    Return summary information on a connection.

    Useful for __repr__
    z, pipeline=   /hosts   5432portuserdatabase c                 s   s    | ]}d | V  qdS )z%s=%sNr   ).0partr   r   r   	<genexpr>   s    z%connection_summary.<locals>.<genexpr>z ()[])rP   rQ   r
   transaction_statusr%   pipeline_statusr   rX   
startswithappendr9   rY   rZ   dbr	   r<   )rV   partsrP   spartsr   r   r   connection_summaryv   s"   

rj   )rF   ) __doc__r:   r1   loggingctypes.utilr3   typingr   r   r   r   abcr   r   _enumsr	   r
   r   _compatr   
_encodingsr   	getLoggerr?   rQ   r   r   r$   strrE   rL   rj   r   r   r   r   <module>   s&    


 *