o
    DDiL'                     @  s,  d Z ddlmZ ddlZddlmZ ddlmZ ddlm	Z	m
Z
mZ ddlmZ dd	lmZ dd
lmZmZ ddlmZmZ ddlmZ ddlmZ e	rXddlmZ ddlmZ ejjZej j!Z!e"e#Z$G dd de%Z&G dd dej'Z(G dd dee Z)G dd de)d Z*G dd de)d Z+dS )zC
Transaction context managers returned by Connection.transaction()
    )annotationsN)Enum)TracebackType)TYPE_CHECKINGAnyGeneric)Iterator   )errors)pqsql)ConnectionTypePQGen)Self)connection_summary)
Connection)AsyncConnectionc                   @  s*   e Zd ZdZdZddddZdd
dZdS )Rollbacka  
    Exit the current `Transaction` context immediately and rollback any changes
    made within this context.

    If a transaction context is specified in the constructor, rollback
    enclosing transactions contexts up to and including the one specified.
    psycopgNtransaction%Transaction | AsyncTransaction | Nonec                 C  s
   || _ d S N)r   )selfr    r   L/var/www/Datamplify/venv/lib/python3.10/site-packages/psycopg/transaction.py__init__+   s   
zRollback.__init__returnstrc                 C  s   | j j d| jdS )N())	__class____qualname__r   r   r   r   r   __repr__.   s   zRollback.__repr__r   )r   r   r   r   )__name__
__module__r!   __doc__r   r#   r   r   r   r   r       s
    r   c                   @  s   e Zd ZdZdS )OutOfOrderTransactionNestingz)Out-of-order transaction nesting detectedN)r%   r&   r!   r'   r   r   r   r   r(   2   s    r(   c                   @  s   e Zd ZG dd deeZ		d1d2ddZed3ddZd4ddZ	d5ddZ
d6ddZd5dd Zd7d!d"Zd8d$d%Zd8d&d'Zd8d(d)Zd9d+d,Zd:d/d0ZdS );BaseTransactionc                   @  s(   e Zd ZdZdZdZdZdZdZdZ	dS )	zBaseTransaction.Statusz
        The current status of a transaction.

        Exposed as the `~psycopg.Transaction.status` attribute of
        `~psycopg.Transaction` and `~psycopg.AsyncTransaction` objects.
        not_startedactive	committedfailedrolled_back_explicitlyrolled_back_with_errorN)
r%   r&   r!   r'   NOT_STARTEDACTIVE	COMMITTEDFAILEDROLLED_BACK_EXPLICITLYROLLED_BACK_WITH_ERRORr   r   r   r   Status7   s    r6   NF
connectionr   savepoint_name
str | Noneforce_rollbackboolc                 C  s:   || _ | j j| _|pd| _|| _| jj| _d| _d| _d S )N F)	_connpgconn_savepoint_namer:   r6   r0   status_outer_transaction_stack_index)r   r7   r8   r:   r   r   r   r   F   s   



zBaseTransaction.__init__r   c                 C     | j S )zV
        The name of the savepoint; `!None` if handling the main transaction.
        )r@   r"   r   r   r   r8   T   s   zBaseTransaction.savepoint_namer   c                 C  sd   | j j d| j j }t| j}| jr| jdnd}d| d| d| jj d| dt| dd	S )
N. r<   <r   z) z at 0xx>)	r    r&   r!   r   r?   r8   rA   valueid)r   clsinfospr   r   r   r#   ]   s   
.zBaseTransaction.__repr__PQGen[None]c                 c  sN    | j | jjkrtd| jj| _ |   |  D ]}| j|E d H  qd S )Nz(transaction blocks can be used only once)	rA   r6   r0   	TypeErrorr1   _push_savepoint_get_enter_commandsr>   _exec_command)r   commandr   r   r   
_enter_genc   s   
zBaseTransaction._enter_genexc_typetype[BaseException] | Noneexc_valBaseException | Noneexc_tbTracebackType | NonePQGen[bool]c              
   c  st    |s| j s|  E d H  dS z	| |E d H W S  ty      ty9 } ztd| | W Y d }~dS d }~ww )NFz#error ignored in rollback of %s: %s)r:   _commit_gen_rollback_genr(   	Exceptionloggerwarning)r   rV   rX   rZ   exc2r   r   r   	_exit_genl   s   
zBaseTransaction._exit_genc                 c  sB    |  d}| jj| _|r||  D ]}| j|E d H  qd S )Ncommit)_pop_savepointr6   r2   rA   _get_commit_commandsr>   rS   )r   exrT   r   r   r   r]      s   

zBaseTransaction._commit_genc                 c  s    t |trtj| j ddd | d}t |ts| jr$| jj| _	n| jj
| _	|r-||  D ]}| j|E d H  q1| jj  | jj| jE d H  t |tr]|jr[|j| u r]dS dS )Nz: Explicit rollback from: T)exc_inforollbackF)
isinstancer   r`   debugr>   re   r:   r6   r4   rA   r5   _get_rollback_commandsrS   	_preparedclearmaintain_genr   )r   rX   rg   rT   r   r   r   r^      s"   



zBaseTransaction._rollback_genIterator[bytes]c                 c  sD    | j r
| j V  | jr tdt| j| jV  d S d S )NzSAVEPOINT {})	rB   r>   _get_tx_start_commandr@   r   SQLformat
Identifieras_bytesr"   r   r   r   rR      s   z#BaseTransaction._get_enter_commandsc                 c  sP    | j r| jstdt| j | jV  | jr&| jjr!J dV  d S d S )Nz
RELEASE {}s   COMMIT	r@   rB   r   rr   rs   rt   ru   r>   _num_transactionsr"   r   r   r   rf      s   
z$BaseTransaction._get_commit_commandsc                 c  sv    | j r+| js+tdjt| j d| jV  tdjt| j d| jV  | jr9| jjr4J dV  d S d S )NzROLLBACK TO {n})nzRELEASE {n}s   ROLLBACKrv   r"   r   r   r   rl      s    
z&BaseTransaction._get_rollback_commandsNonec                 C  sZ   | j jtk| _| jr| jjrJ n| jsd| jjd  | _| jj| _| j jd7  _dS )z
        Push the transaction on the connection transactions stack.

        Also set the internal state of the object and verify consistency.
        _pg3_r	   N)r?   transaction_statusIDLErB   r>   rw   r@   rC   r"   r   r   r   rQ      s   
zBaseTransaction._push_savepointactionException | Nonec                 C  s6   | j  jd8  _| j j| jkrdS td| d|  S )zy
        Pop the transaction from the connection transactions stack.

        Also verify the state consistency.
        r	   Nztransaction z at the wrong nesting level: )r>   rw   rC   r(   )r   r}   r   r   r   re      s   zBaseTransaction._pop_savepointNF)r7   r   r8   r9   r:   r;   )r   r9   r$   )r   rO   )rV   rW   rX   rY   rZ   r[   r   r\   )rX   rY   r   r\   )r   rp   )r   ry   )r}   r   r   r~   )r%   r&   r!   r   r   r6   r   propertyr8   r#   rU   rc   r]   r^   rR   rf   rl   rQ   re   r   r   r   r   r)   6   s"    


	

	



r)   c                   @  6   e Zd ZdZdZedddZddd	ZdddZdS )TransactionzO
    Returned by `Connection.transaction()` to handle a transaction block.
    r   r   Connection[Any]c                 C  rD   )zLThe connection the object is managing.

        :type: `Connection`
        r>   r"   r   r   r   r7         zTransaction.connectionr   c                 C  s>   | j j | j |   W d    | S 1 sw   Y  | S r   r>   lockwaitrU   r"   r   r   r   	__enter__  s   

zTransaction.__enter__rV   rW   rX   rY   rZ   r[   r;   c                 C  s\   | j jtkr'| jj | j| |||W  d    S 1 s w   Y  d S | jj| _dS r   	r?   rA   OKr>   r   r   rc   r6   r3   r   rV   rX   rZ   r   r   r   __exit__  s   
$
zTransaction.__exit__N)r   r   r   r   rV   rW   rX   rY   rZ   r[   r   r;   )r%   r&   r!   r'   r   r7   r   r   r   r   r   r   r          
r   r   c                   @  r   )AsyncTransactionzT
    Returned by `AsyncConnection.transaction()` to handle a transaction block.
    r   r   AsyncConnection[Any]c                 C  rD   )zQThe connection the object is managing.

        :type: `AsyncConnection`
        r   r"   r   r   r   r7     r   zAsyncTransaction.connectionr   c              	     sZ   | j j4 I d H  | j |  I d H  W d   I d H  | S 1 I d H s&w   Y  | S r   r   r"   r   r   r   
__aenter__$  s   zAsyncTransaction.__aenter__rV   rW   rX   rY   rZ   r[   r;   c              	     sx   | j jtkr5| jj4 I d H  | j| |||I d H W  d   I d H  S 1 I d H s.w   Y  d S | jj| _dS r   r   r   r   r   r   	__aexit__)  s   0
zAsyncTransaction.__aexit__N)r   r   r   r   )r%   r&   r!   r'   r   r7   r   r   r   r   r   r   r     r   r   r   ),r'   
__future__r   loggingenumr   typesr   typingr   r   r   collections.abcr   r<   r
   er   r   abcr   r   _compatr   pq.miscr   r7   r   connection_asyncr   TransactionStatusr|   
ConnStatusr   	getLoggerr%   r`   r_   r   ProgrammingErrorr(   r)   r   r   r   r   r   r   <module>   s0    
 >"