o
    h1!                     @   s^   d dl Z ddlmZ ddlmZ G dd de jZh dZdd	d
ddZG dd dej	Z
dS )    N   )connresource)
exceptionsc                   @   s    e Zd ZdZdZdZdZdZdS )TransactionStater   r            N)__name__
__module____qualname__NEWSTARTED	COMMITTED
ROLLEDBACKFAILED r   r   g/var/www/html/construction_image-detection-poc/venv/lib/python3.10/site-packages/asyncpg/transaction.pyr      s    r   >   serializableread_committedrepeatable_readread_uncommittedr   r   r   r   )zread committedzread uncommittedr   zrepeatable readc                       s   e Zd ZdZdZ fddZdd Zdd Zej	d	d
 Z
dd Zdd Zdd Zdd Zej	dd Zej	dd Zdd Z  ZS )TransactionzRepresents a transaction or savepoint block.

    Transactions are created by calling the
    :meth:`Connection.transaction() <connection.Connection.transaction>`
    function.
    )_connection
_isolation	_readonly_deferrable_state_nested_id_managedc                    sX   t  | |r|tvrtdt||| _|| _|| _tj	| _
d| _d | _d| _d S )Nz2isolation is expected to be either of {}, got {!r}F)super__init__ISOLATION_LEVELS
ValueErrorformatr   r   r   r   r   r   r   r   r   )self
connection	isolationreadonly
deferrable	__class__r   r   r!   /   s   
zTransaction.__init__c                    s*   | j r	tdd| _ |  I d H  d S )Nz6cannot enter context: already in an `async with` blockT)r   
apg_errorsInterfaceErrorstartr%   r   r   r   
__aenter__?   s   zTransaction.__aenter__c                    sz   z|  d W n tjy   |tu rY d S  w z|d ur&|  I d H  n|  I d H  W d| _d S W d| _d S d| _w )N	__aexit__F)_check_conn_validityr,   r-   GeneratorExit_Transaction__rollback_Transaction__commitr   )r%   extypeextbr   r   r   r1   F   s   	
zTransaction.__aexit__c                    sp  |  d | jtju rtd| j}|jdu r'|j	 r#td| |_n(| j
rL|jj
}|du r=t| jdI dH  }| j
|krLtd| j
|d| _| jr_|d| _d	| j}n;d
}| j
dkrk|d7 }n| j
dkru|d7 }n| j
dkr|d7 }n	| j
dkr|d7 }| jr|d7 }| jr|d7 }|d7 }z| j|I dH  W n ty   tj| _ w tj| _dS )z)Enter the transaction or savepoint block.r.   z0cannot start; the transaction is already startedNzEcannot use Connection.transaction() in a manually started transactionzSHOW transaction_isolation;zNnested transaction has a different isolation level: current {!r} != outer {!r}T	savepointzSAVEPOINT {};BEGINr   z ISOLATION LEVEL READ COMMITTEDr   z! ISOLATION LEVEL READ UNCOMMITTEDr   z  ISOLATION LEVEL REPEATABLE READr   z ISOLATION LEVEL SERIALIZABLEz
 READ ONLYz DEFERRABLE;)_Transaction__check_state_baser   r   r   r,   r-   r   	_top_xact	_protocolis_in_transactionr   ISOLATION_LEVELS_BY_VALUEfetchvalr$   r   _get_unique_idr   r   r   executeBaseExceptionr   )r%   contop_xact_isolationqueryr   r   r   r.   _   sj   










zTransaction.startc                 C   sX   | j tju rtd|| j tju rtd|| j tju r*td|d S )Nz/cannot {}; the transaction is already committedz1cannot {}; the transaction is already rolled backz,cannot {}; the transaction is in error state)r   r   r   r,   r-   r$   r   r   r%   opnamer   r   r   __check_state_base   s&   zTransaction.__check_state_basec                 C   s:   | j tjur| j tju rtd|| | d S d S )Nz-cannot {}; the transaction is not yet started)r   r   r   r   r,   r-   r$   r<   rH   r   r   r   __check_state   s   zTransaction.__check_statec                    t   |  d | jj| u rd | j_| jrd| j}nd}z| j|I d H  W n ty3   tj	| _
 w tj| _
d S )NcommitzRELEASE SAVEPOINT {};zCOMMIT;)_Transaction__check_stater   r=   r   r$   r   rC   rD   r   r   r   r   r%   rG   r   r   r   __commit      
zTransaction.__commitc                    rL   )NrollbackzROLLBACK TO {};z	ROLLBACK;)rN   r   r=   r   r$   r   rC   rD   r   r   r   r   rO   r   r   r   
__rollback   rQ   zTransaction.__rollbackc                    $   | j r	td|  I dH  dS )z;Exit the transaction or savepoint block and commit changes.z8cannot manually commit from within an `async with` blockN)r   r,   r-   r5   r/   r   r   r   rM         zTransaction.commitc                    rT   )z=Exit the transaction or savepoint block and rollback changes.z:cannot manually rollback from within an `async with` blockN)r   r,   r-   r4   r/   r   r   r   rR      rU   zTransaction.rollbackc                 C   s   g }| d| jj  | jd ur| | j | jr!| d | jr)| d | jj	
dr3d}n| jj	}d|| jjd|t| S )Nzstate:{}r(   r)   zasyncpg.asyncpgz<{}.{} {} {:#x}> )appendr$   r   namelowerr   r   r   r+   r
   
startswithr	   joinid)r%   attrsmodr   r   r   __repr__   s   


zTransaction.__repr__)r	   r
   r   __doc__	__slots__r!   r0   r1   r   guardedr.   r<   rN   r5   r4   rM   rR   r`   __classcell__r   r   r*   r   r   $   s"    
9

r   )enum r   r   r,   Enumr   r"   r@   ConnectionResourcer   r   r   r   r   <module>   s   