
    +hB                     `   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 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j@                        Z! G d de!      Z" G d de      Z# G d d e      Z$ G d! d"ej*                  jJ                        Z& G d# d$ej*                  jN                        Z( G d% d&ej*                  jR                        Z* G d' d(e      Z+ G d) d*e      Z, G d+ d,e      Z- G d- d.e      Z. G d/ d0ej^                        Z0 G d1 d2ejb                        Z2 G d3 d4ejf                        Z4 G d5 d6ejj                        Z6 G d7 d8ejn                        Z8 G d9 d:ejr                        Z: G d; d<ejv                        Z< G d= d>e      Z= ej|                         Z? G d? d@e      Z@ G dA dB      ZA G dC dDe      ZB G dE dFe      ZC G dG dHe      ZDeDZEy)Ia	  
.. dialect:: postgresql+pg8000
    :name: pg8000
    :dbapi: pg8000
    :connectstring: postgresql+pg8000://user:password@host:port/dbname[?key=value&key=value...]
    :url: https://pypi.org/project/pg8000/

.. versionchanged:: 1.4  The pg8000 dialect has been updated for version
   1.16.6 and higher, and is again part of SQLAlchemy's continuous integration
   with full feature support.

.. _pg8000_unicode:

Unicode
-------

pg8000 will encode / decode string values between it and the server using the
PostgreSQL ``client_encoding`` parameter; by default this is the value in
the ``postgresql.conf`` file, which often defaults to ``SQL_ASCII``.
Typically, this can be changed to ``utf-8``, as a more useful default::

    #client_encoding = sql_ascii # actually, defaults to database
                                 # encoding
    client_encoding = utf8

The ``client_encoding`` can be overridden for a session by executing the SQL:

SET CLIENT_ENCODING TO 'utf8';

SQLAlchemy will execute this SQL on all new connections based on the value
passed to :func:`_sa.create_engine` using the ``client_encoding`` parameter::

    engine = create_engine(
        "postgresql+pg8000://user:pass@host/dbname", client_encoding='utf8')

.. _pg8000_ssl:

SSL Connections
---------------

pg8000 accepts a Python ``SSLContext`` object which may be specified using the
:paramref:`_sa.create_engine.connect_args` dictionary::

    import ssl
    ssl_context = ssl.create_default_context()
    engine = sa.create_engine(
        "postgresql+pg8000://scott:tiger@192.168.0.199/test",
        connect_args={"ssl_context": ssl_context},
    )

If the server uses an automatically-generated certificate that is self-signed
or does not match the host name (as seen from the client), it may also be
necessary to disable hostname checking::

    import ssl
    ssl_context = ssl.create_default_context()
    ssl_context.check_hostname = False
    ssl_context.verify_mode = ssl.CERT_NONE
    engine = sa.create_engine(
        "postgresql+pg8000://scott:tiger@192.168.0.199/test",
        connect_args={"ssl_context": ssl_context},
    )

.. _pg8000_isolation_level:

pg8000 Transaction Isolation Level
-------------------------------------

The pg8000 dialect offers the same isolation level settings as that
of the :ref:`psycopg2 <psycopg2_isolation_level>` dialect:

* ``READ COMMITTED``
* ``READ UNCOMMITTED``
* ``REPEATABLE READ``
* ``SERIALIZABLE``
* ``AUTOCOMMIT``

.. seealso::

    :ref:`postgresql_isolation_level`

    :ref:`psycopg2_isolation_level`


    N)UUID   )ARRAY
_ColonCast)_DECIMAL_TYPES)_FLOAT_TYPES)
_INT_TYPES)ENUMINTERVAL)
PGCompiler)	PGDialect)PGExecutionContext)PGIdentifierPreparerJSONJSONB)JSONPathType   )exc)
processors)types)util)quoted_namec                       e Zd Zd Zy)
_PGNumericc                 Z   | j                   r_|t        v r.t        j                  t        j
                  | j                        S |t        v s|t        v ry t        j                  d|z        |t        v ry |t        v s|t        v rt        j                  S t        j                  d|z        )NzUnknown PG numeric type: %d)	asdecimalr	   r   to_decimal_processor_factorydecimalDecimal_effective_decimal_return_scaler   r
   r   InvalidRequestErrorto_floatselfdialectcoltypes      X/var/www/html/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/pg8000.pyresult_processorz_PGNumeric.result_processorw   s    >>,&!>>OOT%I%I  N*g.C--1G;  ,&N*g.C!***--1G;     N)__name__
__module____qualname__r,    r-   r+   r   r   v   s    r-   r   c                       e Zd Zd Zy)_PGNumericNoBindc                      y Nr1   )r(   r)   s     r+   bind_processorz_PGNumericNoBind.bind_processor       r-   N)r.   r/   r0   r6   r1   r-   r+   r3   r3          r-   r3   c                       e Zd Zd Zd Zy)_PGJSONc                      y r5   r1   r'   s      r+   r,   z_PGJSON.result_processor   r7   r-   c                     |j                   S r5   r   r(   dbapis     r+   get_dbapi_typez_PGJSON.get_dbapi_type       zzr-   Nr.   r/   r0   r,   r?   r1   r-   r+   r:   r:      s    r-   r:   c                       e Zd Zd Zd Zy)_PGJSONBc                      y r5   r1   r'   s      r+   r,   z_PGJSONB.result_processor   r7   r-   c                     |j                   S r5   r   r=   s     r+   r?   z_PGJSONB.get_dbapi_type   s    {{r-   NrA   r1   r-   r+   rC   rC      s    r-   rC   c                       e Zd Zd Zy)_PGJSONIndexTypec                     t        d      )Nzshould not be here)NotImplementedErrorr=   s     r+   r?   z_PGJSONIndexType.get_dbapi_type   s    !"677r-   Nr.   r/   r0   r?   r1   r-   r+   rG   rG      s    8r-   rG   c                       e Zd Zd Zy)_PGJSONIntIndexTypec                     |j                   S r5   INTEGERr=   s     r+   r?   z"_PGJSONIntIndexType.get_dbapi_type       }}r-   NrJ   r1   r-   r+   rL   rL          r-   rL   c                       e Zd Zd Zy)_PGJSONStrIndexTypec                     |j                   S r5   )STRINGr=   s     r+   r?   z"_PGJSONStrIndexType.get_dbapi_type   s    ||r-   NrJ   r1   r-   r+   rS   rS      s    r-   rS   c                       e Zd Zd Zy)_PGJSONPathTypec                      y)Ni  r1   r=   s     r+   r?   z_PGJSONPathType.get_dbapi_type   r7   r-   NrJ   r1   r-   r+   rW   rW      r8   r-   rW   c                       e Zd Zd Zd Zy)_PGUUIDc                 &    | j                   sd }|S y )Nc                      | t        |       } | S r5   )_python_UUIDvalues    r+   processz'_PGUUID.bind_processor.<locals>.process   s    $(/Er-   as_uuid)r(   r)   r`   s      r+   r6   z_PGUUID.bind_processor       ||
 N r-   c                 &    | j                   sd }|S y )Nc                      | t        |       } | S r5   )strr^   s    r+   r`   z)_PGUUID.result_processor.<locals>.process   s    $JEr-   ra   )r(   r)   r*   r`   s       r+   r,   z_PGUUID.result_processor   rc   r-   N)r.   r/   r0   r6   r,   r1   r-   r+   rZ   rZ      s    r-   rZ   c                       e Zd Zd Zy)_PGEnumc                     |j                   S r5   )UNKNOWNr=   s     r+   r?   z_PGEnum.get_dbapi_type   rP   r-   NrJ   r1   r-   r+   rh   rh      rQ   r-   rh   c                   "    e Zd Zd Zed        Zy)_PGIntervalc                     |j                   S r5   r   r=   s     r+   r?   z_PGInterval.get_dbapi_type       ~~r-   c                 .    t        |j                        S )N)	precision)rl   second_precision)clsintervalkws      r+   adapt_emulated_to_nativez$_PGInterval.adapt_emulated_to_native   s    X%>%>??r-   N)r.   r/   r0   r?   classmethodru   r1   r-   r+   rl   rl      s     @ @r-   rl   c                       e Zd Zd Zy)_PGTimeStampc                     | j                   ryy)Ni  iZ  )timezoner=   s     r+   r?   z_PGTimeStamp.get_dbapi_type   s    == r-   NrJ   r1   r-   r+   rx   rx      s    r-   rx   c                       e Zd Zd Zy)_PGTimec                     |j                   S r5   )TIMEr=   s     r+   r?   z_PGTime.get_dbapi_type   r@   r-   NrJ   r1   r-   r+   r|   r|      s    r-   r|   c                       e Zd Zd Zy)
_PGIntegerc                     |j                   S r5   rN   r=   s     r+   r?   z_PGInteger.get_dbapi_type   rP   r-   NrJ   r1   r-   r+   r   r      rQ   r-   r   c                       e Zd Zd Zy)_PGSmallIntegerc                     |j                   S r5   rN   r=   s     r+   r?   z_PGSmallInteger.get_dbapi_type   rP   r-   NrJ   r1   r-   r+   r   r      rQ   r-   r   c                       e Zd Zd Zy)_PGNullTypec                     |j                   S r5   )NULLTYPEr=   s     r+   r?   z_PGNullType.get_dbapi_type   rn   r-   NrJ   r1   r-   r+   r   r      s    r-   r   c                       e Zd Zd Zy)_PGBigIntegerc                     |j                   S r5   )
BIGINTEGERr=   s     r+   r?   z_PGBigInteger.get_dbapi_type   s    r-   NrJ   r1   r-   r+   r   r      s     r-   r   c                       e Zd Zd Zy)
_PGBooleanc                     |j                   S r5   )BOOLEANr=   s     r+   r?   z_PGBoolean.get_dbapi_type  rP   r-   NrJ   r1   r-   r+   r   r      rQ   r-   r   c                       e Zd Zd Zy)_PGARRAYc                     t        ||       S r5   r   )r(   	bindvalues     r+   bind_expressionz_PGARRAY.bind_expression  s    )T**r-   N)r.   r/   r0   r   r1   r-   r+   r   r     s    +r-   r   c                       e Zd Zd Zd Zy)PGExecutionContext_pg8000c                     dt        t        |             dd  dt        t                     dd  }t        | j                  j                         |      S )Nc_   _)hexid_server_side_idServerSideCursor_dbapi_connectioncursor)r(   idents     r+   create_server_side_cursorz3PGExecutionContext_pg8000.create_server_side_cursor  sF     D]12.O4E0Fqr0JK 6 6 = = ?GGr-   c                     | j                   sy y r5   )compiledr(   s    r+   pre_execz"PGExecutionContext_pg8000.pre_exec  s    }} r-   N)r.   r/   r0   r   r   r1   r-   r+   r   r     s    Hr-   r   c                   |    e Zd ZdZd Zed        Zed        Zed        ZddZ	d Z
d	 Zdd
Zd Zd Zd ZddZy)r   Tc                      || _         || _        y r5   )r   r   )r(   r   r   s      r+   __init__zServerSideCursor.__init__  s    
r-   c                 .    | j                   j                  S r5   )r   
connectionr   s    r+   r   zServerSideCursor.connection  s    {{%%%r-   c                 .    | j                   j                  S r5   )r   rowcountr   s    r+   r   zServerSideCursor.rowcount"  s    {{###r-   c                 .    | j                   j                  S r5   )r   descriptionr   s    r+   r   zServerSideCursor.description&  s    {{&&&r-   Nc                 l    d| j                   z   dz   |z   }| j                  j                  |||       | S )NzDECLARE z NO SCROLL CURSOR FOR )stream)r   r   execute)r(   	operationargsr   ops        r+   r   zServerSideCursor.execute*  s9    $**$'??)KBV4r-   c                 >    | j                   j                  ||       | S r5   )r   executemany)r(   r   
param_setss      r+   r   zServerSideCursor.executemany/  s    	:6r-   c                     | j                   j                  d| j                  z          | j                   j                         S )NzFETCH FORWARD 1 FROM )r   r   r   fetchoner   s    r+   r   zServerSideCursor.fetchone3  s1    3djj@A{{##%%r-   c                     || j                         S | j                  j                  dt        t	        |            z   dz   | j
                  z          | j                  j                         S )NzFETCH FORWARD z FROM )fetchallr   r   rf   intr   )r(   nums     r+   	fetchmanyzServerSideCursor.fetchmany7  sX    ;==?"KK 3s3x=08;djjH ;;''))r-   c                     | j                   j                  d| j                  z          | j                   j                         S )NzFETCH FORWARD ALL FROM )r   r   r   r   r   s    r+   r   zServerSideCursor.fetchall@  s1    5

BC{{##%%r-   c                     | j                   j                  d| j                  z          | j                   j                          y )NzCLOSE )r   r   r   closer   s    r+   r   zServerSideCursor.closeD  s-    Htzz12r-   c                 6     | j                   j                  |  y r5   )r   setinputsizes)r(   sizess     r+   r   zServerSideCursor.setinputsizesH  s    !!!5)r-   c                      y r5   r1   )r(   sizecolumns      r+   setoutputsizezServerSideCursor.setoutputsizeK  s    r-   )r1   Nr5   )r.   r/   r0   server_sider   propertyr   r   r   r   r   r   r   r   r   r   r   r1   r-   r+   r   r     sp    K & & $ $ ' '
&*&*r-   r   c                       e Zd Zd Zy)PGCompiler_pg8000c                 ~     | j                   |j                  fi |dz    | j                   |j                  fi |z   S )Nz %% )r`   leftright)r(   binaryoperatorrt   s       r+   visit_mod_binaryz"PGCompiler_pg8000.visit_mod_binaryP  sB    DLL++dll6<<.2./	
r-   N)r.   r/   r0   r   r1   r-   r+   r   r   O  s    
r-   r   c                       e Zd Zd Zy)PGIdentifierPreparer_pg8000c                 D    t        j                  | g|i | d| _        y )NF)r   r   _double_percents)r(   r   kwargss      r+   r   z$PGIdentifierPreparer_pg8000.__init__Y  s"    %%d<T<V< %r-   N)r.   r/   r0   r   r1   r-   r+   r   r   X  s    &r-   r   c            
       .   e Zd ZdZdZdZdZdZdZe	Z
eZeZdZdZdZ ej&                  ej*                  i ej.                  eej2                  eej6                  eej:                  eej>                  e e!e"ej6                  jF                  e$ej6                  jJ                  e&ej6                  jN                  e(ej6                  jR                  e*e+e,ejZ                  e.e/e.ej`                  e1ejd                  e3ejh                  e5ejl                  e7ejp                  e9ejt                  e;ejx                  e=i      ZddZ>ej~                  d        Z@eAd        ZBd ZCd	 ZDd
 ZEd ZFd ZGd ZHd ZId ZJd ZKd ZLd ZM	 ddZN	 ddZOd ZPd ZQy)PGDialect_pg8000pg8000TformatNc                 r    t        j                  | fi | || _        | j                  dk  rt	        d      y )N)r         z$pg8000 1.16.6 or greater is required)r   r   client_encoding_dbapi_versionrI   )r(   r   r   s      r+   r   zPGDialect_pg8000.__init__  s<    4*6*.+%&LMM ,r-   c                     | j                   r`t        | j                   d      rJt        t        j                  d| j                   j
                        D cg c]  }t        |       c}      S yc c}w )N__version__z(\d+)(?:[-\.]?|$))c   r   r   )r>   hasattrtuplerefindallr   r   )r(   xs     r+   r   zPGDialect_pg8000._dbapi_version  sa    ::'$**m<  ZZ,djj.D.D F   s   A.c                     t        d      S )Nr   )
__import__)rr   s    r+   r>   zPGDialect_pg8000.dbapi  s    (##r-   c                     |j                  d      }d|v rt        |d         |d<   |j                  |j                         g |fS )Nuser)usernameport)translate_connect_argsr   updatequery)r(   urloptss      r+   create_connect_argsz$PGDialect_pg8000.create_connect_args  sH    ))6):T>tF|,DLCIIDzr-   c                 x    t        || j                  j                        rdt        |      v rydt        |      v S )Nznetwork errorTzconnection is closed)
isinstancer>   InterfaceErrorrf   )r(   er   r   s       r+   is_disconnectzPGDialect_pg8000.is_disconnect  s>    a2233L
 9
  &Q//r-   c           
         |j                  dd      }t        |d      r|j                  }|dk(  rd|_        y || j                  v rMd|_        |j                         }|j                  d|z         |j                  d       |j                          y t        j                  d	|d
| j                  ddj                  | j                        d      )Nr    dbapi_connection
AUTOCOMMITTFz=SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL %sCOMMITzInvalid value 'z2' for isolation_level. Valid isolation levels for z are z, z or AUTOCOMMIT)replacer   r   
autocommit_isolation_lookupr   r   r   r   ArgumentErrornamejoin)r(   r   levelr   s       r+   set_isolation_levelz$PGDialect_pg8000.set_isolation_level  s    c3' :12#44JL $(J!d,,,$)J!&&(FNN%',- NN8$LLN## $))TYYt/E/E%FH r-   c                     |j                         }	 |j                  d|rdndz         |j                  d       |j                          y # |j                          w xY w)N-SET SESSION CHARACTERISTICS AS TRANSACTION %sz	READ ONLYz
READ WRITEr   r   r   r   r(   r   r_   r   s       r+   set_readonlyzPGDialect_pg8000.set_readonly  sQ    ""$	NN?"';\; NN8$LLNFLLN   )A Ac                     |j                         }	 |j                  d       |j                         d   }|j                          |dk(  S # |j                          w xY w)Nzshow transaction_read_onlyr   onr   r   r   r   r(   r   r   vals       r+   get_readonlyzPGDialect_pg8000.get_readonly  sS    ""$	NN78//#A&CLLNd{ LLN   $A Ac                     |j                         }	 |j                  d|rdndz         |j                  d       |j                          y # |j                          w xY w)Nr
  
DEFERRABLEzNOT DEFERRABLEr   r  r  s       r+   set_deferrablezPGDialect_pg8000.set_deferrable  sS    ""$	NN?#(<.>@ NN8$LLNFLLNr  c                     |j                         }	 |j                  d       |j                         d   }|j                          |dk(  S # |j                          w xY w)Nzshow transaction_deferrabler   r  r  r  s       r+   get_deferrablezPGDialect_pg8000.get_deferrable  sS    ""$	NN89//#A&CLLNd{ LLNr  c                     t        |d      r|j                  }|j                         }|j                  d|z   dz          |j                  d       |j	                          y )Nr   zSET CLIENT_ENCODING TO ''r   )r   r   r   r   r   )r(   r   r   r   s       r+   set_client_encodingz$PGDialect_pg8000.set_client_encoding  sR    :12#44J""$1OCcIJx r-   c                     | j                   r& |j                  |D cg c]  \  }}}|
 c}}}  y  |j                  di |D ci c]  \  }}}|r|| c}}} y c c}}}w c c}}}w )Nr1   )
positionalr   )r(   r   list_of_tuplescontextkeydbtypesqltypes          r+   do_set_input_sizesz#PGDialect_pg8000.do_set_input_sizes  s}    ?? F  5CDD1S&'&D !F    1? ,VW K Es   AA&c                 @    |j                   j                  d|df       y Nr    )r   	tpc_beginr(   r   xids      r+   do_begin_twophasez"PGDialect_pg8000.do_begin_twophase  s    ''C5r-   c                 8    |j                   j                          y r5   )r   tpc_preparer*  s      r+   do_prepare_twophasez$PGDialect_pg8000.do_prepare_twophase  s    ))+r-   c                 @    |j                   j                  d|df       y r'  )r   tpc_rollbackr(   r   r+  is_preparedrecovers        r+   do_rollback_twophasez%PGDialect_pg8000.do_rollback_twophase  s     	**AsB<8r-   c                 @    |j                   j                  d|df       y r'  )r   
tpc_commitr2  s        r+   do_commit_twophasez#PGDialect_pg8000.do_commit_twophase  s     	((!S"6r-   c                 b    |j                   j                         D cg c]  }|d   	 c}S c c}w )Nr   )r   tpc_recover)r(   r   rows      r+   do_recover_twophasez$PGDialect_pg8000.do_recover_twophase#  s)    ","7"7"C"C"EF3AFFFs   ,c                 *    g d }j                  |        j                   fd}j                  |        j                   fd}j                  |        j                  r fd}j                  |       t	              dkD  rfd}|S y )Nc                 `    | j                   t        j                     | j                   t        <   y r5   )py_typesr   	text_typer   )conns    r+   
on_connectz/PGDialect_pg8000.on_connect.<locals>.on_connect)  s    )-t~~)FDMM+&r-   c                 >    j                  | j                         y r5   )r  r   rA  r(   s    r+   rB  z/PGDialect_pg8000.on_connect.<locals>.on_connect0      ((t/C/CDr-   c                 >    j                  | j                         y r5   )r  isolation_levelrD  s    r+   rB  z/PGDialect_pg8000.on_connect.<locals>.on_connect7  rE  r-   c                 v    | j                  dj                         | j                  dj                         y )Nr   i  )register_in_adapter_json_deserializerrD  s    r+   rB  z/PGDialect_pg8000.on_connect.<locals>.on_connect>  s1    ((d.E.EF ((t/F/FGr-   r   c                 $    D ]
  } ||         y r5   r1   )rA  fnfnss     r+   rB  z/PGDialect_pg8000.on_connect.<locals>.on_connectI  s     BtHr-   )appendr   rG  rK  len)r(   rB  rN  s   ` @r+   rB  zPGDialect_pg8000.on_connect&  s    	G 	

:+E JJz"+E JJz"""H JJz"s8a< r-   r5   )TF)Rr.   r/   r0   driversupports_statement_cachesupports_unicode_statementssupports_unicode_bindsdefault_paramstylesupports_sane_multi_rowcountr   execution_ctx_clsr   statement_compilerr   preparersupports_server_side_cursorsuse_setinputsizesdescription_encodingr   update_copyr   colspecssqltypesNumericr3   Floatr   r   r:   Booleanr   NullTyper   r   rC   r   rW   JSONIndexTyperG   JSONIntIndexTyperL   JSONStrIndexTyperS   r   rZ   Intervalrl   r   DateTimerx   Timer|   Integerr   SmallIntegerr   
BigIntegerr   Enumrh   r   r   r   memoized_propertyr   rv   r>   r   r   r  r  r  r  r  r  r%  r,  r/  r5  r8  r<  rB  r1   r-   r+   r   r   ^  sD   F#"&!!#' 1**H#'     t	
.	
NNJ	
 MM7	
 j		

 {	
 8	
 MM&&	
 MM'')9	
 MM**,?	
 MM**,?	
 '	
 {	
 k	
 |	
 MM7	
  j!	
" !!?#	
$ MM7NNH)	
H4N 
    $ $02		6, :?9 :?7
G)r-   r   )F__doc__r"   r   uuidr   r]   arrayr   PGARRAYbaser   r   r	   r
   r   r   r   r   r   r   jsonr   r   r   r(  r   r   r   r_  r   sql.elementsr   r`  r   r3   r:   rC   rd  rG   re  rL   rf  rS   rW   rZ   rh   rl   rh  rx   ri  r|   rj  r   rk  r   rc  r   rl  r   rb  r   r   counterr   r   r   r   r   r   r)   r1   r-   r+   <module>rw     s  Tj  	 % #          $ &       !  '!! 4z 
d u 8x}}22 8
(--88 
(--88 
l 
d ,d 
@( @8$$ hmm 
!! 
h++ 
(## 
 H''  
!! 
+w +
 $,,. 2 5 5p

 
&"6 &qy qh r-   