
    jL'                       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	rddlmZ ddlmZ ej        j        Zej         j!        Z! ej"        e#          Z$ G d de%          Z& G d dej'                  Z( G d dee                   Z) G d de)d                   Z* G 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                  (    e Zd ZdZdZd
ddZ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                    || _         d S N)r   )selfr   s     ^/DATA/AppData/hermes/projects/honcho/.venv/lib/python3.11/site-packages/psycopg/transaction.py__init__zRollback.__init__+   s    &    returnstrc                0    | j         j         d| j        dS )N())	__class____qualname__r   r   s    r   __repr__zRollback.__repr__.   s!    .-EE0@EEEEr   r   )r   r   r   r    )__name__
__module__r%   __doc__r   r'    r   r   r   r       sX          J' ' ' ' 'F F F F F Fr   r   c                      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        3333r   r.   c                      e Zd Z G d dee          Z	 	 d%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Zd,dZd-d!Zd.d$ZdS )/BaseTransactionc                  *    e Zd ZdZdZdZdZdZdZdZ	dS )	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   Statusr2   7   s<        	 	 $	!9!9r   r?   NF
connectionr   savepoint_name
str | Noneforce_rollbackboolc                    || _         | j         j        | _        |pd| _        || _        | j        j        | _        d| _        d| _        d S )N F)	_connpgconn_savepoint_namerC   r?   r9   status_outer_transaction_stack_index)r   r@   rA   rC   s       r   r   zBaseTransaction.__init__F   sN      
j'-3,k-"'r   r   c                    | j         S )zV
        The name of the savepoint; `!None` if handling the main transaction.
        )rJ   r&   s    r   rA   zBaseTransaction.savepoint_nameT   s     ##r   r    c                    | 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. rF   <r"   z) z at 0xx>)	r$   r*   r%   r   rI   rA   rK   valueid)r   clsinfosps       r   r'   zBaseTransaction.__repr__]   s    *JJT^-HJJ!$+..,0,?G#((((RL3LLLLdk/LL4LLr$xxLLLLLr   PQGen[None]c              #  
  K   | j         | j        j        k    rt          d          | j        j        | _         |                                  |                                 D ]"}| j                            |          E d {V  #d S )Nz(transaction blocks can be used only once)	rK   r?   r9   	TypeErrorr:   _push_savepoint_get_enter_commandsrH   _exec_command)r   commands     r   
_enter_genzBaseTransaction._enter_genc   s      ;$+111FGGGk(//11 	9 	9Gz//8888888888	9 	9r   exc_typetype[BaseException] | Noneexc_valBaseException | Noneexc_tbTracebackType | NonePQGen[bool]c              #    K   |s#| j         s|                                 E d {V  dS 	 |                     |          E d {V S # t          $ r  t          $ r'}t
                              d| |           Y d }~dS d }~ww xY w)NFz#error ignored in rollback of %s: %s)rC   _commit_gen_rollback_genr.   	Exceptionloggerwarning)r   rb   rd   rf   exc2s        r   	_exit_genzBaseTransaction._exit_genl   s        	t2 	'')))))))))5#'#5#5g#>#>>>>>>>?/       DdDQQQuuuuus   A A?A::A?c              #     K   |                      d          }| j        j        | _        |r||                                 D ]"}| j                            |          E d {V  #d S )Ncommit)_pop_savepointr?   r;   rK   _get_commit_commandsrH   r_   )r   exr`   s      r   rj   zBaseTransaction._commit_gen   s        **k+ 	H0022 	9 	9Gz//8888888888	9 	9r   c              #  x  K   t          |t                    r$t                              | j         dd           |                     d          }t          |t                    s| j        r| j        j        | _	        n| j        j
        | _	        |r||                                 D ]"}| j                            |          E d {V  #| j        j                                         | j        j                            | j                  E d {V  t          |t                    r|j        r	|j        | u rdS dS )Nz: Explicit rollback from: T)exc_inforollbackF)
isinstancer   rm   debugrH   rs   rC   r?   r=   rK   r>   _get_rollback_commandsr_   	_preparedclearmaintain_genr   )r   rd   ru   r`   s       r   rk   zBaseTransaction._rollback_gen   sP     gx(( 	SLLDJBBBTLRRR  ,,gx(( 	=D,? 	=+<DKK+<DK 	H2244 	9 	9Gz//8888888888 	
""$$$:'44TZ@@@@@@@@@gx(( 	& '*=*E*Etur   Iterator[bytes]c              #    K   | j         r| j                                        V  | j        rZt	          j        d                              t	          j        | j                                                | j                  V  d S d S )NzSAVEPOINT {})	rL   rH   _get_tx_start_commandrJ   r   SQLformat
Identifieras_bytesr&   s    r   r^   z#BaseTransaction._get_enter_commands   s      " 	5*2244444 	''t';<<==$*%%    	 	r   c              #    K   | j         r_| j        sXt          j        d                              t          j        | j                                                 | j                  V  | j        r| j        j        rJ dV  d S d S )Nz
RELEASE {}s   COMMIT	rJ   rL   r   r   r   r   r   rH   _num_transactionsr&   s    r   rt   z$BaseTransaction._get_commit_commands   s       	(? 	%%t';<<==$*%%   " 	z3333OOOOO	 	r   c              #    K   | j         r| j        st          j        d                              t          j        | j                                                 | j                  V  t          j        d                              t          j        | j                                                 | j                  V  | j        r| j        j        rJ dV  d S d S )NzROLLBACK TO {n})nzRELEASE {n}s   ROLLBACKr   r&   s    r   r{   z&BaseTransaction._get_rollback_commands   s       
	(? 
	)**#.)=>>??$*%%   &&#.)=>>??$*%%   " 	z3333	 	r   Nonec                    | j         j        t          k    | _        | j        r| j        j        rJ n| j        sd| j        j        dz    | _        | j        j        | _        | j        xj        dz  c_        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)rI   transaction_statusIDLErL   rH   r   rJ   rM   r&   s    r   r]   zBaseTransaction._push_savepoint   s     #'+"@D"H" 	R z33333 ' R'Qtz/Ka/O'Q'Q$ J8
$$)$$$$r   actionException | Nonec                    | j         xj        dz  c_        | 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: )rH   r   rM   r.   )r   r   s     r   rs   zBaseTransaction._pop_savepoint   sW     	
$$)$$:'4+<<<4+F6FFFF
 
 	
r   NF)r@   r   rA   rB   rC   rD   )r   rB   r(   )r   rZ   )rb   rc   rd   re   rf   rg   r   rh   )rd   re   r   rh   )r   r   )r   r   )r   r    r   r   )r)   r*   r%   r    r   r?   r   propertyrA   r'   ra   rp   rj   rk   r^   rt   r{   r]   rs   r,   r   r   r0   r0   6   sM       : : : : :d : : :$ &*$	     $ $ $ X$M M M M9 9 9 9   29 9 9 9   6	 	 	 	
 
 
 
   "* * * *&
 
 
 
 
 
r   r0   c                  >    e Zd ZdZdZedd            ZddZddZdS )TransactionzO
    Returned by `Connection.transaction()` to handle a transaction block.
    r   r   Connection[Any]c                    | j         S )zLThe connection the object is managing.

        :type: `Connection`
        rH   r&   s    r   r@   zTransaction.connection        zr   r   c                    | j         j        5  | j                             |                                            d d d            n# 1 swxY w Y   | S r   rH   lockwaitra   r&   s    r   	__enter__zTransaction.__enter__  s    Z_ 	/ 	/JOODOO--...	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/s   -AA
A
rb   rc   rd   re   rf   rg   rD   c                    | j         j        t          k    rU| j        j        5  | j                            |                     |||                    cd d d            S # 1 swxY w Y   d S | j        j        | _        dS r   	rI   rK   OKrH   r   r   rp   r?   r<   r   rb   rd   rf   s       r   __exit__zTransaction.__exit__  s     ;## R Rzt~~h'P'PQQR R R R R R R R R R R R R R R R R R +,DK5s   /AA"%A"N)r   r   r   r   rb   rc   rd   re   rf   rg   r   rD   )r)   r*   r%   r+   r   r@   r   r   r,   r   r   r   r      k          J   X   
     r   r   r   c                  >    e Zd ZdZdZedd            ZddZddZdS )AsyncTransactionzT
    Returned by `AsyncConnection.transaction()` to handle a transaction block.
    r   r   AsyncConnection[Any]c                    | j         S )zQThe connection the object is managing.

        :type: `AsyncConnection`
        r   r&   s    r   r@   zAsyncTransaction.connection  r   r   r   c                   K   | j         j        4 d {V  | j                             |                                            d {V  d d d           d {V  n# 1 d {V swxY w Y   | S r   r   r&   s    r   
__aenter__zAsyncTransaction.__aenter__$  s      :? 	5 	5 	5 	5 	5 	5 	5 	5*//$//"3"3444444444	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5s   3A
A$'A$rb   rc   rd   re   rf   rg   rD   c                0  K   | j         j        t          k    rm| j        j        4 d {V  | j                            |                     |||                     d {V cd d d           d {V  S # 1 d {V swxY w Y   d S | j        j        | _        dS r   r   r   s       r   	__aexit__zAsyncTransaction.__aexit__)  sL      ;##z X X X X X X X X!Z__T^^Hgv-V-VWWWWWWWWX X X X X X X X X X X X X X X X X X X X X X X X X X X X X X +,DK5s   5A22
A<?A<N)r   r   r   r   )r)   r*   r%   r+   r   r@   r   r   r,   r   r   r   r     r   r   r   r   ),r+   
__future__r   loggingenumr   typesr   typingr   r   r   collections.abcr	   rF   r   er   r   abcr   r   _compatr   pq.miscr   r@   r   connection_asyncr   TransactionStatusr   
ConnStatusr   	getLoggerr)   rm   rl   r   ProgrammingErrorr.   r0   r   r   r,   r   r   <module>r      s;    # " " " " "              . . . . . . . . . . $ $ $ $ $ $               & & & & & & & &       ' ' ' ' ' ' 2&&&&&&111111	 ]		8	$	$F F F F Fy F F F$4 4 4 4 41#5 4 4 4z
 z
 z
 z
 z
gn- z
 z
 z
z    /"34   D    '=>     r   