o
    =aA                     @   s  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 G dd dejZG dd deZG dd deZG dd deZ G dd  d ejj!Z"G d!d" d"ejj#Z$G d#d$ d$ejj%Z&G d%d& d&eZ'G d'd( d(eZ(G d)d* d*e
Z)G d+d, d,eZ*G d-d. d.ej+Z,G d/d0 d0ej-Z.G d1d2 d2ej/Z0G d3d4 d4ej1Z2G d5d6 d6ej3Z4G d7d8 d8ej5Z6G d9d: d:ej7Z8e9 Z:G d;d< d<eZ;G d=d> d>Z<G d?d@ d@eZ=G dAdB dBeZ>G dCdD dDeZ?e?Z@dS )Ea	  
.. 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   )_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d ZdS )
_PGNumericc                 C   sp   | j r |tv rttj| jS |tv s|tv rd S t	
d| |tv r&d S |tv s.|tv r1tjS t	
d| )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coltype r&   [/var/www/html/gps/gps/lib/python3.10/site-packages/sqlalchemy/dialects/postgresql/pg8000.pyresult_processoru   s"   z_PGNumeric.result_processorN)__name__
__module____qualname__r(   r&   r&   r&   r'   r   t       r   c                   @   r   )_PGNumericNoBindc                 C      d S Nr&   )r#   r$   r&   r&   r'   bind_processor      z_PGNumericNoBind.bind_processorN)r)   r*   r+   r0   r&   r&   r&   r'   r-      r,   r-   c                   @      e Zd Zdd Zdd ZdS )_PGJSONc                 C   r.   r/   r&   r"   r&   r&   r'   r(      r1   z_PGJSON.result_processorc                 C      |j S r/   r   r#   dbapir&   r&   r'   get_dbapi_type      z_PGJSON.get_dbapi_typeNr)   r*   r+   r(   r7   r&   r&   r&   r'   r3          r3   c                   @   r2   )_PGJSONBc                 C   r.   r/   r&   r"   r&   r&   r'   r(      r1   z_PGJSONB.result_processorc                 C   r4   r/   r   r5   r&   r&   r'   r7      r8   z_PGJSONB.get_dbapi_typeNr9   r&   r&   r&   r'   r;      r:   r;   c                   @   r   )_PGJSONIndexTypec                 C   s   t d)Nzshould not be here)NotImplementedErrorr5   r&   r&   r'   r7      s   z_PGJSONIndexType.get_dbapi_typeNr)   r*   r+   r7   r&   r&   r&   r'   r<      r,   r<   c                   @   r   )_PGJSONIntIndexTypec                 C   r4   r/   INTEGERr5   r&   r&   r'   r7      r8   z"_PGJSONIntIndexType.get_dbapi_typeNr>   r&   r&   r&   r'   r?      r,   r?   c                   @   r   )_PGJSONStrIndexTypec                 C   r4   r/   )STRINGr5   r&   r&   r'   r7      r8   z"_PGJSONStrIndexType.get_dbapi_typeNr>   r&   r&   r&   r'   rB      r,   rB   c                   @   r   )_PGJSONPathTypec                 C   s   dS )Ni  r&   r5   r&   r&   r'   r7      r1   z_PGJSONPathType.get_dbapi_typeNr>   r&   r&   r&   r'   rD      r,   rD   c                   @   r2   )_PGUUIDc                 C   s   | j s	dd }|S d S )Nc                 S      | d urt | } | S r/   )_python_UUIDvaluer&   r&   r'   process      z'_PGUUID.bind_processor.<locals>.processas_uuid)r#   r$   rJ   r&   r&   r'   r0         z_PGUUID.bind_processorc                 C   s   | j s	dd }|S d S )Nc                 S   rF   r/   )strrH   r&   r&   r'   rJ      rK   z)_PGUUID.result_processor.<locals>.processrL   )r#   r$   r%   rJ   r&   r&   r'   r(      rN   z_PGUUID.result_processorN)r)   r*   r+   r0   r(   r&   r&   r&   r'   rE      s    
rE   c                   @   r   )_PGEnumc                 C   r4   r/   )UNKNOWNr5   r&   r&   r'   r7      r8   z_PGEnum.get_dbapi_typeNr>   r&   r&   r&   r'   rP      r,   rP   c                   @   s    e Zd Zdd Zedd ZdS )_PGIntervalc                 C   r4   r/   r   r5   r&   r&   r'   r7      r8   z_PGInterval.get_dbapi_typec                 K   s   t |jdS )N)	precision)rR   second_precision)clsintervalkwr&   r&   r'   adapt_emulated_to_native   s   z$_PGInterval.adapt_emulated_to_nativeN)r)   r*   r+   r7   classmethodrX   r&   r&   r&   r'   rR      s    rR   c                   @   r   )_PGTimeStampc                 C   s   | j rdS dS )Ni  iZ  )timezoner5   r&   r&   r'   r7      s   z_PGTimeStamp.get_dbapi_typeNr>   r&   r&   r&   r'   rZ      r,   rZ   c                   @   r   )_PGTimec                 C   r4   r/   )TIMEr5   r&   r&   r'   r7      r8   z_PGTime.get_dbapi_typeNr>   r&   r&   r&   r'   r\      r,   r\   c                   @   r   )
_PGIntegerc                 C   r4   r/   r@   r5   r&   r&   r'   r7      r8   z_PGInteger.get_dbapi_typeNr>   r&   r&   r&   r'   r^      r,   r^   c                   @   r   )_PGSmallIntegerc                 C   r4   r/   r@   r5   r&   r&   r'   r7      r8   z_PGSmallInteger.get_dbapi_typeNr>   r&   r&   r&   r'   r_      r,   r_   c                   @   r   )_PGNullTypec                 C   r4   r/   )NULLTYPEr5   r&   r&   r'   r7      r8   z_PGNullType.get_dbapi_typeNr>   r&   r&   r&   r'   r`      r,   r`   c                   @   r   )_PGBigIntegerc                 C   r4   r/   )
BIGINTEGERr5   r&   r&   r'   r7      r8   z_PGBigInteger.get_dbapi_typeNr>   r&   r&   r&   r'   rb      r,   rb   c                   @   r   )
_PGBooleanc                 C   r4   r/   )BOOLEANr5   r&   r&   r'   r7      r8   z_PGBoolean.get_dbapi_typeNr>   r&   r&   r&   r'   rd      r,   rd   c                   @   r2   )PGExecutionContext_pg8000c                 C   s:   dt t| dd  t t dd  f }t| j |S )Nzc_%s_%s   )hexid_server_side_idServerSideCursor_dbapi_connectioncursor)r#   identr&   r&   r'   create_server_side_cursor  s   *z3PGExecutionContext_pg8000.create_server_side_cursorc                 C   s   | j sd S d S r/   )compiledr#   r&   r&   r'   pre_exec  s   z"PGExecutionContext_pg8000.pre_execN)r)   r*   r+   ro   rr   r&   r&   r&   r'   rf     s    rf   c                   @   s   e Zd ZdZdd Zedd Zedd Zedd	 ZdddZ	dd Z
dd ZdddZdd Zdd Zdd ZdddZdS )rk   Tc                 C   s   || _ || _d S r/   )rn   rm   )r#   rm   rn   r&   r&   r'   __init__  s   
zServerSideCursor.__init__c                 C      | j jS r/   )rm   
connectionrq   r&   r&   r'   ru        zServerSideCursor.connectionc                 C   rt   r/   )rm   rowcountrq   r&   r&   r'   rw     rv   zServerSideCursor.rowcountc                 C   rt   r/   )rm   descriptionrq   r&   r&   r'   rx     rv   zServerSideCursor.descriptionr&   Nc                 C   s(   d| j  d | }| jj|||d | S )NzDECLARE z NO SCROLL CURSOR FOR )stream)rn   rm   execute)r#   	operationargsry   opr&   r&   r'   rz   #  s   zServerSideCursor.executec                 C   s   | j || | S r/   )rm   executemany)r#   r{   
param_setsr&   r&   r'   r~   (  s   zServerSideCursor.executemanyc                 C      | j d| j  | j  S )NzFETCH FORWARD 1 FROM )rm   rz   rn   fetchonerq   r&   r&   r'   r   ,     
zServerSideCursor.fetchonec                 C   s<   |d u r|   S | jdtt| d | j  | j  S )NzFETCH FORWARD z FROM )fetchallrm   rz   rO   intrn   )r#   numr&   r&   r'   	fetchmany0  s   
zServerSideCursor.fetchmanyc                 C   r   )NzFETCH FORWARD ALL FROM )rm   rz   rn   r   rq   r&   r&   r'   r   9  r   zServerSideCursor.fetchallc                 C   s    | j d| j  | j   d S )NzCLOSE )rm   rz   rn   closerq   r&   r&   r'   r   =  s   zServerSideCursor.closec                 G   s   | j j|  d S r/   )rm   setinputsizes)r#   sizesr&   r&   r'   r   A  s   zServerSideCursor.setinputsizesc                 C   r.   r/   r&   )r#   sizecolumnr&   r&   r'   setoutputsizeD  r1   zServerSideCursor.setoutputsize)r&   Nr/   )r)   r*   r+   server_siders   propertyru   rw   rx   rz   r~   r   r   r   r   r   r   r&   r&   r&   r'   rk     s"    




	rk   c                   @   r   )PGCompiler_pg8000c                 K   s,   | j |jfi |d | j |jfi | S )Nz %% )rJ   leftright)r#   binaryoperatorrW   r&   r&   r'   visit_mod_binaryI  s   z"PGCompiler_pg8000.visit_mod_binaryN)r)   r*   r+   r   r&   r&   r&   r'   r   H  r,   r   c                   @   r   )PGIdentifierPreparer_pg8000c                 O   s"   t j| g|R i | d| _d S )NF)r   rs   _double_percents)r#   r|   kwargsr&   r&   r'   rs   R  s   
z$PGIdentifierPreparer_pg8000.__init__N)r)   r*   r+   rs   r&   r&   r&   r'   r   Q  r,   r   c                   @   s  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eji ejeejeejeejeeje e!e"ejj#e$ejj%e&ejj'e(ejj)e*e+e,ej-e.e/e.ej0e1ej2e3ej4e5ej6e7ej8e9ej:e;iZd*ddZ<ej=dd Z>e?d	d
 Z@dd ZAdd ZBdd ZCdd ZDdd ZEdd ZFdd ZGdd ZHdd ZIdd ZJdd  ZK	!d+d"d#ZL	!d+d$d%ZMd&d' ZNd(d) ZOdS ),PGDialect_pg8000pg8000TformatNc                 K   s.   t j| fi | || _| jdk rtdd S )N)r         z$pg8000 1.16.6 or greater is required)r   rs   client_encoding_dbapi_versionr=   )r#   r   r   r&   r&   r'   rs     s
   
zPGDialect_pg8000.__init__c                 C   s4   | j rt| j drtdd td| j jD S dS )N__version__c                 S   s   g | ]}t |qS r&   )r   ).0xr&   r&   r'   
<listcomp>  s    z3PGDialect_pg8000._dbapi_version.<locals>.<listcomp>z(\d+)(?:[-\.]?|$))c   r   r   )r6   hasattrtuplerefindallr   rq   r&   r&   r'   r     s   	zPGDialect_pg8000._dbapi_versionc                 C   s   t dS )Nr   )
__import__)rU   r&   r&   r'   r6     rv   zPGDialect_pg8000.dbapic                 C   s8   |j dd}d|v rt|d |d< ||j g |fS )Nuser)usernameport)translate_connect_argsr   updatequery)r#   urloptsr&   r&   r'   create_connect_args  s
   z$PGDialect_pg8000.create_connect_argsc                 C   s*   t || jjrdt|v rdS dt|v S )Nznetwork errorTzconnection is closed)
isinstancer6   InterfaceErrorrO   )r#   eru   rm   r&   r&   r'   is_disconnect  s
   zPGDialect_pg8000.is_disconnectc                 C   s   | dd}t|dr|j}|dkrd|_d S || jv r5d|_| }|d|  |d |  d S t	d	|| j
d
| jf )N_ ru   
AUTOCOMMITTFz=SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL %sCOMMITzZInvalid value '%s' for isolation_level. Valid isolation levels for %s are %s or AUTOCOMMITz, )replacer   ru   
autocommit_isolation_lookuprm   rz   r   r   ArgumentErrornamejoin)r#   ru   levelrm   r&   r&   r'   set_isolation_level  s(   



z$PGDialect_pg8000.set_isolation_levelc                 C   B   |  }z|d|rdnd  |d W |  d S |  w )N-SET SESSION CHARACTERISTICS AS TRANSACTION %sz	READ ONLYz
READ WRITEr   rm   rz   r   r#   ru   rI   rm   r&   r&   r'   set_readonly     
zPGDialect_pg8000.set_readonlyc                 C   <   |  }z|d | d }W |  |dkS |  w )Nzshow transaction_read_onlyr   onrm   rz   r   r   r#   ru   rm   valr&   r&   r'   get_readonly     

zPGDialect_pg8000.get_readonlyc                 C   r   )Nr   
DEFERRABLEzNOT DEFERRABLEr   r   r   r&   r&   r'   set_deferrable  r   zPGDialect_pg8000.set_deferrablec                 C   r   )Nzshow transaction_deferrabler   r   r   r   r&   r&   r'   get_deferrable  r   zPGDialect_pg8000.get_deferrablec                 C   s@   t |dr|j}| }|d| d  |d |  d S )Nru   zSET CLIENT_ENCODING TO ''r   )r   ru   rm   rz   r   )r#   ru   r   rm   r&   r&   r'   set_client_encoding  s   

z$PGDialect_pg8000.set_client_encodingc                 C   s<   | j r|jdd |D   d S |jdi dd |D  d S )Nc                 S   s   g | ]\}}}|qS r&   r&   r   keydbtypesqltyper&   r&   r'   r      s    z7PGDialect_pg8000.do_set_input_sizes.<locals>.<listcomp>c                 S   s   i | ]
\}}}|r||qS r&   r&   r   r&   r&   r'   
<dictcomp>  s    z7PGDialect_pg8000.do_set_input_sizes.<locals>.<dictcomp>r&   )
positionalr   )r#   rm   list_of_tuplescontextr&   r&   r'   do_set_input_sizes  s   
z#PGDialect_pg8000.do_set_input_sizesc                 C      |j d|df d S Nr    )ru   	tpc_beginr#   ru   xidr&   r&   r'   do_begin_twophase     z"PGDialect_pg8000.do_begin_twophasec                 C   s   |j   d S r/   )ru   tpc_preparer   r&   r&   r'   do_prepare_twophase  s   z$PGDialect_pg8000.do_prepare_twophaseFc                 C   r   r   )ru   tpc_rollbackr#   ru   r   is_preparedrecoverr&   r&   r'   do_rollback_twophase     z%PGDialect_pg8000.do_rollback_twophasec                 C   r   r   )ru   
tpc_commitr   r&   r&   r'   do_commit_twophase  r   z#PGDialect_pg8000.do_commit_twophasec                 C   s   dd |j  D S )Nc                 S   s   g | ]}|d  qS )r   r&   )r   rowr&   r&   r'   r     s    z8PGDialect_pg8000.do_recover_twophase.<locals>.<listcomp>)ru   tpc_recover)r#   ru   r&   r&   r'   do_recover_twophase  s   z$PGDialect_pg8000.do_recover_twophasec                    s   g  dd }  | jd urfdd}  | jd ur+fdd}  | jr9fdd}  | t dkrG fdd}|S d S )Nc                 S   s   | j tj | j t< d S r/   )py_typesr   	text_typer   connr&   r&   r'   
on_connect!  r   z/PGDialect_pg8000.on_connect.<locals>.on_connectc                         |  j d S r/   )r   r   r   rq   r&   r'   r   (     c                    r   r/   )r   isolation_levelr   rq   r&   r'   r   /  r   c                    s    |  d j |  d j d S )Nr   i  )register_in_adapter_json_deserializerr   rq   r&   r'   r   6  s   r   c                    s    D ]}||  qd S r/   r&   )r   fn)fnsr&   r'   r   A  s   
)appendr   r   r   len)r#   r   r&   )r   r#   r'   r     s    





zPGDialect_pg8000.on_connectr/   )TF)Pr)   r*   r+   driversupports_statement_cachesupports_unicode_statementssupports_unicode_bindsdefault_paramstylesupports_sane_multi_rowcountrf   execution_ctx_clsr   statement_compilerr   preparersupports_server_side_cursorsuse_setinputsizesdescription_encodingr   update_copyr   colspecssqltypesNumericr-   Floatr   r   r3   Booleanrd   NullTyper`   r   r;   r   rD   JSONIndexTyper<   JSONIntIndexTyper?   JSONStrIndexTyperB   r   rE   IntervalrR   r	   DateTimerZ   Timer\   Integerr^   SmallIntegerr_   
BigIntegerrb   EnumrP   rs   memoized_propertyr   rY   r6   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r&   r&   r&   r'   r   W  s    	









r   )A__doc__r   r   uuidr   rG   baser   r   r   r   r	   r
   r   r   r   jsonr   r   r   r   r   r   r   r  r   sql.elementsr   r  r   r-   r3   r;   r  r<   r  r?   r  rB   rD   rE   rP   rR   r  rZ   r  r\   r  r^   r  r_   r  r`   r  rb   r  rd   counterrj   rf   rk   r   r   r   r$   r&   r&   r&   r'   <module>   s`   U	

8	 t