o
    i3                      @   s   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	e
Z	 e	e
Z	 dd Zd	d
 Zdd Zdd Zdd ZG dd deZdS )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                 C   sT   t r| t vrd S t | }| D ]}|tv r't| }||  |s't| qd S N)_collection_to_keypopvalues_key_to_collection)reflistener_to_keykeydispatch_reg r   T/var/www/edux/Edux_v2/venv/lib/python3.10/site-packages/sqlalchemy/event/registry.py_collection_gced5   s   


r   c                 C   sH   | j }t| }|j}t| j}||v rdS |||< t| }|||< dS )NFT)_keyr
   r   weakref
_listen_fnr   )	event_keyownerr   r   	owner_ref
listen_refr   r   r   r   _stored_in_collectionC   s   r   c                 C   sX   | j }t| }t| j}|j}||d  |st|= |tv r*t| }|| d S d S r   )r   r
   r   r   r   r   r   )r   r   r   r   r   r   r   r   r   r   _removed_from_collectionV   s   r   c           	      C   sv   |sd S |j }| j } t| }t|  }|D ]$}t |}|| }t| }| |v r0||  |ks/J n||| < |||< qd S r   )r   r   r   r
   )	newowneroldownerelementsold_listener_to_keynew_listener_to_key	listen_fnr   r   r   r   r   r   _stored_in_collection_multig   s   

r!   c                 C   sT   |sd S | j } t|  }|D ]}t |}|| }t| }|| d  |s't|= qd S r   )r   r   r   r
   r   )r   r   r   r    r   r   r   r   r   r   _clear}   s   
r"   c                   @   s   e Zd ZdZd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dZedd Zdd Zdd Zdd ZdS )	_EventKeyz)Represent :func:`.listen` arguments.
    )target
identifierfnfn_keyfn_wrapdispatch_targetNc                 C   sP   || _ || _|| _t|tjrt|jt|jf| _	nt|| _	|| _
|| _d S r   )r$   r%   r&   
isinstancetypes
MethodTypeid__func____self__r'   r(   r)   )selfr$   r%   r&   r)   _fn_wrapr   r   r   __init__   s   

z_EventKey.__init__c                 C   s   t | j| j| jfS r   )r-   r$   r%   r'   r0   r   r   r   r      s   z_EventKey._keyc                 C   s(   || j u r| S t| j| j| j| j|dS N)r1   )r   r#   r$   r%   r&   r)   )r0   r(   r   r   r   with_wrapper   s   
z_EventKey.with_wrapperc                 C   s(   || j u r| S t| j| j| j|| jdS r4   )r)   r#   r$   r%   r&   r(   )r0   r)   r   r   r   with_dispatch_target   s   
z_EventKey.with_dispatch_targetc                 O   s   | dd}| dd}| dd}| j| j| j}}}t|j|}	|	||}
| |
} t| jjj| j}t	|dr@|
  |sD|rW| tj| j|dj|i | d S | jjj| g|R i | d S )NonceF_once_unless_exceptionnamed_sa_warn)retry_on_exception)r   r)   r%   r   getattrdispatch_adjust_fn_specr5   _eventshasattrr:   r   	only_oncelisten_listen)r0   argskwr7   once_unless_exceptionr9   r$   r%   r&   dispatch_collectionadjusted_fnstub_functionr   r   r   rB      s4   



 z_EventKey.listenc                 C   st   | j }|tvrtd| j| j| jf t|}| D ]\}}| }| }|d ur7|d ur7|	| 
| qd S )Nz*No listeners found for event %s / %r / %s )r   r
   r   InvalidRequestErrorr$   r%   r&   r   itemsremover5   )r0   r   r   collection_reflistener_ref
collectionlistener_fnr   r   r   rL      s   
z_EventKey.removec                 C   s
   | j tv S )z?Return True if this event key is registered to listen.
        )r   r
   r3   r   r   r   contains   s   
z_EventKey.containsFc                 C   sN   | j | j}}t|j|}|r||j| | d S ||j| | d S r   )r)   r%   r<   r=   
for_modifyinsertappend)r0   	propagaterS   r9   retvalr$   r%   rG   r   r   r   base_listen   s   z_EventKey.base_listenc                 C   s   | j p| jS r   )r(   r&   r3   r   r   r   r     s   z_EventKey._listen_fnc                 C      t | |r|| j dS dS NTF)r   rT   r   r0   r   list_r   r   r   append_to_list     
z_EventKey.append_to_listc                 C   s   t | | || j d S r   )r   rL   r   rZ   r   r   r   remove_from_list  s   
z_EventKey.remove_from_listc                 C   rX   rY   )r   
appendleftr   rZ   r   r   r   prepend_to_list  r]   z_EventKey.prepend_to_listr   )FFFN)__name__
__module____qualname____doc__	__slots__r2   propertyr   r5   r6   rB   rL   rQ   rW   r   r\   r^   r`   r   r   r   r   r#      s$    
	
 

r#   )rd   
__future__r   collectionsr+   r    r   r   defaultdictdictr
   r   r   r   r   r!   r"   objectr#   r   r   r   r   <module>   s"   


