o
    y¬´\;%  ã                   @   sn  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 zddlmZ W n eyq   dZY nw 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	ƒZG dd„ deƒZG dd „ d e
ƒZ G d!d"„ d"eƒZ!e!Z"dS )#a  
.. dialect:: postgresql+pg8000
    :name: pg8000
    :dbapi: pg8000
    :connectstring: postgresql+pg8000://user:password@host:port/dbname[?key=value&key=value...]
    :url: https://pythonhosted.org/pg8000/


.. _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:`.create_engine` using the ``client_encoding`` parameter::

    engine = create_engine(
        "postgresql+pg8000://user:pass@host/dbname", client_encoding='utf8')


.. _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``

.. versionadded:: 0.9.5 support for AUTOCOMMIT isolation level when using
   pg8000.

.. seealso::

    :ref:`postgresql_isolation_level`

    :ref:`psycopg2_isolation_level`


é    Né   )Ú_DECIMAL_TYPES)Ú_FLOAT_TYPES)Ú
_INT_TYPES)Ú
PGCompiler)Ú	PGDialect)ÚPGExecutionContext)ÚPGIdentifierPreparer)ÚUUID)ÚJSONé   )Úexc)Ú
processors)Útypes)Úutil)Úquoted_namec                   @   ó   e Zd Zdd„ ZdS )Ú
_PGNumericc                 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)Ú	asdecimalr   r   Úto_decimal_processor_factoryÚdecimalÚDecimalÚ_effective_decimal_return_scaler   r   r   ÚInvalidRequestErrorÚto_float©ÚselfÚdialectÚcoltype© r   úW/var/www/html/env/lib/python3.10/site-packages/sqlalchemy/dialects/postgresql/pg8000.pyÚresult_processor[   s"   ÿÿÿz_PGNumeric.result_processorN)Ú__name__Ú
__module__Ú__qualname__r!   r   r   r   r    r   Z   ó    r   c                   @   r   )Ú_PGNumericNoBindc                 C   s   d S ©Nr   )r   r   r   r   r    Úbind_processoru   s   z_PGNumericNoBind.bind_processorN)r"   r#   r$   r(   r   r   r   r    r&   t   r%   r&   c                       s   e Zd Z‡ fdd„Z‡  ZS )Ú_PGJSONc                    s    |j dkrd S tt| ƒ ||¡S )N)r   é
   r   )Ú_dbapi_versionÚsuperr)   r!   r   ©Ú	__class__r   r    r!   z   s   
z_PGJSON.result_processor)r"   r#   r$   r!   Ú__classcell__r   r   r-   r    r)   y   s    r)   c                   @   ó   e Zd Zdd„ Zdd„ ZdS )Ú_PGUUIDc                 C   s   | j s	dd„ }|S d S )Nc                 S   ó   | d urt | ƒ} | S r'   )Ú_python_UUID©Úvaluer   r   r    Úprocess…   ó   z'_PGUUID.bind_processor.<locals>.process©Úas_uuid)r   r   r6   r   r   r    r(   ‚   ó   ùz_PGUUID.bind_processorc                 C   s   | j s	dd„ }|S d S )Nc                 S   r2   r'   ©Ústrr4   r   r   r    r6   �   r7   z)_PGUUID.result_processor.<locals>.processr8   )r   r   r   r6   r   r   r    r!   Œ   r:   z_PGUUID.result_processorN)r"   r#   r$   r(   r!   r   r   r   r    r1   �   s    
r1   c                   @   s   e Zd ZdS )ÚPGExecutionContext_pg8000N)r"   r#   r$   r   r   r   r    r=   —   s    r=   c                   @   r0   )ÚPGCompiler_pg8000c                 K   s,   | j |jfi |¤Žd | j |jfi |¤Ž S )Nz %% )r6   ÚleftÚright)r   ÚbinaryÚoperatorÚkwr   r   r    Úvisit_mod_binaryœ   s   ÿþÿz"PGCompiler_pg8000.visit_mod_binaryc                 C   s   d|v r	t  d¡ | dd¡S )Nú%%z^The SQLAlchemy postgresql dialect now automatically escapes '%' in text() expressions to '%%'.ú%)r   ÚwarnÚreplace)r   Útextr   r   r    Úpost_process_text£   s
   ÿz#PGCompiler_pg8000.post_process_textN)r"   r#   r$   rD   rJ   r   r   r   r    r>   ›   s    r>   c                   @   r   )ÚPGIdentifierPreparer_pg8000c                 C   s   |  | j| j¡}|  dd¡S )NrF   rE   )rH   Úescape_quoteÚescape_to_quote)r   r5   r   r   r    Ú_escape_identifier®   s   z.PGIdentifierPreparer_pg8000._escape_identifierN)r"   r#   r$   rN   r   r   r   r    rK   ­   r%   rK   c                       sä   e Zd ZdZdZdZdZdZeZ	e
ZeZdZe ejejeejeeeejeeei¡Zd#dd„Z‡ fdd	„Zejd
d„ ƒZe dd„ ƒZ!dd„ Z"dd„ Z#dd„ Z$dd„ Z%dd„ Z&dd„ Z'	d$dd„Z(	d$dd„Z)dd „ Z*d!d"„ Z+‡  Z,S )%ÚPGDialect_pg8000Úpg8000TÚformatÚuse_encodingNc                 K   s   t j| fi |¤Ž || _d S r'   )r   Ú__init__Úclient_encoding)r   rT   Úkwargsr   r   r    rS   Ì   s   
zPGDialect_pg8000.__init__c                    s    | j dk| _tt| ƒ |¡ d S )N)r   é	   é   )r+   Úsupports_sane_multi_rowcountr,   rO   Ú
initialize©r   Ú
connectionr-   r   r    rY   Ð   s   zPGDialect_pg8000.initializec                 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   )Úint)Ú.0Úxr   r   r    Ú
<listcomp>Ø   s    ÿÿz3PGDialect_pg8000._dbapi_version.<locals>.<listcomp>z(\d+)(?:[-\.]?|$))éc   ra   ra   )ÚdbapiÚhasattrÚtupleÚreÚfindallr\   ©r   r   r   r    r+   Ô   s   ÿþÿ	zPGDialect_pg8000._dbapi_versionc                 C   s   t dƒS )NrP   )Ú
__import__)Úclsr   r   r    rb   â   s   zPGDialect_pg8000.dbapic                 C   s8   |j dd�}d|v rt|d ƒ|d< | |j¡ g |fS )NÚuser)ÚusernameÚport)Útranslate_connect_argsr]   ÚupdateÚquery)r   ÚurlÚoptsr   r   r    Úcreate_connect_argsæ   s
   z$PGDialect_pg8000.create_connect_argsc                 C   s   dt |ƒv S )Nzconnection is closedr;   )r   Úer[   Úcursorr   r   r    Úis_disconnectí   s   zPGDialect_pg8000.is_disconnectc                 C   sˆ   |  dd¡}t|dƒr|j}|dkrd|_d S || jv r5d|_| ¡ }| d| ¡ | d¡ | ¡  d S t 	d	|| j
d
 | j¡f ¡‚)NÚ_ú r[   Ú
AUTOCOMMITTFz=SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL %sÚCOMMITzZInvalid value '%s' for isolation_level. Valid isolation levels for %s are %s or AUTOCOMMITz, )rH   rc   r[   Ú
autocommitÚ_isolation_lookuprt   ÚexecuteÚcloser   ÚArgumentErrorÚnameÚjoin)r   r[   Úlevelrt   r   r   r    Úset_isolation_levelð   s(   


ÿÿ
þÿz$PGDialect_pg8000.set_isolation_levelc                 C   s@   t |dƒr|j}| ¡ }| d| d ¡ | d¡ | ¡  d S )Nr[   zSET CLIENT_ENCODING TO 'ú'ry   )rc   r[   rt   r|   r}   )r   r[   rT   rt   r   r   r    Úset_client_encoding	  s   

z$PGDialect_pg8000.set_client_encodingc                 C   ó   |j  d|df¡ d S ©Nr   Ú )r[   Ú	tpc_begin©r   r[   Úxidr   r   r    Údo_begin_twophase  ó   z"PGDialect_pg8000.do_begin_twophasec                 C   s   |j  ¡  d S r'   )r[   Útpc_preparer‰   r   r   r    Údo_prepare_twophase  s   z$PGDialect_pg8000.do_prepare_twophaseFc                 C   r…   r†   )r[   Útpc_rollback©r   r[   rŠ   Úis_preparedÚrecoverr   r   r    Údo_rollback_twophase  ó   z%PGDialect_pg8000.do_rollback_twophasec                 C   r…   r†   )r[   Ú
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`   $  s    z8PGDialect_pg8000.do_recover_twophase.<locals>.<listcomp>)r[   Útpc_recoverrZ   r   r   r    Údo_recover_twophase#  s   z$PGDialect_pg8000.do_recover_twophasec                    sv   g ‰ dd„ }ˆ   |¡ ˆjd ur‡fdd„}ˆ   |¡ ˆjd ur+‡fdd„}ˆ   |¡ tˆ ƒdkr9‡ fdd„}|S d S )Nc                 S   s   | j tj | j t< d S r'   )Úpy_typesr   Ú	text_typer   ©Úconnr   r   r    Ú
on_connect)  rŒ   z/PGDialect_pg8000.on_connect.<locals>.on_connectc                    ó   ˆ   | ˆ j¡ d S r'   )r„   rT   rœ   rg   r   r    rž   0  ó   c                    rŸ   r'   )r‚   Úisolation_levelrœ   rg   r   r    rž   7  r    r   c                    s   ˆ D ]}|| ƒ qd S r'   r   )r�   Úfn)Úfnsr   r    rž   >  s   
ÿ)ÚappendrT   r¡   Úlen)r   rž   r   )r£   r   r    rž   &  s   




zPGDialect_pg8000.on_connectr'   )TF)-r"   r#   r$   ÚdriverÚsupports_unicode_statementsÚsupports_unicode_bindsÚdefault_paramstylerX   r=   Úexecution_ctx_clsr>   Ústatement_compilerrK   ÚpreparerÚdescription_encodingr   Úupdate_copyr   ÚcolspecsÚsqltypesÚNumericr&   ÚFloatr   r   r)   r
   r1   rS   rY   Úmemoized_propertyr+   Úclassmethodrb   rr   ru   r‚   r„   r‹   rŽ   r“   r–   r™   rž   r/   r   r   r-   r    rO   ³   sJ    ûþ




ÿ
ÿrO   )#Ú__doc__r   re   Úbaser   r   r   r   r   r   r	   r
   Újsonr   r‡   r   r   r   r°   r   Úsql.elementsr   Úuuidr3   ÚImportErrorr±   r   r&   r)   r1   r=   r>   rK   rO   r   r   r   r   r    Ú<module>   s@   :ÿ 