o
    E6dTK                     @   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:

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                   @      e Zd ZdZdS )	_PGStringTN__name__
__module____qualname__render_bind_cast r"   r"   |C:\Users\jesus\OneDrive\Desktop\erpjis_fastapi\backend\jisbackend\Lib\site-packages\sqlalchemy/dialects/postgresql/pg8000.pyr   y       r   c                   @      e Zd ZdZdd ZdS )
_PGNumericTc                 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coltyper"   r"   r#   result_processor   s"   z_PGNumeric.result_processorNr   r   r    r!   r-   r"   r"   r"   r#   r&   }       r&   c                   @      e Zd ZdZdZdS )_PGFloatfloatTNr   r   r    Z__visit_name__r!   r"   r"   r"   r#   r1      s    r1   c                   @      e Zd Zdd ZdS )_PGNumericNoBindc                 C      d S Nr"   )r*   r+   r"   r"   r#   bind_processor      z_PGNumericNoBind.bind_processorN)r   r   r    r8   r"   r"   r"   r#   r5          r5   c                   @   r%   )_PGJSONTc                 C   r6   r7   r"   r)   r"   r"   r#   r-      r9   z_PGJSON.result_processorNr.   r"   r"   r"   r#   r;      r/   r;   c                   @   r%   )_PGJSONBTc                 C   r6   r7   r"   r)   r"   r"   r#   r-      r9   z_PGJSONB.result_processorNr.   r"   r"   r"   r#   r<      r/   r<   c                   @   r4   )_PGJSONIndexTypec                 C   s   t d)Nzshould not be here)NotImplementedErrorr*   dbapir"   r"   r#   get_dbapi_type   s   z_PGJSONIndexType.get_dbapi_typeNr   r   r    rA   r"   r"   r"   r#   r=      r:   r=   c                   @   r0   )_PGJSONIntIndexTypeZjson_int_indexTNr3   r"   r"   r"   r#   rC          rC   c                   @   r0   )_PGJSONStrIndexTypeZjson_str_indexTNr3   r"   r"   r"   r#   rE      rD   rE   c                   @      e Zd ZdS )_PGJSONPathTypeNr   r   r    r"   r"   r"   r#   rG          rG   c                   @   r4   )_PGEnumc                 C      |j S r7   )UNKNOWNr?   r"   r"   r#   rA         z_PGEnum.get_dbapi_typeNrB   r"   r"   r"   r#   rJ      r:   rJ   c                   @   s$   e Zd ZdZdd Zedd ZdS )_PGIntervalTc                 C   rK   r7   r	   r?   r"   r"   r#   rA      rM   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    r!   rA   classmethodrS   r"   r"   r"   r#   rN      s
    rN   c                   @   r   )_PGTimeStampTNr   r"   r"   r"   r#   rU      r$   rU   c                   @   r   )_PGDateTNr   r"   r"   r"   r#   rV      r$   rV   c                   @   r   )_PGTimeTNr   r"   r"   r"   r#   rW      r$   rW   c                   @   r   )
_PGIntegerTNr   r"   r"   r"   r#   rX      r$   rX   c                   @   r   )_PGSmallIntegerTNr   r"   r"   r"   r#   rY      r$   rY   c                   @   rF   )_PGNullTypeNrH   r"   r"   r"   r#   rZ      rI   rZ   c                   @   r   )_PGBigIntegerTNr   r"   r"   r"   r#   r[      r$   r[   c                   @   r   )
_PGBooleanTNr   r"   r"   r"   r#   r\      r$   r\   c                   @   r   )_PGARRAYTNr   r"   r"   r"   r#   r]      r$   r]   c                   @   rF   )_PGOIDVECTORNrH   r"   r"   r"   r#   r^      rI   r^   c                   @      e Zd Zdd Zdd ZdS )_Pg8000Rangec                       |j j  fdd}|S )Nc                    s&   t | tjr | j| j| j| j} | S r7   )
isinstancer   RangelowerupperboundsemptyvalueZpg8000_Ranger"   r#   to_range  s
   z-_Pg8000Range.bind_processor.<locals>.to_ranger@   rc   )r*   r+   rk   r"   rj   r#   r8     s   z_Pg8000Range.bind_processorc                 C      dd }|S )Nc                 S   s&   | d urt j| j| j| j| jd} | S N)rf   rg   )r   rc   rd   re   rf   is_emptyrh   r"   r"   r#   rk     s   z/_Pg8000Range.result_processor.<locals>.to_ranger"   )r*   r+   r,   rk   r"   r"   r#   r-     s   
z_Pg8000Range.result_processorNr   r   r    r8   r-   r"   r"   r"   r#   r`      s    r`   c                   @   r_   )_Pg8000MultiRangec                    ra   )Nc                    sT   t | tr(g }| D ]}t |tjr | |j|j|j|j q	|| q	|S | S r7   )	rb   listr   rc   appendrd   re   rf   rg   ri   mrvrj   r"   r#   to_multirange  s   
z7_Pg8000MultiRange.bind_processor.<locals>.to_multirangerl   )r*   r+   rw   r"   rj   r#   r8     s   z _Pg8000MultiRange.bind_processorc                 C   rm   )Nc              	   S   s>   | d u rd S g }| D ]}| tj|j|j|j|jd q
|S rn   )rs   r   rc   rd   re   rf   ro   rt   r"   r"   r#   rw   0  s   z9_Pg8000MultiRange.result_processor.<locals>.to_multiranger"   )r*   r+   r,   rw   r"   r"   r#   r-   /  s   z"_Pg8000MultiRange.result_processorNrp   r"   r"   r"   r#   rq     s    rq   c                   @   r_   )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_cursorD  s   *z3PGExecutionContext_pg8000.create_server_side_cursorc                 C   s   | j sd S d S r7   )compiledr*   r"   r"   r#   pre_execH  s   z"PGExecutionContext_pg8000.pre_execN)r   r   r    r   r   r"   r"   r"   r#   rx   C  s    rx   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 )r}   Tc                 C   s   || _ || _d S r7   )r   r~   )r*   r~   r   r"   r"   r#   __init__P  s   
zServerSideCursor.__init__c                 C      | j jS r7   )r~   
connectionr   r"   r"   r#   r   T     zServerSideCursor.connectionc                 C   r   r7   )r~   rowcountr   r"   r"   r#   r   X  r   zServerSideCursor.rowcountc                 C   r   r7   )r~   descriptionr   r"   r"   r#   r   \  r   zServerSideCursor.descriptionr"   Nc                 C   s(   d| j  d | }| jj|||d | S )NzDECLARE z NO SCROLL CURSOR FOR )stream)r   r~   execute)r*   	operationargsr   opr"   r"   r#   r   `  s   zServerSideCursor.executec                 C   s   | j || | S r7   )r~   executemany)r*   r   Z
param_setsr"   r"   r#   r   e  s   zServerSideCursor.executemanyc                 C      | j d| j  | j  S )NzFETCH FORWARD 1 FROM )r~   r   r   fetchoner   r"   r"   r#   r   i     
zServerSideCursor.fetchonec                 C   s<   |d u r|   S | jdtt| d | j  | j  S )NzFETCH FORWARD z FROM )fetchallr~   r   strintr   )r*   numr"   r"   r#   	fetchmanym  s   
zServerSideCursor.fetchmanyc                 C   r   )NzFETCH FORWARD ALL FROM )r~   r   r   r   r   r"   r"   r#   r   v  r   zServerSideCursor.fetchallc                 C   s    | j d| j  | j   d S )NzCLOSE )r~   r   r   closer   r"   r"   r#   r   z  s   zServerSideCursor.closec                 G   s   | j j|  d S r7   )r~   setinputsizes)r*   sizesr"   r"   r#   r   ~  s   zServerSideCursor.setinputsizesc                 C   r6   r7   r"   )r*   sizecolumnr"   r"   r#   setoutputsize  r9   zServerSideCursor.setoutputsize)r"   Nr7   )r   r   r    server_sider   propertyr   r   r   r   r   r   r   r   r   r   r   r"   r"   r"   r#   r}   M  s"    




	r}   c                   @   r4   )PGCompiler_pg8000c                 K   s,   | j |jfi |d | j |jfi | S )Nz %% )processleftright)r*   binaryoperatorrR   r"   r"   r#   visit_mod_binary  s   z"PGCompiler_pg8000.visit_mod_binaryN)r   r   r    r   r"   r"   r"   r#   r     r:   r   c                   @   r4   )PGIdentifierPreparer_pg8000c                 O   s"   t j| g|R i | d| _d S )NF)r   r   Z_double_percents)r*   r   kwargsr"   r"   r#   r     s   
z$PGIdentifierPreparer_pg8000.__init__N)r   r   r    r   r"   r"   r"   r#   r     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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j1e2ej1e2ej3e4i ej5e6ej7e8ej9e:ej;e<ej=e>ej?e@eAeBeCjDeEeCjFeEeCjGeEeCjHeEeCjIeEeCjJeEeCjKeLeCjMeLeCjNeLeCjOeLeCjPeLeCjQeLiZd,ddZRejSdd ZTeUd	d
 ZVdd ZWdd ZXdd ZYdd ZZdd Z[dd Z\dd Z]dd Z^dd Z_dd Z`dd  Za	!d-d"d#Zb	!d-d$d%Zcd&d' Zdd(d) ZeejSd*d+ ZfdS ).PGDialect_pg8000pg8000TformatNc                 K   s<   t j| fi | || _| jdk rtd| jrt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   r   client_encoding_dbapi_versionr>   _native_inet_types)r*   r   r   r"   r"   r#   r     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   )r@   hasattrtuplerefindallr   r   r"   r"   r#   r     s   	zPGDialect_pg8000._dbapi_versionc                 C   s   t dS )Nr   )
__import__)rP   r"   r"   r#   import_dbapi  r   zPGDialect_pg8000.import_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)rb   r@   ZInterfaceErrorr   )r*   er   r~   r"   r"   r#   is_disconnect  s
   zPGDialect_pg8000.is_disconnectc                 C      dS )N)
AUTOCOMMITzREAD COMMITTEDzREAD UNCOMMITTEDzREPEATABLE READZSERIALIZABLEr"   )r*   dbapi_connectionr"   r"   r#   get_isolation_level_values  r9   z+PGDialect_pg8000.get_isolation_level_valuesc                 C   sR   | dd}|dkrd|_d S d|_| }|d|  |d |  d S )N_ r   TFz;SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL COMMIT)replaceZ
autocommitr~   r   r   )r*   r   levelr~   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   r~   r   r   r*   r   ri   r~   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r~   r   r   r   r*   r   r~   valr"   r"   r#   get_readonly(     

zPGDialect_pg8000.get_readonlyc                 C   r   )Nr   Z
DEFERRABLEzNOT DEFERRABLEr   r   r   r"   r"   r#   set_deferrable2  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   s8   |  }|d|dd d |d |  d S )NzSET CLIENT_ENCODING TO ''z''r   )r~   r   r   r   )r*   r   r   r~   r"   r"   r#   _set_client_encodingG  s   

z%PGDialect_pg8000._set_client_encodingc                 C      |j d|df d S Nr    )r   Z	tpc_beginr*   r   xidr"   r"   r#   do_begin_twophaseQ  s   z"PGDialect_pg8000.do_begin_twophasec                 C   s   |j   d S r7   )r   Ztpc_preparer   r"   r"   r#   do_prepare_twophaseT  s   z$PGDialect_pg8000.do_prepare_twophaseFc                 C   r   r   )r   Ztpc_rollbackr*   r   r   Zis_preparedZrecoverr"   r"   r#   do_rollback_twophaseW     z%PGDialect_pg8000.do_rollback_twophasec                 C   r   r   )r   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   b  s    z8PGDialect_pg8000.do_recover_twophase.<locals>.<listcomp>)r   Ztpc_recover)r*   r   r"   r"   r#   do_recover_twophasea     z$PGDialect_pg8000.do_recover_twophasec                    s   g  dd }  | jd urfdd}  | jdu r)dd }  | jr7fdd}  | t dkrE fdd}|S d S )	Nc                 S   s   | j t | j t< d S r7   )Zpy_typesr   r   connr"   r"   r#   
on_connectg  r   z/PGDialect_pg8000.on_connect.<locals>.on_connectc                    s     |  j d S r7   )r   r   r   r   r"   r#   r   n  s   Fc                 S   s$   |  ddd  |  ddd  d S )Nie  c                 S      | S r7   r"   sr"   r"   r#   <lambda>w      zAPGDialect_pg8000.on_connect.<locals>.on_connect.<locals>.<lambda>i  c                 S   r   r7   r"   r   r"   r"   r#   r   z  r   )register_in_adapterr   r"   r"   r#   r   u  s   c                    s    |  d j |  d j d S )Nr   i  )r   _json_deserializerr   r   r"   r#   r     s   r   c                    s    D ]}||  qd S r7   r"   )r   fn)fnsr"   r#   r     s   
)rs   r   r   r   len)r*   r   r"   )r   r*   r#   r   d  s    





zPGDialect_pg8000.on_connectc                 C   r   )N;r"   r   r"   r"   r#   _dialect_specific_select_one  s   z-PGDialect_pg8000._dialect_specific_select_oner7   )TF)gr   r   r    ZdriverZsupports_statement_cacheZsupports_unicode_statementsZsupports_unicode_bindsZdefault_paramstyleZsupports_sane_multi_rowcountrx   Zexecution_ctx_clsr   Zstatement_compilerr   preparerZsupports_server_side_cursorsr!   Zdescription_encodingr   Zupdate_copyr   Zcolspecsr   Stringr   Numericr5   Floatr1   r   r;   Booleanr\   NullTyperZ   r   r<   r   r   rG   JSONIndexTyper=   JSONIntIndexTyperC   JSONStrIndexTyperE   ZIntervalrN   r
   DateTimerU   DaterV   TimerW   IntegerrX   SmallIntegerrY   
BigIntegerr[   EnumrJ   r   r]   r   r^   r   Z	INT4RANGEr`   Z	INT8RANGEZNUMRANGEZ	DATERANGEZTSRANGEZ	TSTZRANGEZINT4MULTIRANGErq   ZINT8MULTIRANGEZNUMMULTIRANGEZDATEMULTIRANGEZTSMULTIRANGEZTSTZMULTIRANGEr   Zmemoized_propertyr   rT   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   arrayr   ZPGARRAYbaser   r   r   r   r
   r   r   r   r   jsonr   r   r   Z
pg_catalogr   r   typesr   r   r   Zenginer   sqlr   Zsql.elementsr   r   r   r  r&   r  r1   r5   r;   r<   r  r=   r  rC   r  rE   rG   rJ   rN   r  rU   r	  rV   r
  rW   r  rX   r  rY   r  rZ   r  r[   r  r\   r]   r^   ZAbstractRangeImplr`   ZAbstractMultiRangeImplrq   counterr|   rx   r}   r   r   r   r+   r"   r"   r"   r#   <module>   st   U%
8	  