o
    6	f$                     @   s(  d Z ddlZddlmZ ddlmZmZmZmZm	Z	m
Z
 ddlmZ ddlmZ ddlmZ dd	lmZmZ dd
lmZ ddlmZ e
rVddlmZ d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()
    N)TracebackType)GenericIteratorOptionalTypeUnionTYPE_CHECKING   )pq)sql)errors)ConnectionTypePQGen)Self)connection_summary)Any)
Connection)AsyncConnectionc                   @   s8   e Zd ZdZdZ	dded fddZdef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AsyncTransactionNc                 C   s
   || _ d S N)r   )selfr    r   L/home/ertert/spirit/venv/lib/python3.10/site-packages/psycopg/transaction.py__init__*   s   
zRollback.__init__returnc                 C   s   | j j d| jdS )N())	__class____qualname__r   r   r   r   r   __repr__0   s   zRollback.__repr__r   )__name__
__module__r"   __doc__r   r   strr$   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)   4   s    r)   c                	   @   s  e Zd Z		d#dedee defddZedee fd	d
Z	defddZ
ded fddZdeee  dee dee dee fddZded fddZdee dee fddZdee fddZdee fddZdee fddZd$ddZd edee fd!d"ZdS )%BaseTransactionNF
connectionsavepoint_nameforce_rollbackc                 C   s<   || _ | j j| _|pd| _|| _d | _| _d| _d| _d S )N F)_connpgconn_savepoint_namer-   _entered_exited_outer_transaction_stack_index)r   r+   r,   r-   r   r   r   r   9   s   


zBaseTransaction.__init__r   c                 C      | j S )zV
        The name of the savepoint; `!None` if handling the main transaction.
        )r2   r#   r   r   r   r,   G   s   zBaseTransaction.savepoint_namec                 C   s|   | j j d| j j }t| j}| jsd}n| jsd}nd}| jr'| jdnd}d| d| d| d	| d
t| ddS )N.inactiveactive
terminated r.   <r   z) z at 0xx>)	r!   r&   r"   r   r1   r3   r4   r,   id)r   clsinfostatusspr   r   r   r$   P   s   
*zBaseTransaction.__repr__c                 c   sB    | j rtdd| _ |   |  D ]}| j|E d H  qd S )Nz(transaction blocks can be used only onceT)r3   	TypeError_push_savepoint_get_enter_commandsr0   _exec_command)r   commandr   r   r   
_enter_gen]   s   zBaseTransaction._enter_genexc_typeexc_valexc_tbc              
   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   rK   rL   rM   exc2r   r   r   	_exit_genf   s   
zBaseTransaction._exit_genc                 c   s>    |  d}d| _|r||  D ]}| j|E d H  qd S )NcommitT)_pop_savepointr4   _get_commit_commandsr0   rH   )r   exrI   r   r   r   rN      s   
zBaseTransaction._commit_genc                 c   s|    t |trtj| j ddd | d}d| _|r||  D ]}| j|E d H  q!t |tr<|j	r:|j	| u r<dS dS )Nz: Explicit rollback from: T)exc_inforollbackF)

isinstancer   rQ   debugr0   rV   r4   _get_rollback_commandsrH   r   )r   rL   rX   rI   r   r   r   rO      s   


zBaseTransaction._rollback_genc                 c   sD    | j r
| j V  | jr tdt| j| jV  d S d S )NzSAVEPOINT {})	r5   r0   _get_tx_start_commandr2   r   SQLformat
Identifieras_bytesr#   r   r   r   rG      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)	r2   r5   r   r_   r`   ra   rb   r0   _num_transactionsr#   r   r   r   rW      s   
z$BaseTransaction._get_commit_commandsc                 c   s    | j r+| js+tdjt| j d| jV  tdjt| j d| jV  | jr7| jjr4J dV  | jj	
 rH| jj	 E d H  d S d S )NzROLLBACK TO {n})nzRELEASE {n}s   ROLLBACK)r2   r5   r   r_   r`   ra   rb   r0   rc   	_preparedclearget_maintenance_commandsr#   r   r   r   r]      s$   z&BaseTransaction._get_rollback_commandsc                 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)r1   transaction_statusIDLEr5   r0   rc   r2   r6   r#   r   r   r   rF      s   
zBaseTransaction._push_savepointactionc                 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: )r0   rc   r6   r)   )r   rk   r   r   r   rV      s   zBaseTransaction._pop_savepointNF)r   N)r%   r&   r"   r   r   r(   boolr   propertyr,   r$   r   rJ   r   BaseExceptionr   rT   rN   rO   r   bytesrG   rW   r]   rF   rP   rV   r   r   r   r   r*   8   s<    
	

	
r*   c                   @   Z   e Zd ZdZdZedddZdefddZd	ee	e
  d
ee
 dee defddZdS )r   zO
    Returned by `Connection.transaction()` to handle a transaction block.
    r   r   Connection[Any]c                 C   r7   )z&The connection the object is managing.r0   r#   r   r   r   r+      s   zTransaction.connectionc                 C   s>   | j j | j |   W d    | S 1 sw   Y  | S r   r0   lockwaitrJ   r#   r   r   r   	__enter__   s   

zTransaction.__enter__rK   rL   rM   c                 C   sR   | j jtkr'| jj | j| |||W  d    S 1 s w   Y  d S dS rl   r1   rC   OKr0   ru   rv   rT   r   rK   rL   rM   r   r   r   __exit__   s
   
$zTransaction.__exit__N)r   rr   )r%   r&   r"   r'   rn   r+   r   rw   r   r   ro   r   rm   r{   r   r   r   r   r      s    
r   rr   c                   @   rq   )r   zT
    Returned by `AsyncConnection.transaction()` to handle a transaction block.
    r   r   AsyncConnection[Any]c                 C   r7   r   rs   r#   r   r   r   r+     s   zAsyncTransaction.connectionc              	      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   rt   r#   r   r   r   
__aenter__  s   zAsyncTransaction.__aenter__rK   rL   rM   c              	      sn   | 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 dS rl   rx   rz   r   r   r   	__aexit__  s   0zAsyncTransaction.__aexit__N)r   r|   )r%   r&   r"   r'   rn   r+   r   r}   r   r   ro   r   rm   r~   r   r   r   r   r     s    
r   r|   )*r'   loggingtypesr   typingr   r   r   r   r   r   r.   r
   r   r   eabcr   r   _compatr   pq.miscr   r   r+   r   connection_asyncr   TransactionStatusrj   
ConnStatusry   	getLoggerr%   rQ   rP   r   ProgrammingErrorr)   r*   r   r   r   r   r   r   <module>   s.     
 1