U
    [h7I                     @   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  ddl!m"Z" G dd de j#Z$G dd de j%Z&G dd  d e&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j0Z1G d-d. d.eZ2G d/d0 d0eZ3G d1d2 d2eZ4G d3d4 d4e j5Z6G d5d6 d6e j7Z8G d7d8 d8e j9Z:G d9d: d:e j;Z<G d;d< d<e j=Z>G d=d> d>e j?Z@G d?d@ d@e jAZBG dAdB dBe jCZDG dCdD dDeZEG dEdF dFeeZFG dGdH dHejGZHG dIdJ dJejIZJeK ZLG dKdL dLeZMG dMdN dNZNG dOdP dPeZOG dQdR dReZPG dSdT dTeZQeQZRdS )Ua	  
.. 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:

.. sourcecode:: 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   )ranges)ARRAY)_DECIMAL_TYPES)_FLOAT_TYPES)
_INT_TYPES)ENUMINTERVAL)
PGCompiler)	PGDialect)PGExecutionContext)PGIdentifierPreparer)JSON)JSONB)JSONPathType)_SpaceVector)	OIDVECTOR)CITEXT   )exc)util)
processors)sqltypes)quoted_namec                   @   s   e Zd ZdZdS )	_PGStringTN__name__
__module____qualname__render_bind_cast r!   r!   K./venv/lib/python3.8/site-packages/sqlalchemy/dialects/postgresql/pg8000.pyr   }   s   r   c                   @   s   e Zd ZdZdd ZdS )
_PGNumericTc                 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decimalZDecimalZ_effective_decimal_return_scaler   r   r   ZInvalidRequestErrorZto_floatselfdialectcoltyper!   r!   r"   result_processor   s$     z_PGNumeric.result_processorNr   r   r   r    r)   r!   r!   r!   r"   r#      s   r#   c                   @   s   e Zd ZdZdZdS )_PGFloatfloatTNr   r   r   Z__visit_name__r    r!   r!   r!   r"   r+      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   r0   r!   r!   r!   r"   r.      s   r.   c                   @   s   e Zd ZdZdd ZdS )_PGJSONTc                 C   s   d S r/   r!   r%   r!   r!   r"   r)      s    z_PGJSON.result_processorNr*   r!   r!   r!   r"   r1      s   r1   c                   @   s   e Zd ZdZdd ZdS )_PGJSONBTc                 C   s   d S r/   r!   r%   r!   r!   r"   r)      s    z_PGJSONB.result_processorNr*   r!   r!   r!   r"   r2      s   r2   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&   dbapir!   r!   r"   get_dbapi_type   s    z_PGJSONIndexType.get_dbapi_typeNr   r   r   r7   r!   r!   r!   r"   r3      s   r3   c                   @   s   e Zd ZdZdZdS )_PGJSONIntIndexTypeZjson_int_indexTNr-   r!   r!   r!   r"   r9      s   r9   c                   @   s   e Zd ZdZdZdS )_PGJSONStrIndexTypeZjson_str_indexTNr-   r!   r!   r!   r"   r:      s   r:   c                   @   s   e Zd ZdS )_PGJSONPathTypeN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/   )ZUNKNOWNr5   r!   r!   r"   r7      s    z_PGEnum.get_dbapi_typeNr8   r!   r!   r!   r"   r=      s   r=   c                   @   s$   e Zd ZdZdd Zedd ZdS )_PGIntervalTc                 C   s   |j S r/   r	   r5   r!   r!   r"   r7      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    r7   classmethodrB   r!   r!   r!   r"   r>      s   r>   c                   @   s   e Zd ZdZdS )_PGTimeStampTNr   r!   r!   r!   r"   rD      s   rD   c                   @   s   e Zd ZdZdS )_PGDateTNr   r!   r!   r!   r"   rE      s   rE   c                   @   s   e Zd ZdZdS )_PGTimeTNr   r!   r!   r!   r"   rF      s   rF   c                   @   s   e Zd ZdZdS )
_PGIntegerTNr   r!   r!   r!   r"   rG      s   rG   c                   @   s   e Zd ZdZdS )_PGSmallIntegerTNr   r!   r!   r!   r"   rH      s   rH   c                   @   s   e Zd ZdS )_PGNullTypeNr<   r!   r!   r!   r"   rI      s   rI   c                   @   s   e Zd ZdZdS )_PGBigIntegerTNr   r!   r!   r!   r"   rJ      s   rJ   c                   @   s   e Zd ZdZdS )
_PGBooleanTNr   r!   r!   r!   r"   rK      s   rK   c                   @   s   e Zd ZdZdS )_PGARRAYTNr   r!   r!   r!   r"   rL      s   rL   c                   @   s   e Zd ZdS )_PGOIDVECTORNr<   r!   r!   r!   r"   rM      s   rM   c                   @   s   e Zd Zdd Zdd ZdS )_Pg8000Rangec                    s   |j j  fdd}|S )Nc                    s&   t | tjr" | j| j| j| j} | S r/   )
isinstancer   RangelowerupperboundsemptyvalueZpg8000_Ranger!   r"   to_range  s       z-_Pg8000Range.bind_processor.<locals>.to_ranger6   rP   )r&   r'   rX   r!   rW   r"   r0     s    z_Pg8000Range.bind_processorc                 C   s   dd }|S )Nc                 S   s&   | d k	r"t j| j| j| j| jd} | S )NrS   rT   r   rP   rQ   rR   rS   Zis_emptyrU   r!   r!   r"   rX     s    z/_Pg8000Range.result_processor.<locals>.to_ranger!   )r&   r'   r(   rX   r!   r!   r"   r)     s    
z_Pg8000Range.result_processorNr   r   r   r0   r)   r!   r!   r!   r"   rN     s   rN   c                   @   s   e Zd Zdd Zdd ZdS )_Pg8000MultiRangec                    s   |j j  fdd}|S )Nc                    sX   t | trPg }| D ]8}t |tjr@| |j|j|j|j q|| q|S | S d S r/   )	rO   listr   rP   appendrQ   rR   rS   rT   )rV   mrvrW   r!   r"   to_multirange#  s    
z7_Pg8000MultiRange.bind_processor.<locals>.to_multirangerY   )r&   r'   rb   r!   rW   r"   r0      s    z _Pg8000MultiRange.bind_processorc                 C   s   dd }|S )Nc                 S   s$   | d krd S t dd | D S d S )Nc                 s   s(   | ] }t j|j|j|j|jd V  qdS )rZ   Nr[   ).0ra   r!   r!   r"   	<genexpr>8  s      zL_Pg8000MultiRange.result_processor.<locals>.to_multirange.<locals>.<genexpr>)r   Z
MultiRangerU   r!   r!   r"   rb   4  s
    
z9_Pg8000MultiRange.result_processor.<locals>.to_multiranger!   )r&   r'   r(   rb   r!   r!   r"   r)   3  s    z"_Pg8000MultiRange.result_processorNr\   r!   r!   r!   r"   r]     s   r]   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_cursorF  s    *z3PGExecutionContext_pg8000.create_server_side_cursorc                 C   s   | j s
d S d S r/   )Zcompiledr&   r!   r!   r"   pre_execJ  s    z"PGExecutionContext_pg8000.pre_execN)r   r   r   rm   ro   r!   r!   r!   r"   re   E  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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 )rj   Tc                 C   s   || _ || _d S r/   )rl   rk   )r&   rk   rl   r!   r!   r"   __init__R  s    zServerSideCursor.__init__c                 C   s   | j jS r/   )rk   
connectionrn   r!   r!   r"   rq   V  s    zServerSideCursor.connectionc                 C   s   | j jS r/   )rk   rowcountrn   r!   r!   r"   rr   Z  s    zServerSideCursor.rowcountc                 C   s   | j jS r/   )rk   descriptionrn   r!   r!   r"   rs   ^  s    zServerSideCursor.descriptionr!   Nc                 C   s(   d| j  d | }| jj|||d | S )NzDECLARE z NO SCROLL CURSOR FOR )stream)rl   rk   execute)r&   	operationargsrt   opr!   r!   r"   ru   b  s    zServerSideCursor.executec                 C   s   | j || | S r/   )rk   executemany)r&   rv   Z
param_setsr!   r!   r"   ry   g  s    zServerSideCursor.executemanyc                 C   s   | j d| j  | j  S )NzFETCH FORWARD 1 FROM )rk   ru   rl   fetchonern   r!   r!   r"   rz   k  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 )fetchallrk   ru   strintrl   )r&   Znumr!   r!   r"   	fetchmanyo  s    zServerSideCursor.fetchmanyc                 C   s   | j d| j  | j  S )NzFETCH FORWARD ALL FROM )rk   ru   rl   r{   rn   r!   r!   r"   r{   x  s    zServerSideCursor.fetchallc                 C   s    | j d| j  | j   d S )NzCLOSE )rk   ru   rl   closern   r!   r!   r"   r   |  s    zServerSideCursor.closec                 G   s   | j j|  d S r/   )rk   setinputsizes)r&   Zsizesr!   r!   r"   r     s    zServerSideCursor.setinputsizesc                 C   s   d S r/   r!   )r&   sizecolumnr!   r!   r"   setoutputsize  s    zServerSideCursor.setoutputsize)r!   N)N)N)r   r   r   Zserver_siderp   propertyrq   rr   rs   ru   ry   rz   r~   r{   r   r   r   r!   r!   r!   r"   rj   O  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 %% )Zprocessleftright)r&   binaryoperatorrA   r!   r!   r"   visit_mod_binary  s    z"PGCompiler_pg8000.visit_mod_binaryN)r   r   r   r   r!   r!   r!   r"   r     s   r   c                   @   s   e Zd Zdd ZdS )PGIdentifierPreparer_pg8000c                 O   s   t j| f|| d| _d S )NF)r   rp   Z_double_percents)r&   rw   kwargsr!   r!   r"   rp     s    z$PGIdentifierPreparer_pg8000.__init__N)r   r   r   rp   r!   r!   r!   r"   r     s   r   c                K   @   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j!e"e#e$e%e%ejj&e'ejj(e)ejj*e+ejj,e-ej.e/e0e/ej1e2ej1e2ej3e4ej5e6ej7e8ej9e:ej;e<ej=e>ej?e@eAeBeCjDeEeCjFeEeCjGeEeCjHeEeCjIeEeCjJeEeCjKeLeCjMeLeCjNeLeCjOeLeCjPeLeCjQeLi$Zd/ddZRejSdd ZTeUd	d
 ZVdd ZWdd ZXdd ZYdd ZZe[dddZ\dd Z]dd Z^dd Z_dd Z`dd Zad d! Zbd"d# Zcd0d%d&Zdd1d'd(Zed)d* Zfd+d, ZgejSd-d. ZhdS )2PGDialect_pg8000pg8000TformatNc                 K   s8   t j| f| || _| jdk r&td| jr4tdd S )N)r         z$pg8000 1.16.6 or greater is requiredznThe pg8000 dialect does not fully implement ipaddress type handling; INET is supported by default, CIDR is not)r   rp   client_encoding_dbapi_versionr4   _native_inet_types)r&   r   r   r!   r!   r"   rp     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!   )r}   )rc   xr!   r!   r"   
<listcomp>  s   z3PGDialect_pg8000._dbapi_version.<locals>.<listcomp>z(\d+)(?:[-\.]?|$))c   r   r   )r6   hasattrtuplerefindallr   rn   r!   r!   r"   r     s     	zPGDialect_pg8000._dbapi_versionc                 C   s   t dS )Nr   )
__import__)r?   r!   r!   r"   import_dbapi  s    zPGDialect_pg8000.import_dbapic                 C   s8   |j dd}d|kr$t|d |d< ||j g |fS )Nuser)ZusernameZport)Ztranslate_connect_argsr}   updateZquery)r&   ZurlZ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)rO   r6   ZInterfaceErrorr|   )r&   erq   rk   r!   r!   r"   is_disconnect  s
    zPGDialect_pg8000.is_disconnectc                 C   s   dS )N)
AUTOCOMMITzREAD COMMITTEDzREAD UNCOMMITTEDzREPEATABLE READZSERIALIZABLEr!   )r&   dbapi_connectionr!   r!   r"   get_isolation_level_values  s    z+PGDialect_pg8000.get_isolation_level_valuesc                 C   sP   | dd}|dkrd|_n0d|_| }|d|  |d |  d S )N_ r   TFz;SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL COMMIT)replace
autocommitrk   ru   r   )r&   r   levelrk   r!   r!   r"   set_isolation_level  s    
z$PGDialect_pg8000.set_isolation_level)returnc                 C   s
   t |jS r/   )boolr   )r&   Z
dbapi_connr!   r!   r"   detect_autocommit_setting  s    z*PGDialect_pg8000.detect_autocommit_settingc                 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   rk   r   ru   r&   rq   rV   rk   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rk   r   ru   rz   r&   rq   rk   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_deferrable7  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_deferrableB  s    

zPGDialect_pg8000.get_deferrablec                 C   s8   |  }|d|dd d |d |  d S )NzSET CLIENT_ENCODING TO ''z''r   )rk   ru   r   r   )r&   r   r   rk   r!   r!   r"   _set_client_encodingL  s    

z%PGDialect_pg8000._set_client_encodingc                 C   s   |j d|df d S Nr    )rq   Z	tpc_beginr&   rq   xidr!   r!   r"   do_begin_twophaseV  s    z"PGDialect_pg8000.do_begin_twophasec                 C   s   |j   d S r/   )rq   Ztpc_preparer   r!   r!   r"   do_prepare_twophaseY  s    z$PGDialect_pg8000.do_prepare_twophaseFc                 C   s   |j d|df d S r   )rq   Ztpc_rollbackr&   rq   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   )rq   Z
tpc_commitr   r!   r!   r"   do_commit_twophasea  s    z#PGDialect_pg8000.do_commit_twophasec                 C   s   dd |j  D S )Nc                 S   s   g | ]}|d  qS )r   r!   )rc   rowr!   r!   r"   r   g  s     z8PGDialect_pg8000.do_recover_twophase.<locals>.<listcomp>)rq   Ztpc_recover)r&   rq   r!   r!   r"   do_recover_twophasef  s    z$PGDialect_pg8000.do_recover_twophasec                    s   g  dd }  | jd k	r6fdd}  | jdkrRdd }  | jrnfdd}  | t dkr fdd}|S d S d S )	Nc                 S   s   | j t | j t< d S r/   )Zpy_typesr|   r   connr!   r!   r"   
on_connectl  s    z/PGDialect_pg8000.on_connect.<locals>.on_connectc                    s     |  j d S r/   )r   r   r   rn   r!   r"   r   s  s    Fc                 S   s$   |  ddd  |  ddd  d S )Nie  c                 S   s   | S r/   r!   sr!   r!   r"   <lambda>|      zAPGDialect_pg8000.on_connect.<locals>.on_connect.<locals>.<lambda>i  c                 S   s   | S r/   r!   r   r!   r!   r"   r     r   )register_in_adapterr   r!   r!   r"   r   z  s    c                    s    |  d j |  d j d S )Nr   i  )r   _json_deserializerr   rn   r!   r"   r     s    r   c                    s    D ]}||  qd S r/   r!   )r   fn)fnsr!   r"   r     s    )r_   r   r   r   len)r&   r   r!   )r   r&   r"   r   i  s     





zPGDialect_pg8000.on_connectc                 C   s   dS )N;r!   rn   r!   r!   r"   _dialect_specific_select_one  s    z-PGDialect_pg8000._dialect_specific_select_one)N)TF)TF)ir   r   r   ZdriverZsupports_statement_cacheZsupports_unicode_statementsZsupports_unicode_bindsZdefault_paramstyleZsupports_sane_multi_rowcountre   Zexecution_ctx_clsr   Zstatement_compilerr   ZpreparerZsupports_server_side_cursorsr    Zdescription_encodingr   Zupdate_copyr   Zcolspecsr   Stringr   Numericr.   Floatr+   r   r1   BooleanrK   NullTyperI   r   r2   r   r   r;   JSONIndexTyper3   JSONIntIndexTyper9   JSONStrIndexTyper:   ZIntervalr>   r
   DateTimerD   DaterE   TimerF   IntegerrG   SmallIntegerrH   
BigIntegerrJ   Enumr=   r   rL   r   rM   r   Z	INT4RANGErN   Z	INT8RANGEZNUMRANGEZ	DATERANGEZTSRANGEZ	TSTZRANGEZINT4MULTIRANGEr]   ZINT8MULTIRANGEZNUMMULTIRANGEZDATEMULTIRANGEZTSMULTIRANGEZTSTZMULTIRANGErp   Zmemoized_propertyr   rC   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r!   r!   r!   r"   r     s                                       *



	


   
   
/r   )S__doc__r$   r   r   r   Zarrayr   ZPGARRAYbaser   r   r   r   r
   r   r   r   r   Zjsonr   r   r   Z
pg_catalogr   r   typesr   r   r   Zenginer   Zsqlr   Zsql.elementsr   r   r   r   r#   r   r+   r.   r1   r2   r   r3   r   r9   r   r:   r;   r=   r>   r   rD   r   rE   r   rF   r   rG   r   rH   r   rI   r   rJ   r   rK   rL   rM   ZAbstractSingleRangeImplrN   ZAbstractMultiRangeImplr]   Zcounterri   re   rj   r   r   r   r'   r!   r!   r!   r"   <module>	   sr   Y#
8	  	