o
    RcO"                     @   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   ;D:\Flask\env\Lib\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   s   |sd S |j }| j } t| }t|  }|D ]<}t |}z|| }W n	 ty*   Y qw zt| }W n	 ty:   Y qw | |v rH||  |ksGJ n||| < |||< qd S r   )r   r   r   KeyErrorr
   )	ZnewownerZoldownerelementsZold_listener_to_keyZ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$   r-   r   r   r   r      s   z_EventKey._keyc                 C   s(   || j u r| S t| j| j| j| j|dS N)r.   )r   r    r!   r"   r#   r&   )r-   r%   r   r   r   with_wrapper   s   
z_EventKey.with_wrapperc                 C   s(   || j u r| S t| j| j| j|| jdS r1   )r&   r    r!   r"   r#   r%   )r-   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onceFZ_once_unless_exceptionnamed_sa_warn)Zretry_on_exception)r   r&   r"   r   getattrdispatchZ_adjust_fn_specr2   Z_eventshasattrr6   r   Z	only_oncelistenZ_listen)r-   argskwr4   Zonce_unless_exceptionr5   r!   r"   r#   dispatch_collectionZadjusted_fnZstub_functionr   r   r   r:      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   ZInvalidRequestErrorr!   r"   r#   r   itemsremover2   )r-   r   r   Zcollection_refZlistener_refZ
collectionZlistener_fnr   r   r   r?      s   
z_EventKey.removec                 C   s
   | j tv S )z6Return True if this event key is registered to listen.)r   r
   r0   r   r   r   contains   s   
z_EventKey.containsFc           
      C   sV   | j | j}}t|j|}||j}	|r|	  |r#|	| | d S |	| | d S r   )r&   r"   r7   r8   
for_modifyZ_set_asyncioinsertappend)
r-   	propagaterB   r5   retvalasyncior!   r"   r=   rA   r   r   r   base_listen   s   	z_EventKey.base_listenc                 C   s   | j p| jS r   )r%   r#   r0   r   r   r   r     s   z_EventKey._listen_fnc                 C      t | |r|| j dS dS NTF)r   rC   r   r-   r   list_r   r   r   append_to_list     
z_EventKey.append_to_listc                 C   s   t | | || j d S r   )r   r?   r   rJ   r   r   r   remove_from_list   s   
z_EventKey.remove_from_listc                 C   rH   rI   )r   
appendleftr   rJ   r   r   r   prepend_to_list$  rM   z_EventKey.prepend_to_listr   )FFFNF)__name__
__module____qualname____doc__	__slots__r/   propertyr   r2   r3   r:   r?   r@   rG   r   rL   rN   rP   r   r   r   r   r       s,    
	
 

r    )rT   
__future__r   collectionsr(   r    r   r   defaultdictdictr
   r   r   r   r   r   r   objectr    r   r   r   r   <module>   s"   


 