U
    9aA                     @   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                   @   s   e Zd Zdd ZdS )
_PGNumericc                 C   sv   | j rB|tkrttj| jS |tks.|tkr2d S t	
d| n0|tkrNd S |tks^|tkrdtjS t	
d| d S )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    I/tmp/pip-unpacked-wheel-7pet0iyd/sqlalchemy/dialects/postgresql/pg8000.pyresult_processoru   s$     z_PGNumeric.result_processorN)__name__
__module____qualname__r"   r    r    r    r!   r   t   s   r   c                   @   s   e Zd Zdd ZdS )_PGNumericNoBindc                 C   s   d S Nr    )r   r   r    r    r!   bind_processor   s    z_PGNumericNoBind.bind_processorN)r#   r$   r%   r(   r    r    r    r!   r&      s   r&   c                   @   s   e Zd Zdd Zdd ZdS )_PGJSONc                 C   s   d S r'   r    r   r    r    r!   r"      s    z_PGJSON.result_processorc                 C   s   |j S r'   r   r   dbapir    r    r!   get_dbapi_type   s    z_PGJSON.get_dbapi_typeNr#   r$   r%   r"   r,   r    r    r    r!   r)      s   r)   c                   @   s   e Zd Zdd Zdd ZdS )_PGJSONBc                 C   s   d S r'   r    r   r    r    r!   r"      s    z_PGJSONB.result_processorc                 C   s   |j S r'   r   r*   r    r    r!   r,      s    z_PGJSONB.get_dbapi_typeNr-   r    r    r    r!   r.      s   r.   c                   @   s   e Zd Zdd ZdS )_PGJSONIndexTypec                 C   s   t dd S )Nzshould not be here)NotImplementedErrorr*   r    r    r!   r,      s    z_PGJSONIndexType.get_dbapi_typeNr#   r$   r%   r,   r    r    r    r!   r/      s   r/   c                   @   s   e Zd Zdd ZdS )_PGJSONIntIndexTypec                 C   s   |j S r'   ZINTEGERr*   r    r    r!   r,      s    z"_PGJSONIntIndexType.get_dbapi_typeNr1   r    r    r    r!   r2      s   r2   c                   @   s   e Zd Zdd ZdS )_PGJSONStrIndexTypec                 C   s   |j S r'   )STRINGr*   r    r    r!   r,      s    z"_PGJSONStrIndexType.get_dbapi_typeNr1   r    r    r    r!   r4      s   r4   c                   @   s   e Zd Zdd ZdS )_PGJSONPathTypec                 C   s   dS )Ni  r    r*   r    r    r!   r,      s    z_PGJSONPathType.get_dbapi_typeNr1   r    r    r    r!   r6      s   r6   c                   @   s   e Zd Zdd Zdd ZdS )_PGUUIDc                 C   s   | j sdd }|S d S )Nc                 S   s   | d k	rt | } | S r'   )_python_UUIDvaluer    r    r!   process   s    z'_PGUUID.bind_processor.<locals>.processZas_uuid)r   r   r;   r    r    r!   r(      s    z_PGUUID.bind_processorc                 C   s   | j sdd }|S d S )Nc                 S   s   | d k	rt | } | S r'   )strr9   r    r    r!   r;      s    z)_PGUUID.result_processor.<locals>.processr<   )r   r   r   r;   r    r    r!   r"      s    z_PGUUID.result_processorN)r#   r$   r%   r(   r"   r    r    r    r!   r7      s   
r7   c                   @   s   e Zd Zdd ZdS )_PGEnumc                 C   s   |j S r'   )UNKNOWNr*   r    r    r!   r,      s    z_PGEnum.get_dbapi_typeNr1   r    r    r    r!   r>      s   r>   c                   @   s    e Zd Zdd Zedd ZdS )_PGIntervalc                 C   s   |j S r'   r   r*   r    r    r!   r,      s    z_PGInterval.get_dbapi_typec                 K   s   t |jdS )N)Z	precision)r@   Zsecond_precision)clsintervalkwr    r    r!   adapt_emulated_to_native   s    z$_PGInterval.adapt_emulated_to_nativeN)r#   r$   r%   r,   classmethodrD   r    r    r    r!   r@      s   r@   c                   @   s   e Zd Zdd ZdS )_PGTimeStampc                 C   s   | j r
dS dS d S )Ni  iZ  )timezoner*   r    r    r!   r,      s    z_PGTimeStamp.get_dbapi_typeNr1   r    r    r    r!   rF      s   rF   c                   @   s   e Zd Zdd ZdS )_PGTimec                 C   s   |j S r'   )ZTIMEr*   r    r    r!   r,      s    z_PGTime.get_dbapi_typeNr1   r    r    r    r!   rH      s   rH   c                   @   s   e Zd Zdd ZdS )
_PGIntegerc                 C   s   |j S r'   r3   r*   r    r    r!   r,      s    z_PGInteger.get_dbapi_typeNr1   r    r    r    r!   rI      s   rI   c                   @   s   e Zd Zdd ZdS )_PGSmallIntegerc                 C   s   |j S r'   r3   r*   r    r    r!   r,      s    z_PGSmallInteger.get_dbapi_typeNr1   r    r    r    r!   rJ      s   rJ   c                   @   s   e Zd Zdd ZdS )_PGNullTypec                 C   s   |j S r'   )ZNULLTYPEr*   r    r    r!   r,      s    z_PGNullType.get_dbapi_typeNr1   r    r    r    r!   rK      s   rK   c                   @   s   e Zd Zdd ZdS )_PGBigIntegerc                 C   s   |j S r'   )Z
BIGINTEGERr*   r    r    r!   r,      s    z_PGBigInteger.get_dbapi_typeNr1   r    r    r    r!   rL      s   rL   c                   @   s   e Zd Zdd ZdS )
_PGBooleanc                 C   s   |j S r'   )ZBOOLEANr*   r    r    r!   r,      s    z_PGBoolean.get_dbapi_typeNr1   r    r    r    r!   rM      s   rM   c                   @   s   e Zd Zdd Zdd ZdS )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'   )Zcompiledr   r    r    r!   pre_exec  s    z"PGExecutionContext_pg8000.pre_execN)r#   r$   r%   rV   rX   r    r    r    r!   rN     s   rN   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 )rS   Tc                 C   s   || _ || _d S r'   )rU   rT   )r   rT   rU   r    r    r!   __init__  s    zServerSideCursor.__init__c                 C   s   | j jS r'   )rT   
connectionrW   r    r    r!   rZ     s    zServerSideCursor.connectionc                 C   s   | j jS r'   )rT   rowcountrW   r    r    r!   r[     s    zServerSideCursor.rowcountc                 C   s   | j jS r'   )rT   descriptionrW   r    r    r!   r\     s    zServerSideCursor.descriptionr    Nc                 C   s(   d| j  d | }| jj|||d | S )NzDECLARE z NO SCROLL CURSOR FOR )stream)rU   rT   execute)r   	operationargsr]   opr    r    r!   r^   #  s    zServerSideCursor.executec                 C   s   | j || | S r'   )rT   executemany)r   r_   Z
param_setsr    r    r!   rb   (  s    zServerSideCursor.executemanyc                 C   s   | j d| j  | j  S )NzFETCH FORWARD 1 FROM )rT   r^   rU   fetchonerW   r    r    r!   rc   ,  s    zServerSideCursor.fetchonec                 C   s@   |d kr|   S | jdtt| d | j  | j  S d S )NzFETCH FORWARD z FROM )fetchallrT   r^   r=   intrU   )r   numr    r    r!   	fetchmany0  s    zServerSideCursor.fetchmanyc                 C   s   | j d| j  | j  S )NzFETCH FORWARD ALL FROM )rT   r^   rU   rd   rW   r    r    r!   rd   9  s    zServerSideCursor.fetchallc                 C   s    | j d| j  | j   d S )NzCLOSE )rT   r^   rU   closerW   r    r    r!   rh   =  s    zServerSideCursor.closec                 G   s   | j j|  d S r'   )rT   setinputsizes)r   Zsizesr    r    r!   ri   A  s    zServerSideCursor.setinputsizesc                 C   s   d S r'   r    )r   sizecolumnr    r    r!   setoutputsizeD  s    zServerSideCursor.setoutputsize)r    N)N)N)r#   r$   r%   server_siderY   propertyrZ   r[   r\   r^   rb   rc   rg   rd   rh   ri   rl   r    r    r    r!   rS     s    




	rS   c                   @   s   e Zd Zdd ZdS )PGCompiler_pg8000c                 K   s$   | j |jf|d | j |jf| S )Nz %% )r;   leftright)r   binaryoperatorrC   r    r    r!   visit_mod_binaryI  s    z"PGCompiler_pg8000.visit_mod_binaryN)r#   r$   r%   rt   r    r    r    r!   ro   H  s   ro   c                   @   s   e Zd Zdd ZdS )PGIdentifierPreparer_pg8000c                 O   s   t j| f|| d| _d S )NF)r   rY   Z_double_percents)r   r`   kwargsr    r    r!   rY   R  s    z$PGIdentifierPreparer_pg8000.__init__N)r#   r$   r%   rY   r    r    r    r!   ru   Q  s   ru   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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j0e1ej2e3ej4e5ej6e7e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  ZKd+d"d#ZLd,d$d%ZMd&d' ZNd(d) ZOdS )-PGDialect_pg8000pg8000TformatNc                 K   s*   t j| f| || _| jdk r&tdd S )N)r         z$pg8000 1.16.6 or greater is required)r   rY   client_encoding_dbapi_versionr0   )r   r|   rv   r    r    r!   rY     s    
zPGDialect_pg8000.__init__c                 C   s8   | j r0t| j dr0tdd td| j jD S dS d S )N__version__c                 S   s   g | ]}t |qS r    )re   ).0xr    r    r!   
<listcomp>  s   z3PGDialect_pg8000._dbapi_version.<locals>.<listcomp>z(\d+)(?:[-\.]?|$))c   r   r   )r+   hasattrtuplerefindallr~   rW   r    r    r!   r}     s     	zPGDialect_pg8000._dbapi_versionc                 C   s   t dS )Nrx   )
__import__)rA   r    r    r!   r+     s    zPGDialect_pg8000.dbapic                 C   s8   |j dd}d|kr$t|d |d< ||j g |fS )Nuser)usernameport)Ztranslate_connect_argsre   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|krdS dt|kS )Nznetwork errorTzconnection is closed)
isinstancer+   ZInterfaceErrorr=   )r   erZ   rT   r    r    r!   is_disconnect  s
    zPGDialect_pg8000.is_disconnectc                 C   s   | dd}t|dr|j}|dkr,d|_nX|| jkrfd|_| }|d|  |d |  nt	d	|| j
d
| jf d S )N_ rZ   Z
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   rZ   Z
autocommitZ_isolation_lookuprT   r^   rh   r   ArgumentErrornamejoin)r   rZ   levelrT   r    r    r!   set_isolation_level  s(    



z$PGDialect_pg8000.set_isolation_levelc                 C   s<   |  }z$|d|rdnd  |d W 5 |  X d S )N-SET SESSION CHARACTERISTICS AS TRANSACTION %sz	READ ONLYz
READ WRITEr   rT   rh   r^   r   rZ   r:   rT   r    r    r!   set_readonly  s    
zPGDialect_pg8000.set_readonlyc                 C   s6   |  }z|d | d }W 5 |  X |dkS )Nzshow transaction_read_onlyr   onrT   rh   r^   rc   r   rZ   rT   valr    r    r!   get_readonly  s    

zPGDialect_pg8000.get_readonlyc                 C   s<   |  }z$|d|rdnd  |d W 5 |  X d S )Nr   Z
DEFERRABLEzNOT DEFERRABLEr   r   r   r    r    r!   set_deferrable  s    
zPGDialect_pg8000.set_deferrablec                 C   s6   |  }z|d | d }W 5 |  X |dkS )Nzshow transaction_deferrabler   r   r   r   r    r    r!   get_deferrable  s    

zPGDialect_pg8000.get_deferrablec                 C   s@   t |dr|j}| }|d| d  |d |  d S )NrZ   zSET CLIENT_ENCODING TO ''r   )r   rZ   rT   r^   rh   )r   rZ   r|   rT   r    r    r!   set_client_encoding  s    

z$PGDialect_pg8000.set_client_encodingc                 C   s6   | j r|jdd |D   n|jf 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>)
positionalri   )r   rT   Zlist_of_tuplescontextr    r    r!   do_set_input_sizes  s    z#PGDialect_pg8000.do_set_input_sizesc                 C   s   |j d|df d S Nr    )rZ   Z	tpc_beginr   rZ   xidr    r    r!   do_begin_twophase  s    z"PGDialect_pg8000.do_begin_twophasec                 C   s   |j   d S r'   )rZ   Ztpc_preparer   r    r    r!   do_prepare_twophase  s    z$PGDialect_pg8000.do_prepare_twophaseFc                 C   s   |j d|df d S r   )rZ   Ztpc_rollbackr   rZ   r   Zis_preparedZrecoverr    r    r!   do_rollback_twophase  s    z%PGDialect_pg8000.do_rollback_twophasec                 C   s   |j d|df d S r   )rZ   Z
tpc_commitr   r    r    r!   do_commit_twophase  s    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>)rZ   Ztpc_recover)r   rZ   r    r    r!   do_recover_twophase  s    z$PGDialect_pg8000.do_recover_twophasec                    s   g  dd }  | jd k	r6fdd}  | jd k	rVfdd}  | jrrfdd}  | t dkr fdd}|S 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!  s    z/PGDialect_pg8000.on_connect.<locals>.on_connectc                    s     |  j d S r'   )r   r|   r   rW   r    r!   r   (  s    c                    s     |  j d S r'   )r   isolation_levelr   rW   r    r!   r   /  s    c                    s    |  d j |  d j d S )Nr   i  )Zregister_in_adapter_json_deserializerr   rW   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_connect)N)TF)TF)Pr#   r$   r%   ZdriverZsupports_statement_cacheZsupports_unicode_statementsZsupports_unicode_bindsZdefault_paramstyleZsupports_sane_multi_rowcountrN   Zexecution_ctx_clsro   Zstatement_compilerru   preparerZsupports_server_side_cursorsZuse_setinputsizesZdescription_encodingr   Zupdate_copyr   ZcolspecssqltypesNumericr&   ZFloatr   r   r)   BooleanrM   NullTyperK   r   r.   r   r6   JSONIndexTyper/   JSONIntIndexTyper2   JSONStrIndexTyper4   r   r7   ZIntervalr@   r	   DateTimerF   TimerH   IntegerrI   SmallIntegerrJ   
BigIntegerrL   Enumr>   rY   Zmemoized_propertyr}   rE   r+   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r    r    r!   rw   W  s                      






   
   
rw   )A__doc__r   r   uuidr   r8   baser   r   r   r   r	   r
   r   r   r   jsonr   r   r   r   r   r   r   r   r   Zsql.elementsr   r   r   r&   r)   r.   r   r/   r   r2   r   r4   r6   r7   r>   r@   r   rF   r   rH   r   rI   r   rJ   r   rK   r   rL   r   rM   counterrR   rN   rS   ro   ru   rw   r   r    r    r    r!   <module>   s^   U	

8	 t