U
    ccB                     @   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                   @   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-8u86ls_i/sqlalchemy/dialects/postgresql/pg8000.pyresult_processorw   s$     z_PGNumeric.result_processorN)__name__
__module____qualname__r%   r#   r#   r#   r$   r   v   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_typeNr0   r#   r#   r#   r$   r1      s   r1   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$   r2      s   r2   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_typeNr4   r#   r#   r#   r$   r5      s   r5   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_typeNr4   r#   r#   r#   r$   r7      s   r7   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_typeNr4   r#   r#   r#   r$   r9      s   r9   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*   )strr<   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$   r:      s   
r:   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_typeNr4   r#   r#   r#   r$   rA      s   rA   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)rC   Zsecond_precision)clsintervalkwr#   r#   r$   adapt_emulated_to_native   s    z$_PGInterval.adapt_emulated_to_nativeN)r&   r'   r(   r/   classmethodrG   r#   r#   r#   r$   rC      s   rC   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_typeNr4   r#   r#   r#   r$   rI      s   rI   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_typeNr4   r#   r#   r#   r$   rK      s   rK   c                   @   s   e Zd Zdd ZdS )
_PGIntegerc                 C   s   |j S r*   r6   r-   r#   r#   r$   r/      s    z_PGInteger.get_dbapi_typeNr4   r#   r#   r#   r$   rL      s   rL   c                   @   s   e Zd Zdd ZdS )_PGSmallIntegerc                 C   s   |j S r*   r6   r-   r#   r#   r$   r/      s    z_PGSmallInteger.get_dbapi_typeNr4   r#   r#   r#   r$   rM      s   rM   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_typeNr4   r#   r#   r#   r$   rN      s   rN   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_typeNr4   r#   r#   r#   r$   rO      s   rO   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_typeNr4   r#   r#   r#   r$   rP      s   rP   c                   @   s   e Zd Zdd ZdS )_PGARRAYc                 C   s
   t || S r*   r   )r    Z	bindvaluer#   r#   r$   bind_expression  s    z_PGARRAY.bind_expressionN)r&   r'   r(   rR   r#   r#   r#   r$   rQ     s   rQ   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(   r[   r]   r#   r#   r#   r$   rS     s   rS   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 )rX   Tc                 C   s   || _ || _d S r*   )rZ   rY   )r    rY   rZ   r#   r#   r$   __init__  s    zServerSideCursor.__init__c                 C   s   | j jS r*   )rY   
connectionr\   r#   r#   r$   r_     s    zServerSideCursor.connectionc                 C   s   | j jS r*   )rY   rowcountr\   r#   r#   r$   r`   "  s    zServerSideCursor.rowcountc                 C   s   | j jS r*   )rY   descriptionr\   r#   r#   r$   ra   &  s    zServerSideCursor.descriptionr#   Nc                 C   s(   d| j  d | }| jj|||d | S )NzDECLARE z NO SCROLL CURSOR FOR )stream)rZ   rY   execute)r    	operationargsrb   opr#   r#   r$   rc   *  s    zServerSideCursor.executec                 C   s   | j || | S r*   )rY   executemany)r    rd   Z
param_setsr#   r#   r$   rg   /  s    zServerSideCursor.executemanyc                 C   s   | j d| j  | j  S )NzFETCH FORWARD 1 FROM )rY   rc   rZ   fetchoner\   r#   r#   r$   rh   3  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 )fetchallrY   rc   r@   intrZ   )r    numr#   r#   r$   	fetchmany7  s    zServerSideCursor.fetchmanyc                 C   s   | j d| j  | j  S )NzFETCH FORWARD ALL FROM )rY   rc   rZ   ri   r\   r#   r#   r$   ri   @  s    zServerSideCursor.fetchallc                 C   s    | j d| j  | j   d S )NzCLOSE )rY   rc   rZ   closer\   r#   r#   r$   rm   D  s    zServerSideCursor.closec                 G   s   | j j|  d S r*   )rY   setinputsizes)r    Zsizesr#   r#   r$   rn   H  s    zServerSideCursor.setinputsizesc                 C   s   d S r*   r#   )r    sizecolumnr#   r#   r$   setoutputsizeK  s    zServerSideCursor.setoutputsize)r#   N)N)N)r&   r'   r(   server_sider^   propertyr_   r`   ra   rc   rg   rh   rl   ri   rm   rn   rq   r#   r#   r#   r$   rX     s    




	rX   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operatorrF   r#   r#   r$   visit_mod_binaryP  s    z"PGCompiler_pg8000.visit_mod_binaryN)r&   r'   r(   ry   r#   r#   r#   r$   rt   O  s   rt   c                   @   s   e Zd Zdd ZdS )PGIdentifierPreparer_pg8000c                 O   s   t j| f|| d| _d S )NF)r   r^   Z_double_percents)r    re   kwargsr#   r#   r$   r^   Y  s    z$PGIdentifierPreparer_pg8000.__init__N)r&   r'   r(   r^   r#   r#   r#   r$   rz   X  s   rz   c                +   @   sd  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;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  ZMd+d"d#ZNd,d$d%ZOd&d' ZPd(d) ZQd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   r^   client_encoding_dbapi_versionr3   )r    r   r{   r#   r#   r$   r^     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#   )rj   ).0xr#   r#   r$   
<listcomp>  s   z3PGDialect_pg8000._dbapi_version.<locals>.<listcomp>z(\d+)(?:[-\.]?|$))c   r   r   )r.   hasattrtuplerefindallr   r\   r#   r#   r$   r     s     	zPGDialect_pg8000._dbapi_versionc                 C   s   t dS )Nr}   )
__import__)rD   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_argsrj   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    er_   rY   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_ 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_lookuprY   rc   rm   r   ArgumentErrornamejoin)r    r_   levelrY   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   rY   rm   rc   r    r_   r=   rY   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rY   rm   rc   rh   r    r_   rY   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 )Nr   zSET CLIENT_ENCODING TO ''r   )r   r   rY   rc   rm   )r    r_   r   rY   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>)
positionalrn   )r    rY   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    )r_   Z	tpc_beginr    r_   xidr#   r#   r$   do_begin_twophase  s    z"PGDialect_pg8000.do_begin_twophasec                 C   s   |j   d S r*   )r_   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   )r_   Ztpc_rollbackr    r_   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   )r_   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>)r_   Ztpc_recover)r    r_   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   r\   r#   r$   r   0  s    c                    s     |  j d S r*   )r   isolation_levelr   r\   r#   r$   r   7  s    c                    s    |  d j |  d j d S )Nr   i  )Zregister_in_adapter_json_deserializerr   r\   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_connect)N)TF)TF)Rr&   r'   r(   ZdriverZsupports_statement_cacheZsupports_unicode_statementsZsupports_unicode_bindsZdefault_paramstyleZsupports_sane_multi_rowcountrS   Zexecution_ctx_clsrt   Zstatement_compilerrz   preparerZsupports_server_side_cursorsZuse_setinputsizesZdescription_encodingr   Zupdate_copyr   ZcolspecssqltypesNumericr)   ZFloatr   r   r,   BooleanrP   NullTyperN   r   r1   r   r9   JSONIndexTyper2   JSONIntIndexTyper5   JSONStrIndexTyper7   r   r:   ZIntervalrC   r   DateTimerI   TimerK   IntegerrL   SmallIntegerrM   
BigIntegerrO   EnumrA   r   rQ   r^   Zmemoized_propertyr   rH   r.   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   r;   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)   r,   r1   r   r2   r   r5   r   r7   r9   r:   rA   rC   r   rI   r   rK   r   rL   r   rM   r   rN   r   rO   r   rP   rQ   counterrW   rS   rX   rt   rz   r|   r!   r#   r#   r#   r$   <module>   sd   U	

8	 u