3
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j9 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jtj| jS |tks.|tkr2d S t	j
d| n0|tkrNd S |tks^|tkrdtjS t	j
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   K/tmp/pip-build-6_cqtusv/SQLAlchemy/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 )Nr   )r   r   r   r   r   r   r      s    z_PGJSON.result_processorc             C   s   |j S )N)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 )Nr   )r   r   r   r   r   r   r      s    z_PGJSONB.result_processorc             C   s   |j S )N)r   )r   r%   r   r   r   r&      s    z_PGJSONB.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S )_PGJSONIndexTypec             C   s   t dd S )Nzshould not be here)NotImplementedError)r   r%   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 )N)INTEGER)r   r%   r   r   r   r&      s    z"_PGJSONIntIndexType.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 )_PGJSONStrIndexTypec             C   s   |j S )N)STRING)r   r%   r   r   r   r&      s    z"_PGJSONStrIndexType.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 )_PGJSONPathTypec             C   s   dS )Ni  r   )r   r%   r   r   r   r&      s    z_PGJSONPathType.get_dbapi_typeN)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 )_PGUUIDc             C   s   | j sdd }|S d S )Nc             S   s   | d k	rt | } | S )N)_python_UUID)valuer   r   r   process   s    z'_PGUUID.bind_processor.<locals>.process)as_uuid)r   r   r2   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 )N)str)r1   r   r   r   r2      s    z)_PGUUID.result_processor.<locals>.process)r3   )r   r   r   r2   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 )N)UNKNOWN)r   r%   r   r   r   r&      s    z_PGEnum.get_dbapi_typeN)r   r    r!   r&   r   r   r   r   r5      s   r5   c               @   s    e Zd Zdd Zedd ZdS )_PGIntervalc             C   s   |j S )N)r   )r   r%   r   r   r   r&      s    z_PGInterval.get_dbapi_typec             K   s   t |jdS )N)Z	precision)r7   Zsecond_precision)clsintervalkwr   r   r   adapt_emulated_to_native   s    z$_PGInterval.adapt_emulated_to_nativeN)r   r    r!   r&   classmethodr;   r   r   r   r   r7      s   r7   c               @   s   e Zd Zdd ZdS )_PGTimeStampc             C   s   | j r
dS dS d S )Ni  iZ  )timezone)r   r%   r   r   r   r&      s    z_PGTimeStamp.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 )_PGTimec             C   s   |j S )N)ZTIME)r   r%   r   r   r   r&      s    z_PGTime.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 )
_PGIntegerc             C   s   |j S )N)r+   )r   r%   r   r   r   r&      s    z_PGInteger.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 )_PGSmallIntegerc             C   s   |j S )N)r+   )r   r%   r   r   r   r&      s    z_PGSmallInteger.get_dbapi_typeN)r   r    r!   r&   r   r   r   r   rA      s   rA   c               @   s   e Zd Zdd ZdS )_PGNullTypec             C   s   |j S )N)ZNULLTYPE)r   r%   r   r   r   r&      s    z_PGNullType.get_dbapi_typeN)r   r    r!   r&   r   r   r   r   rB      s   rB   c               @   s   e Zd Zdd ZdS )_PGBigIntegerc             C   s   |j S )N)Z
BIGINTEGER)r   r%   r   r   r   r&      s    z_PGBigInteger.get_dbapi_typeN)r   r    r!   r&   r   r   r   r   rC      s   rC   c               @   s   e Zd Zdd ZdS )
_PGBooleanc             C   s   |j S )N)ZBOOLEAN)r   r%   r   r   r   r&      s    z_PGBoolean.get_dbapi_typeN)r   r    r!   r&   r   r   r   r   rD      s   rD   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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 )N)Zcompiled)r   r   r   r   pre_exec  s    z"PGExecutionContext_pg8000.pre_execN)r   r    r!   rM   rN   r   r   r   r   rE     s   rE   c               @   s   e Zd ZdZdd Zedd Zedd Zedd	 Zf d
f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 )rJ   Tc             C   s   || _ || _d S )N)rL   rK   )r   rK   rL   r   r   r   __init__  s    zServerSideCursor.__init__c             C   s   | j jS )N)rK   
connection)r   r   r   r   rP     s    zServerSideCursor.connectionc             C   s   | j jS )N)rK   rowcount)r   r   r   r   rQ     s    zServerSideCursor.rowcountc             C   s   | j jS )N)rK   description)r   r   r   r   rR     s    zServerSideCursor.descriptionNc             C   s(   d| j  d | }| jj|||d | S )NzDECLARE z NO SCROLL CURSOR FOR )stream)rL   rK   execute)r   	operationargsrS   opr   r   r   rT   #  s    zServerSideCursor.executec             C   s   | j j|| | S )N)rK   executemany)r   rU   Z
param_setsr   r   r   rX   (  s    zServerSideCursor.executemanyc             C   s   | j jd| j  | j j S )NzFETCH FORWARD 1 FROM )rK   rT   rL   fetchone)r   r   r   r   rY   ,  s    zServerSideCursor.fetchonec             C   s@   |d kr| j  S | jjdtt| d | j  | jj  S d S )NzFETCH FORWARD z FROM )fetchallrK   rT   r4   intrL   )r   numr   r   r   	fetchmany0  s
    zServerSideCursor.fetchmanyc             C   s   | j jd| j  | j j S )NzFETCH FORWARD ALL FROM )rK   rT   rL   rZ   )r   r   r   r   rZ   9  s    zServerSideCursor.fetchallc             C   s    | j jd| j  | j j  d S )NzCLOSE )rK   rT   rL   close)r   r   r   r   r^   =  s    zServerSideCursor.closec             G   s   | j j|  d S )N)rK   setinputsizes)r   sizesr   r   r   r_   A  s    zServerSideCursor.setinputsizesc             C   s   d S )Nr   )r   sizecolumnr   r   r   setoutputsizeD  s    zServerSideCursor.setoutputsize)N)N)r   r    r!   server_siderO   propertyrP   rQ   rR   rT   rX   rY   r]   rZ   r^   r_   rc   r   r   r   r   rJ     s   
	rJ   c               @   s   e Zd Zdd ZdS )PGCompiler_pg8000c             K   s$   | j |jf|d | j |jf| S )Nz %% )r2   leftright)r   binaryoperatorr:   r   r   r   visit_mod_binaryI  s    z"PGCompiler_pg8000.visit_mod_binaryN)r   r    r!   rk   r   r   r   r   rf   H  s   rf   c               @   s   e Zd Zdd ZdS )PGIdentifierPreparer_pg8000c             O   s   t j| f|| d| _d S )NF)r   rO   Z_double_percents)r   rV   kwargsr   r   r   rO   R  s    z$PGIdentifierPreparer_pg8000.__init__N)r   r    r!   rO   r   r   r   r   rl   Q  s   rl   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j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 )Nr         z$pg8000 1.16.6 or greater is required)r   rq   rr   )r
   rO   client_encoding_dbapi_versionr)   )r   rs   rm   r   r   r   rO     s    
zPGDialect_pg8000.__init__c             C   s8   | j r0t| j dr0tdd tjd| j jD S 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   )ry   ry   ry   )r%   hasattrtuplerefindallru   )r   r   r   r   rt     s    zPGDialect_pg8000._dbapi_versionc             C   s   t dS )Nro   )
__import__)r8   r   r   r   r%     s    zPGDialect_pg8000.dbapic             C   s8   |j dd}d|kr$t|d |d< |j|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|krdS dt|kS )Nznetwork errorTzconnection is closed)
isinstancer%   ZInterfaceErrorr4   )r   erP   rK   r   r   r   is_disconnect  s    zPGDialect_pg8000.is_disconnectc             C   s   |j dd}t|dr|j}|dkr,d|_nX|| jkrfd|_|j }|jd|  |jd |j  ntj	d	|| j
d
j| jf d S )N_ rP   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, )replacerz   rP   Z
autocommitZ_isolation_lookuprK   rT   r^   r   ArgumentErrornamejoin)r   rP   levelrK   r   r   r   set_isolation_level  s     



z$PGDialect_pg8000.set_isolation_levelc          
   C   s<   |j  }z$|jd|rdnd  |jd W d |j  X d S )Nz-SET SESSION CHARACTERISTICS AS TRANSACTION %sz	READ ONLYz
READ WRITEr   )rK   rT   r^   )r   rP   r1   rK   r   r   r   set_readonly  s    zPGDialect_pg8000.set_readonlyc          
   C   s6   |j  }z|jd |j d }W d |j  X |dkS )Nzshow transaction_read_onlyr   on)rK   rT   rY   r^   )r   rP   rK   valr   r   r   get_readonly  s    

zPGDialect_pg8000.get_readonlyc          
   C   s<   |j  }z$|jd|rdnd  |jd W d |j  X d S )Nz-SET SESSION CHARACTERISTICS AS TRANSACTION %sZ
DEFERRABLEzNOT DEFERRABLEr   )rK   rT   r^   )r   rP   r1   rK   r   r   r   set_deferrable  s    zPGDialect_pg8000.set_deferrablec          
   C   s6   |j  }z|jd |j d }W d |j  X |dkS )Nzshow transaction_deferrabler   r   )rK   rT   rY   r^   )r   rP   rK   r   r   r   r   get_deferrable  s    

zPGDialect_pg8000.get_deferrablec             C   s@   t |dr|j}|j }|jd| d  |jd |j  d S )NrP   zSET CLIENT_ENCODING TO ''r   )rz   rP   rK   rT   r^   )r   rP   rs   rK   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   )rv   keydbtypesqltyper   r   r   rx      s    z7PGDialect_pg8000.do_set_input_sizes.<locals>.<listcomp>c             S   s   i | ]\}}}|r||qS r   r   )rv   r   r   r   r   r   r   
<dictcomp>  s   z7PGDialect_pg8000.do_set_input_sizes.<locals>.<dictcomp>)
positionalr_   )r   rK   Zlist_of_tuplescontextr   r   r   do_set_input_sizes  s    z#PGDialect_pg8000.do_set_input_sizesc             C   s   |j jd|df d S )Nr    )rP   Z	tpc_begin)r   rP   xidr   r   r   do_begin_twophase  s    z"PGDialect_pg8000.do_begin_twophasec             C   s   |j j  d S )N)rP   Ztpc_prepare)r   rP   r   r   r   r   do_prepare_twophase  s    z$PGDialect_pg8000.do_prepare_twophaseFc             C   s   |j jd|df d S )Nr   r   )rP   Ztpc_rollback)r   rP   r   is_preparedrecoverr   r   r   do_rollback_twophase  s    z%PGDialect_pg8000.do_rollback_twophasec             C   s   |j jd|df d S )Nr   r   )rP   Z
tpc_commit)r   rP   r   r   r   r   r   r   do_commit_twophase  s    z#PGDialect_pg8000.do_commit_twophasec             C   s   dd |j j D S )Nc             S   s   g | ]}|d  qS )r   r   )rv   rowr   r   r   rx     s    z8PGDialect_pg8000.do_recover_twophase.<locals>.<listcomp>)rP   Ztpc_recover)r   rP   r   r   r   do_recover_twophase  s    z$PGDialect_pg8000.do_recover_twophasec                s   g  dd } j | jd k	r6fdd} j | jd k	rVfdd} j | jrrfdd} j | t dkr fdd}|S d S d S )Nc             S   s   | j tj | j t< d S )N)Zpy_typesr   	text_typer   )connr   r   r   
on_connect!  s    z/PGDialect_pg8000.on_connect.<locals>.on_connectc                s    j |  j d S )N)r   rs   )r   )r   r   r   r   (  s    c                s    j |  j d S )N)r   isolation_level)r   )r   r   r   r   /  s    c                s    | j d j | j d j d S )Nr   i  )Zregister_in_adapter_json_deserializer)r   )r   r   r   r   6  s    r   c                s   x D ]}||  qW d S )Nr   )r   fn)fnsr   r   r   A  s    
)appendrs   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_rowcountrE   Zexecution_ctx_clsrf   Zstatement_compilerrl   ZpreparerZsupports_server_side_cursorsZuse_setinputsizesZdescription_encodingr   Zupdate_copyr
   ZcolspecssqltypesNumericr"   ZFloatr   r   r$   BooleanrD   NullTyperB   r   r'   r   r.   JSONIndexTyper(   JSONIntIndexTyper*   JSONStrIndexTyper,   r   r/   ZIntervalr7   r   DateTimer=   Timer?   Integerr@   SmallIntegerrA   
BigIntegerrC   Enumr5   rO   Zmemoized_propertyrt   r<   r%   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rn   W  sf   






rn   )A__doc__r   r|   uuidr   r0   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   r*   r   r,   r.   r/   r5   r7   r   r=   r   r?   r   r@   r   rA   r   rB   r   rC   r   rD   counterrI   rE   rJ   rf   rl   rn   r   r   r   r   r   <module>[   s^   	

8	 t