o
    RcD                     @   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 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/d0 d0ej/Z0G d1d2 d2ej1Z2G d3d4 d4ej3Z4G d5d6 d6ej5Z6G d7d8 d8ej7Z8G d9d: d:ej9Z:G d;d< d<ej;Z<G d=d> d>eZ=e> Z?G d?d@ d@eZ@G dAdB dBZAG dCdD dDeZBG dEdF dFeZCG dGdH dHeZDeDZEdS )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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)Z	asdecimalr   r   Zto_decimal_processor_factorydecimalDecimalZ_effective_decimal_return_scaler   r	   r   ZInvalidRequestErrorZto_floatselfdialectcoltype r$   GD:\Flask\env\Lib\site-packages\sqlalchemy/dialects/postgresql/pg8000.pyresult_processorw   s"   z_PGNumeric.result_processorN)__name__
__module____qualname__r&   r$   r$   r$   r%   r   v       r   c                   @   r   )_PGNumericNoBindc                 C      d S Nr$   )r!   r"   r$   r$   r%   bind_processor      z_PGNumericNoBind.bind_processorN)r'   r(   r)   r.   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&      r/   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&   r5   r$   r$   r$   r%   r1          r1   c                   @   r0   )_PGJSONBc                 C   r,   r-   r$   r    r$   r$   r%   r&      r/   z_PGJSONB.result_processorc                 C   r2   r-   r   r3   r$   r$   r%   r5      r6   z_PGJSONB.get_dbapi_typeNr7   r$   r$   r$   r%   r9      r8   r9   c                   @   r   )_PGJSONIndexTypec                 C   s   t d)Nzshould not be here)NotImplementedErrorr3   r$   r$   r%   r5      s   z_PGJSONIndexType.get_dbapi_typeNr'   r(   r)   r5   r$   r$   r$   r%   r:      r*   r:   c                   @   r   )_PGJSONIntIndexTypec                 C   r2   r-   ZINTEGERr3   r$   r$   r%   r5      r6   z"_PGJSONIntIndexType.get_dbapi_typeNr<   r$   r$   r$   r%   r=      r*   r=   c                   @   r   )_PGJSONStrIndexTypec                 C   r2   r-   )STRINGr3   r$   r$   r%   r5      r6   z"_PGJSONStrIndexType.get_dbapi_typeNr<   r$   r$   r$   r%   r?      r*   r?   c                   @   r   )_PGJSONPathTypec                 C   s   dS )Ni  r$   r3   r$   r$   r%   r5      r/   z_PGJSONPathType.get_dbapi_typeNr<   r$   r$   r$   r%   rA      r*   rA   c                   @   r0   )_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Zas_uuid)r!   r"   rG   r$   r$   r%   r.         z_PGUUID.bind_processorc                 C   s   | j s	dd }|S d S )Nc                 S   rC   r-   )strrE   r$   r$   r%   rG      rH   z)_PGUUID.result_processor.<locals>.processrI   )r!   r"   r#   rG   r$   r$   r%   r&      rJ   z_PGUUID.result_processorN)r'   r(   r)   r.   r&   r$   r$   r$   r%   rB      s    
rB   c                   @   r   )_PGEnumc                 C   r2   r-   )UNKNOWNr3   r$   r$   r%   r5      r6   z_PGEnum.get_dbapi_typeNr<   r$   r$   r$   r%   rL      r*   rL   c                   @   s    e Zd Zdd Zedd ZdS )_PGIntervalc                 C   r2   r-   r   r3   r$   r$   r%   r5      r6   z_PGInterval.get_dbapi_typec                 K   s   t |jdS )N)	precision)rN   Zsecond_precision)clsintervalkwr$   r$   r%   adapt_emulated_to_native   s   z$_PGInterval.adapt_emulated_to_nativeN)r'   r(   r)   r5   classmethodrS   r$   r$   r$   r%   rN      s    rN   c                   @   r   )_PGTimeStampc                 C   s   | j rdS dS )Ni  iZ  )timezoner3   r$   r$   r%   r5      s   z_PGTimeStamp.get_dbapi_typeNr<   r$   r$   r$   r%   rU      r*   rU   c                   @   r   )_PGTimec                 C   r2   r-   )ZTIMEr3   r$   r$   r%   r5      r6   z_PGTime.get_dbapi_typeNr<   r$   r$   r$   r%   rW      r*   rW   c                   @   r   )
_PGIntegerc                 C   r2   r-   r>   r3   r$   r$   r%   r5      r6   z_PGInteger.get_dbapi_typeNr<   r$   r$   r$   r%   rX      r*   rX   c                   @   r   )_PGSmallIntegerc                 C   r2   r-   r>   r3   r$   r$   r%   r5      r6   z_PGSmallInteger.get_dbapi_typeNr<   r$   r$   r$   r%   rY      r*   rY   c                   @   r   )_PGNullTypec                 C   r2   r-   )ZNULLTYPEr3   r$   r$   r%   r5      r6   z_PGNullType.get_dbapi_typeNr<   r$   r$   r$   r%   rZ      r*   rZ   c                   @   r   )_PGBigIntegerc                 C   r2   r-   )Z
BIGINTEGERr3   r$   r$   r%   r5      r6   z_PGBigInteger.get_dbapi_typeNr<   r$   r$   r$   r%   r[      r*   r[   c                   @   r   )
_PGBooleanc                 C   r2   r-   )BOOLEANr3   r$   r$   r%   r5     r6   z_PGBoolean.get_dbapi_typeNr<   r$   r$   r$   r%   r\      r*   r\   c                   @   r   )_PGARRAYc                 C   s
   t || S r-   r   )r!   Z	bindvaluer$   r$   r%   bind_expression  s   
z_PGARRAY.bind_expressionN)r'   r(   r)   r_   r$   r$   r$   r%   r^     r*   r^   c                   @   r0   )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ServerSideCursorZ_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)   rh   rk   r$   r$   r$   r%   r`     s    r`   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 )re   Tc                 C   s   || _ || _d S r-   )rg   rf   )r!   rf   rg   r$   r$   r%   __init__  s   
zServerSideCursor.__init__c                 C      | j jS r-   )rf   
connectionrj   r$   r$   r%   rn        zServerSideCursor.connectionc                 C   rm   r-   )rf   rowcountrj   r$   r$   r%   rp   "  ro   zServerSideCursor.rowcountc                 C   rm   r-   )rf   descriptionrj   r$   r$   r%   rq   &  ro   zServerSideCursor.descriptionr$   Nc                 C   s(   d| j  d | }| jj|||d | S )NzDECLARE z NO SCROLL CURSOR FOR )stream)rg   rf   execute)r!   	operationargsrr   opr$   r$   r%   rs   *  s   zServerSideCursor.executec                 C   s   | j || | S r-   )rf   executemany)r!   rt   Z
param_setsr$   r$   r%   rw   /  s   zServerSideCursor.executemanyc                 C      | j d| j  | j  S )NzFETCH FORWARD 1 FROM )rf   rs   rg   fetchonerj   r$   r$   r%   ry   3     
zServerSideCursor.fetchonec                 C   s<   |d u r|   S | jdtt| d | j  | j  S )NzFETCH FORWARD z FROM )fetchallrf   rs   rK   intrg   )r!   numr$   r$   r%   	fetchmany7  s   
zServerSideCursor.fetchmanyc                 C   rx   )NzFETCH FORWARD ALL FROM )rf   rs   rg   r{   rj   r$   r$   r%   r{   @  rz   zServerSideCursor.fetchallc                 C   s    | j d| j  | j   d S )NzCLOSE )rf   rs   rg   closerj   r$   r$   r%   r   D  s   zServerSideCursor.closec                 G   s   | j j|  d S r-   )rf   setinputsizes)r!   sizesr$   r$   r%   r   H  s   zServerSideCursor.setinputsizesc                 C   r,   r-   r$   )r!   sizecolumnr$   r$   r%   setoutputsizeK  r/   zServerSideCursor.setoutputsize)r$   Nr-   )r'   r(   r)   server_siderl   propertyrn   rp   rq   rs   rw   ry   r~   r{   r   r   r   r$   r$   r$   r%   re     s"    




	re   c                   @   r   )PGCompiler_pg8000c                 K   s,   | j |jfi |d | j |jfi | S )Nz %% )rG   leftright)r!   binaryoperatorrR   r$   r$   r%   visit_mod_binaryP  s   z"PGCompiler_pg8000.visit_mod_binaryN)r'   r(   r)   r   r$   r$   r$   r%   r   O  r*   r   c                   @   r   )PGIdentifierPreparer_pg8000c                 O   s"   t j| g|R i | d| _d S )NF)r   rl   Z_double_percents)r!   ru   kwargsr$   r$   r%   rl   Y  s   
z$PGIdentifierPreparer_pg8000.__init__N)r'   r(   r)   rl   r$   r$   r$   r%   r   X  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;ej<e=iZd*ddZ>ej?dd Z@eAd	d
 ZBdd ZCdd ZDdd ZEdd ZFdd ZGdd ZHdd ZIdd ZJdd ZKdd ZLdd  ZM	!d+d"d#ZN	!d+d$d%ZOd&d' ZPd(d) ZQd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   rl   client_encoding_dbapi_versionr;   )r!   r   r   r$   r$   r%   rl     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   )r4   hasattrtuplerefindallr   rj   r$   r$   r%   r     s   	zPGDialect_pg8000._dbapi_versionc                 C   s   t dS )Nr   )
__import__)rP   r$   r$   r%   r4     ro   zPGDialect_pg8000.dbapic                 C   s8   |j dd}d|v rt|d |d< ||j g |fS )Nuser)usernameport)Z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)
isinstancer4   ZInterfaceErrorrK   )r!   ern   rf   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_ dbapi_connectionZ
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   r   Z
autocommitZ_isolation_lookuprf   rs   r   r   ArgumentErrornamejoin)r!   rn   levelrf   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   rf   rs   r   r!   rn   rF   rf   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rf   rs   ry   r   r!   rn   rf   valr$   r$   r%   get_readonly     

zPGDialect_pg8000.get_readonlyc                 C   r   )Nr   Z
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 )Nr   zSET CLIENT_ENCODING TO ''r   )r   r   rf   rs   r   )r!   rn   r   rf   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   keyZdbtypeZ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!   rf   Z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    )rn   Z	tpc_beginr!   rn   xidr$   r$   r%   do_begin_twophase     z"PGDialect_pg8000.do_begin_twophasec                 C   s   |j   d S r-   )rn   Ztpc_preparer   r$   r$   r%   do_prepare_twophase  s   z$PGDialect_pg8000.do_prepare_twophaseFc                 C   r   r   )rn   Ztpc_rollbackr!   rn   r   Zis_preparedZrecoverr$   r$   r%   do_rollback_twophase     z%PGDialect_pg8000.do_rollback_twophasec                 C   r   r   )rn   Z
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>)rn   Ztpc_recover)r!   rn   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-   )Z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   rj   r$   r%   r   0     c                    r   r-   )r   isolation_levelr   rj   r$   r%   r   7  r   c                    s    |  d j |  d j d S )Nr   i  )Zregister_in_adapter_json_deserializerr   rj   r$   r%   r   >  s   r   c                    s    D ]}||  qd S r-   r$   )r   fn)fnsr$   r%   r   I  s   
)appendr   r   r   len)r!   r   r$   )r   r!   r%   r   &  s    





zPGDialect_pg8000.on_connectr-   )TF)Rr'   r(   r)   ZdriverZsupports_statement_cacheZsupports_unicode_statementsZsupports_unicode_bindsZdefault_paramstyleZsupports_sane_multi_rowcountr`   Zexecution_ctx_clsr   Zstatement_compilerr   preparerZsupports_server_side_cursorsZuse_setinputsizesZdescription_encodingr   Zupdate_copyr   ZcolspecssqltypesNumericr+   Floatr   r   r1   Booleanr\   NullTyperZ   r   r9   r   rA   JSONIndexTyper:   JSONIntIndexTyper=   JSONStrIndexTyper?   r   rB   ZIntervalrN   r   DateTimerU   TimerW   IntegerrX   SmallIntegerrY   
BigIntegerr[   EnumrL   r   r^   rl   Zmemoized_propertyr   rT   r4   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r$   r$   r$   r%   r   ^  s    	









r   )F__doc__r   r   uuidr   rD   arrayr   ZPGARRAYbaser   r   r   r	   r
   r   r   r   r   r   jsonr   r   r   r   r   r   r   r   r   Zsql.elementsr   r   r   r+   r1   r9   r   r:   r   r=   r   r?   rA   rB   rL   rN   r   rU   r   rW   r   rX   r   rY   r   rZ   r   r[   r   r\   r^   counterrd   r`   re   r   r   r   r"   r$   r$   r$   r%   <module>   sf   U	

8	 u