
    ؄_                        d Z ddlZddl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	 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 ddlmZ ddlmZ ddlmZ ddlmZ  G d de          Z G d de          Z G d de          Z G d de          Z G d de
          Z G d de          Z G d  d!e	          Z G d" d#e          Z e Z!dS )$a  
.. dialect:: postgresql+pygresql
    :name: pygresql
    :dbapi: pgdb
    :connectstring: postgresql+pygresql://user:password@host:port/dbname[?key=value&key=value...]
    :url: http://www.pygresql.org/

.. note::

    The pygresql dialect is **not tested as part of SQLAlchemy's continuous
    integration** and may have unresolved issues.  The recommended PostgreSQL
    dialect is psycopg2.

    N   )_DECIMAL_TYPES)_FLOAT_TYPES)
_INT_TYPES)
PGCompiler)	PGDialect)PGIdentifierPreparer)UUID)HSTORE)JSON)JSONB   )exc)
processors)util)Null)Numericc                       e Zd Zd Zd ZdS )
_PGNumericc                     d S N )selfdialects     l/var/www/book.euthymeo.com/html/venv/lib/python3.11/site-packages/sqlalchemy/dialects/postgresql/pygresql.pybind_processorz_PGNumeric.bind_processor,   s    t    c                 x   t          |t                    s|j        }| j        rX|t          v r$t          j        t          j        | j	                  S |t          v s	|t          v rd S t          j        d|z            |t          v rd S |t          v s	|t          v rt
          j        S t          j        d|z            )NzUnknown PG numeric type: %d)
isinstanceintoid	asdecimalr   r   to_decimal_processor_factorydecimalDecimal_effective_decimal_return_scaler   r   r   InvalidRequestErrorto_float)r   r   coltypes      r   result_processorz_PGNumeric.result_processor/   s    '3'' 	"kG> 	,&&!>OT%I   N**g.C.Ct-1G;   ,&&tN**g.C.C!**-1G;  r   N)__name__
__module____qualname__r   r*   r   r   r   r   r   +   s2              r   r   c                   (     e Zd Z fdZ fdZ xZS )	_PGHStorec                     |j         s(t          t          |                               |          S |j        j        fd}|S )Nc                 H    t          | t                    r |           S | S r   )r   dict)valuehstores    r   processz)_PGHStore.bind_processor.<locals>.processP   s(    %&& %ve}}$Lr   )has_native_hstoresuperr/   r   dbapiHstore)r   r   r5   r4   	__class__s      @r   r   z_PGHStore.bind_processorK   sX    ( 	BD))88AAA%	 	 	 	 	
 r   c                 h    |j         s)t          t          |                               ||          S d S r   )r6   r7   r/   r*   r   r   r)   r:   s      r   r*   z_PGHStore.result_processorW   s;    ( 	MD))::7GLLL	M 	Mr   r+   r,   r-   r   r*   __classcell__r:   s   @r   r/   r/   J   sZ        
 
 
 
 
M M M M M M M M Mr   r/   c                   (     e Zd Z fdZ fdZ xZS )_PGJSONc                      |j         s(t          t                                         |          S |j        j         fd}|S )Nc                     | j         u rd } n t          | t                    s	| 	j        rd S | t          | t          t
          f          r |           S | S r   NULLr   r   none_as_nullr2   listr3   jsonr   s    r   r5   z'_PGJSON.bind_processor.<locals>.processb   d    	!!E4(( $"3t}
54, ? ?}tE{{"Lr   )has_native_jsonr7   rA   r   r8   Jsonr   r   r5   rI   r:   s   `  @r   r   z_PGJSON.bind_processor]   s^    & 	@$''66w???}!		 		 		 		 		 		 r   c                 h    |j         s)t          t          |                               ||          S d S r   )rK   r7   rA   r*   r<   s      r   r*   z_PGJSON.result_processoro   s;    & 	K$''88'JJJ	K 	Kr   r=   r?   s   @r   rA   rA   \   sZ            $K K K K K K K K Kr   rA   c                   (     e Zd Z fdZ fdZ xZS )_PGJSONBc                      |j         s(t          t                                         |          S |j        j         fd}|S )Nc                     | j         u rd } n t          | t                    s	| 	j        rd S | t          | t          t
          f          r |           S | S r   rD   rH   s    r   r5   z(_PGJSONB.bind_processor.<locals>.processz   rJ   r   )rK   r7   rP   r   r8   rL   rM   s   `  @r   r   z_PGJSONB.bind_processoru   s^    & 	A4((77@@@}!		 		 		 		 		 		 r   c                 h    |j         s)t          t          |                               ||          S d S r   )rK   r7   rP   r*   r<   s      r   r*   z_PGJSONB.result_processor   s;    & 	L4((99'7KKK	L 	Lr   r=   r?   s   @r   rP   rP   t   sZ            $L L L L L L L L Lr   rP   c                   (     e Zd Z fdZ fdZ xZS )_PGUUIDc                     |j         s(t          t          |                               |          S |j        j        fd}|S )Nc                     | d S t          | t          t          f          r*t          |           dk    r |           S  |           S t          | t                    r |           S | S )N   )bytes)r    )r   strrY   lenr    )r3   uuids    r   r5   z'_PGUUID.bind_processor.<locals>.process   s|    }t%#u.. #u::##4e,,,,tE{{"%%% 't&Lr   )has_native_uuidr7   rU   r   r8   Uuid)r   r   r5   r\   r:   s      @r   r   z_PGUUID.bind_processor   sX    & 	@$''66w???}!		 		 		 		 		 r   c                     |j         s)t          t          |                               ||          S | j        sd }|S d S )Nc                 (    | t          |           S d S r   )rZ   )r3   s    r   r5   z)_PGUUID.result_processor.<locals>.process   s    $u::% %$r   )r]   r7   rU   r*   as_uuid)r   r   r)   r5   r:   s       r   r*   z_PGUUID.result_processor   sY    & 	K$''88'JJJ| 	& & & N	 	r   r=   r?   s   @r   rU   rU      sQ            $	 	 	 	 	 	 	 	 	r   rU   c                       e Zd Zd Zd ZdS )_PGCompilerc                 V     | j         |j        fi |dz    | j         |j        fi |z   S )Nz %% )r5   leftright)r   binaryoperatorkws       r   visit_mod_binaryz_PGCompiler.visit_mod_binary   sF    DL++++dl6<..2../	
r   c                 .    |                     dd          S N%z%%)replace)r   texts     r   post_process_textz_PGCompiler.post_process_text   s    ||C&&&r   N)r+   r,   r-   rj   rp   r   r   r   rc   rc      s2        
 
 
' ' ' ' 'r   rc   c                       e Zd Zd ZdS )_PGIdentifierPreparerc                 n    |                     | j        | j                  }|                     dd          S rl   )rn   escape_quoteescape_to_quote)r   r3   s     r   _escape_identifierz(_PGIdentifierPreparer._escape_identifier   s/    d/1EFF}}S$'''r   N)r+   r,   r-   rv   r   r   r   rr   rr      s#        ( ( ( ( (r   rr   c                        e Zd ZdZeZeZed             Z	 e
j        ej        eeeeeeeeeeeei          Z fdZd Zd Z xZS )PGDialect_pygresqlpygresqlc                     dd l }|S )Nr   )pgdb)clsr{   s     r   r8   zPGDialect_pygresql.dbapi   s    r   c                     t          t          |           j        d	i | 	 | j        j        }t          j        d|          }t          |                    d                    t          |                    d                    f}n# t          t          t          f$ r d}Y nw xY w|| _        |dk     r!dx}x}}|dk    rt          j        d           nd| _        d| _        dx}x}}|| _        || _        || _        d S )
Nz(\d+)\.(\d+)r      )r   r   )   r   FzAPyGreSQL is only fully supported by SQLAlchemy since version 5.0.Tr   )r7   rx   __init__r8   versionrematchr    groupAttributeError
ValueError	TypeErrordbapi_versionr   warnsupports_unicode_statementssupports_unicode_bindsr6   rK   r]   )r   kwargsr   mr6   rK   r]   r:   s          r   r   zPGDialect_pygresql.__init__   s&   0 $''0::6:::	j(G'22A1771::AGGAJJ8GG
I6 	 	 	GGG	$VDIII/&  	*  
 04D,*.D'DHHH/!2..s   A%B	 	B%$B%c                    |                     d          }d|v rK|                    dd                              dd          d         d|                    d          |d<   |                    |j                   g |fS )	Nuser)usernameporthost :r   r   )translate_connect_argsgetrsplitpopupdatequery)r   urloptss      r   create_connect_argsz&PGDialect_pygresql.create_connect_args   s    ))6)::T>>$$++C33A666   DL 	CI4xr   c                     t          || j        j                  rB|sdS 	 |j        }|sdS n# t          $ r Y nw xY w	 |j        S # t          $ r |j        d u cY S w xY wdS )NF)r   r8   Error
connectionr   closed_cnx)r   er   cursors       r   is_disconnectz PGDialect_pygresql.is_disconnect   s    a)** 	/ u!'2
 " ! 5! "   
/!((! / / /!$..../us   , 
99A AA)r+   r,   r-   driverrc   statement_compilerrr   preparerclassmethodr8   r   update_copyr   colspecsr   r   r   r/   rL   rA   r   r   rP   r
   rU   r   r   r   r>   r?   s   @r   rx   rx      s        F$$H  [
  tZI''8'	

 
H/ / / / /0        r   rx   )"__doc__r$   r   baser   r   r   r   r   r	   r
   r4   r   rI   r   r   r   r   r   r   sql.elementsr   typesrL   r   r   r/   rA   rP   rU   rc   rr   rx   r   r   r   r   <module>r      s     				                                     & & & & & &                                                       ! ! ! ! ! !             >M M M M M M M M$K K K K Kd K K K0L L L L Lu L L L0    d   >	' 	' 	' 	' 	'* 	' 	' 	'( ( ( ( (0 ( ( (J J J J J J J JZ r   