
    +h&!                         d Z ddlmZ ddlZddlZddlZddlmZ ddlmZ  ej                  e
      Z	  ej                  e
      Z	 d Zd Zd	 Zd
 Zd Z G d de      Zy)aJ  Provides managed registration services on behalf of :func:`.listen`
arguments.

By "managed registration", we mean that event listening functions and
other objects can be added to various collections in such a way that their
membership in all those collections can be revoked at once, based on
an equivalent :class:`._EventKey`.

    )absolute_importN   )exc)utilc                     t         r| t         vry t         j                  |       }|j                         D ]=  }|t        v st        |   }|j                  |        |r)t        j                  |       ? y N)_collection_to_keypopvalues_key_to_collection)reflistener_to_keykeydispatch_regs       L/var/www/html/venv/lib/python3.12/site-packages/sqlalchemy/event/registry.py_collection_gcedr   5   sj    ,>!>(,,S1O%%' ,$$-c2LS!"&&s+,    c                     | j                   }t        |   }|j                  }t        j                  | j                        }||v ry|||<   t
        |   }|||<   y)NFT)_keyr   r   weakref
_listen_fnr	   )	event_keyownerr   r   	owner_ref
listen_refr   s          r   _stored_in_collectionr   C   s^    
..C%c*L		IY112JL (L(3O"%OJr   c                     | j                   }t        |   }t        j                  | j                        }|j                  }|j                  |d        |st        |= |t        v rt        |   }|j                  |       y y r   )r   r   r   r   r   r
   r	   )r   r   r   r   r   r   r   s          r   _removed_from_collectionr   V   ss    
..C%c*LY112J		IY%s#&&,Y7J' 'r   c                 "   |sy |j                   }| j                   } t        |   }t        |    }|D ]?  }t        j                   |      }	 ||   }	 t        |   }| |v r
||    |k(  sJ ||| <   |||<   A y # t        $ r Y Nw xY w# t        $ r Y ]w xY wr   )r   r	   r   KeyErrorr   )	newowneroldownerelementsold_listener_to_keynew_listener_to_key	listen_fnr   r   r   s	            r   _stored_in_collection_multir'   g   s    ||H||H,X6,X6 .	[[+
	%j1C	-c2L |#)Z777%/L"*-J''.  	 	  		s$   	A3	B3	A?>A?	BBc                     |sy | j                   } t        |    }|D ]A  }t        j                   |      }||   }t        |   }|j	                  | d        |r;t        |= C y r   )r   r	   r   r   r
   )r   r#   r   r&   r   r   r   s          r   _clearr)      sg    IIE(/O (	[[+
j))#.%"3'(r   c                   ~    e Zd ZdZdZddZed        Zd Zd Z	d Z
d	 Zd
 Z	 	 	 	 	 ddZed        Zd Zd Zd Zy)	_EventKeyz$Represent :func:`.listen` arguments.)target
identifierfnfn_keyfn_wrapdispatch_targetNc                     || _         || _        || _        t        |t        j
                        r0t        |j                        t        |j                        f| _	        nt        |      | _	        || _
        || _        y r   )r,   r-   r.   
isinstancetypes
MethodTypeid__func____self__r/   r0   r1   )selfr,   r-   r.   r1   _fn_wraps         r   __init__z_EventKey.__init__   s]    $b%**+R[[/2bkk?:DKR&DK.r   c                 Z    t        | j                        | j                  | j                  fS r   )r6   r,   r-   r/   r9   s    r   r   z_EventKey._key   s    4;;$++>>r   c                     || j                   u r| S t        | j                  | j                  | j                  | j
                  |      S N)r:   )r   r+   r,   r-   r.   r1   )r9   r0   s     r   with_wrapperz_EventKey.with_wrapper   sA    doo%K$$  r   c                     || j                   u r| S t        | j                  | j                  | j                  || j
                        S r?   )r1   r+   r,   r-   r.   r0   )r9   r1   s     r   with_dispatch_targetz_EventKey.with_dispatch_target   sA    d222K r   c                    |j                  dd      }|j                  dd      }|j                  dd      }| j                  | j                  | j                  }}}t	        |j
                  |      }	|	j                  ||      }
| j                  |
      } t	        | j                  j
                  j                  | j                        }t        |d      r|j                          |s|rA | j                  t        j                  | j                  |            j                  |i | y  | j                  j
                  j                  | g|i | y )NonceF_once_unless_exceptionnamed_sa_warn)retry_on_exception)r
   r1   r-   r   getattrdispatch_adjust_fn_specr@   _eventshasattrrG   r   	only_oncelisten_listen)r9   argskwrD   once_unless_exceptionrF   r,   r-   r.   dispatch_collectionadjusted_fnstub_functions               r   rO   z_EventKey.listen   s6   vvfe$ "'? Gw&   OOOO 
 &foozB)99"eD  -  ))114??
 =*-""$(DOO8M fd	" !	" 2D  ))11$DDDr   c           	      h   | j                   }|t        vr=t        j                  d| j                  d| j
                  d| j                  d      t        j                  |      }|j                         D ]9  \  }} |       } |       }|||j                  | j                  |             ; y )NzNo listeners found for event z /  )r   r   r   InvalidRequestErrorr,   r-   r.   r
   itemsremover@   )r9   r   r   collection_reflistener_ref
collectionlistener_fns          r   r[   z_EventKey.remove   s    ii(());;: 
 *--c2,8,>,>,@ 	B(NL')J&.K%+*A!!$"3"3K"@A		Br   c                 &    | j                   t        v S )z6Return True if this event key is registered to listen.)r   r   r=   s    r   containsz_EventKey.contains   s    yy...r   c                    | j                   | j                  }}t        |j                  |      }|j	                  |j                        }	|r|	j                          |r|	j                  | |       y |	j                  | |       y r   )r1   r-   rI   rJ   
for_modify_set_asyncioinsertappend)
r9   	propagatere   rF   retvalasyncior,   r-   rT   rc   s
             r   base_listenz_EventKey.base_listen   sn     "114??
%foozB(33FOOD
##%dI.dI.r   c                 6    | j                   xs | j                  S r   )r0   r.   r=   s    r   r   z_EventKey._listen_fn  s    ||&tww&r   c                 T    t        | |      r|j                  | j                         yyNTF)r   rf   r   r9   r   list_s      r   append_to_listz_EventKey.append_to_list  s"     u-LL)r   c                 R    t        | |       |j                  | j                         y r   )r   r[   r   rn   s      r   remove_from_listz_EventKey.remove_from_list   s     u-T__%r   c                 T    t        | |      r|j                  | j                         yyrm   )r   
appendleftr   rn   s      r   prepend_to_listz_EventKey.prepend_to_list$  s$     u-T__-r   r   )FFFNF)__name__
__module____qualname____doc__	__slots__r;   propertyr   r@   rB   rO   r[   ra   rj   r   rp   rr   ru    r   r   r+   r+      sz    .I	/ ? ?

E@B"/ /, ' '&r   r+   )ry   
__future__r   collectionsr4   r    r   r   defaultdictdictr   r	   r   r   r   r'   r)   objectr+   r|   r   r   <module>r      sz    '      -[,,T2 	 -[,,T2 	,&(".@( R Rr   