o
    Rc?                     @   sX   d dl Z ddlmZ ddlmZ ddlmZ G dd deZG dd	 d	eZd
d Z	dS )    N   )util   )excc                   @   s   e Z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d Zdd Zdd Zdd Zdd Zd*d d!Zd"d# Zd$d% Zd&d' Zd(d) ZdS )+IdentityMapc                 C   s   i | _ t | _t| | _d S N)_dictset	_modifiedweakrefref_wrself r   9D:\Flask\env\Lib\site-packages\sqlalchemy/orm/identity.py__init__   s   zIdentityMap.__init__c                 C   s
   t | _d S r   )_killed_add_unpresentr   r   r   r   _kill      
zIdentityMap._killc                 C   s
   | j  S r   )r   keysr   r   r   r   r      r   zIdentityMap.keysc                 C      t  r   NotImplementedErrorr   stater   r   r   replace      zIdentityMap.replacec                 C   r   r   r   r   r   r   r   add   r   zIdentityMap.addc                 C   s   |  | dS )zUoptional inlined form of add() which can assume item isn't present
        in the mapN)r   r   r   keyr   r   r   r   !   s   zIdentityMap._add_unpresentc                 C      t dNz%IdentityMap uses add() to insert datar   )r   Zdict_r   r   r   update&      zIdentityMap.updatec                 C   r"   Nz(IdentityMap uses remove() to remove datar   r   r   r   r   clear)   r%   zIdentityMap.clearc                 C   s"   | j |_|jr| j| d S d S r   )r   _instance_dictmodifiedr
   r   r   r   r   r   _manage_incoming_state,   s   z"IdentityMap._manage_incoming_statec                 C   s   |` |jr| j| d S d S r   )r(   r)   r
   discardr   r   r   r   _manage_removed_state2   s   z!IdentityMap._manage_removed_statec                 C   s   | j S r   )r
   r   r   r   r   _dirty_states7   r   zIdentityMap._dirty_statesc                 C   
   t | jS )z[return True if any InstanceStates present have been marked
        as 'modified'.

        )boolr
   r   r   r   r   check_modified:   s   
zIdentityMap.check_modifiedc                 C   s   || v S r   r   r   r!   r   r   r   has_keyA   r%   zIdentityMap.has_keyc                 C   r"   r&   r   r   r   r   r   popitemD   r%   zIdentityMap.popitemc                 G   r"   r&   r   )r   r!   argsr   r   r   popG   r%   zIdentityMap.popNc                 C   r"   r#   r   )r   r!   defaultr   r   r   
setdefaultJ   r%   zIdentityMap.setdefaultc                 C   r.   r   )lenr   r   r   r   r   __len__M   r   zIdentityMap.__len__c                 C   r   r   r   r   r   r   r   copyP   r   zIdentityMap.copyc                 C   r"   r#   r   )r   r!   valuer   r   r   __setitem__S   r%   zIdentityMap.__setitem__c                 C   r"   r&   r   r1   r   r   r   __delitem__V   r%   zIdentityMap.__delitem__r   )__name__
__module____qualname__r   r   r   r   r   r   r$   r'   r*   r,   r-   r0   r2   r3   r5   r7   r9   r:   r<   r=   r   r   r   r   r      s*    
r   c                   @   s   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zd"ddZ	dd Z
dd Zdd Zejr8dd Zdd Zdd Zdd Zdd Zd d! ZdS )#WeakInstanceDictc                 C   s&   | j | }| }|d u rt||S r   r   objKeyErrorr   r!   r   or   r   r   __getitem__[   s
   
zWeakInstanceDict.__getitem__c                 C   sD   z|| j v r| j | }| }nW dS W |d uS  ty!   Y dS w NFrB   rE   r   r   r   __contains__b   s   


zWeakInstanceDict.__contains__c                 C   s8   |j | jv rz	| j|j  |u W S  ty   Y dS w dS rH   )r!   r   rD   r   r   r   r   contains_staten   s   zWeakInstanceDict.contains_statec                 C   sf   |j | jv r$z| j|j  }W n	 ty   Y nw ||ur"| | nd S d }|| j|j < | | |S r   )r!   r   rD   r,   r*   )r   r   existingr   r   r   r   w   s   
zWeakInstanceDict.replacec                 C   s   |j }|| jv r5z| j| }W n	 ty   Y nw ||ur3| }|d ur2tdt||j f ndS || j|< | | dS )NzZCan't attach instance %s; another instance with key %s is already present in this session.FT)	r!   r   rD   rC   sa_excInvalidRequestErrororm_util	state_strr*   )r   r   r!   Zexisting_staterF   r   r   r   r      s(   


zWeakInstanceDict.addc                 C   s   || j |< | j|_d S r   )r   r   r(   r    r   r   r   r      s   
zWeakInstanceDict._add_unpresentNc                 C   sL   || j vr|S z| j | }W n ty   | Y S w | }|d u r$|S |S r   )r   rD   rC   )r   r!   r6   r   rF   r   r   r   get   s   
zWeakInstanceDict.getc                 C   s:   |   }g }|D ]}| }|d ur||j|f q|S r   )
all_statesrC   appendr!   r   valuesresultr   r;   r   r   r   items   s   zWeakInstanceDict.itemsc                 C   s4   |   }g }|D ]}| }|d ur|| q|S r   )rQ   rC   rR   rS   r   r   r   rT      s   
zWeakInstanceDict.valuesc                 C      t |  S r   )iterr   r   r   r   r   __iter__      zWeakInstanceDict.__iter__c                 C   rW   r   )rX   rV   r   r   r   r   	iteritems   rZ   zWeakInstanceDict.iteritemsc                 C   rW   r   )rX   rT   r   r   r   r   
itervalues   rZ   zWeakInstanceDict.itervaluesc                 C   s   t jr| j S t| j S r   )r   py2kr   rT   listr   r   r   r   rQ      s   
zWeakInstanceDict.all_statesc                 C   sF   z| j |j }W n
 ty   Y d S w ||u r!| j |jd  d S d S r   )r   r!   rD   r5   r   r   str   r   r   _fast_discard   s   zWeakInstanceDict._fast_discardc                 C   s   |  | d S r   )safe_discardr   r   r   r   r+      s   zWeakInstanceDict.discardc                 C   s`   |j | jv r,z| j|j  }W n
 ty   Y d S w ||u r.| j|j d  | | d S d S d S r   )r!   r   rD   r5   r,   r_   r   r   r   rb      s   zWeakInstanceDict.safe_discardr   )r>   r?   r@   rG   rI   rJ   r   r   r   rP   rV   rT   rY   r   r]   r[   r\   rQ   ra   r+   rb   r   r   r   r   rA   Z   s$    	
	
rA   c                 C   s   t jdt|  dd)NzObject %s cannot be converted to 'persistent' state, as this identity map is no longer valid.  Has the owning Session been closed?Zlkrp)code)rL   rM   rN   rO   )r   r!   r   r   r   r      s   r   )
r    r   rN   r   rL   objectr   rA   r   r   r   r   r   <module>   s   K 