U
    ccA                     @   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   ;/tmp/pip-unpacked-wheel-8u86ls_i/sqlalchemy/orm/identity.py__init__   s    zIdentityMap.__init__c                 C   s
   t | _d S r   )_killed_add_unpresentr   r   r   r   _kill   s    zIdentityMap._killc                 C   s
   | j  S r   )r   keysr   r   r   r   r      s    zIdentityMap.keysc                 C   s
   t  d S r   NotImplementedErrorr   stater   r   r   replace   s    zIdentityMap.replacec                 C   s
   t  d S r   r   r   r   r   r   add   s    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   s   t dd S Nz%IdentityMap uses add() to insert datar   )r   Zdict_r   r   r   update&   s    zIdentityMap.updatec                 C   s   t dd S Nz(IdentityMap uses remove() to remove datar   r   r   r   r   clear)   s    zIdentityMap.clearc                 C   s   | j |_|jr| j| 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 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   s    zIdentityMap._dirty_statesc                 C   s
   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   || kS r   r   r   r   r   r   r   has_keyA   s    zIdentityMap.has_keyc                 C   s   t dd S r!   r   r   r   r   r   popitemD   s    zIdentityMap.popitemc                 G   s   t dd S r!   r   )r   r   argsr   r   r   popG   s    zIdentityMap.popNc                 C   s   t dd S r   r   )r   r   defaultr   r   r   
setdefaultJ   s    zIdentityMap.setdefaultc                 C   s
   t | jS r   )lenr   r   r   r   r   __len__M   s    zIdentityMap.__len__c                 C   s
   t  d S r   r   r   r   r   r   copyP   s    zIdentityMap.copyc                 C   s   t dd S r   r   )r   r   valuer   r   r   __setitem__S   s    zIdentityMap.__setitem__c                 C   s   t dd S r!   r   r+   r   r   r   __delitem__V   s    zIdentityMap.__delitem__)N)__name__
__module____qualname__r   r   r   r   r   r   r    r"   r%   r'   r(   r*   r,   r-   r/   r1   r3   r4   r6   r7   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rpdd Zdd Zdd Zdd Zdd Zd d! ZdS )#WeakInstanceDictc                 C   s&   | j | }| }|d kr"t||S r   r   objKeyErrorr   r   r   or   r   r   __getitem__[   s
    
zWeakInstanceDict.__getitem__c                 C   sL   z(|| j kr | j | }| }nW dS W n tk
r>   Y dS X |d k	S d S NFr<   r?   r   r   r   __contains__b   s    



zWeakInstanceDict.__contains__c                 C   s@   |j | jkr8z| j|j  |kW S  tk
r4   Y dS X ndS d S rB   )r   r   r>   r   r   r   r   contains_staten   s    
zWeakInstanceDict.contains_statec                 C   sj   |j | jkrLz| j|j  }W n tk
r0   Y qPX ||k	rF| | qPd S nd }|| j|j < | | |S r   )r   r   r>   r'   r%   )r   r   existingr   r   r   r   w   s    
zWeakInstanceDict.replacec                 C   s   |j }|| jkrlz| j| }W n tk
r2   Y n:X ||k	rh| }|d k	rlt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   r>   r=   sa_excInvalidRequestErrororm_util	state_strr%   )r   r   r   Zexisting_stater@   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   sR   || j kr|S z| j | }W n tk
r4   | Y S X | }|d krJ|S |S d S r   )r   r>   r=   )r   r   r0   r   r@   r   r   r   get   s    

zWeakInstanceDict.getc                 C   s:   |   }g }|D ]$}| }|d k	r||j|f q|S r   )
all_statesr=   appendr   r   valuesresultr   r5   r   r   r   items   s    zWeakInstanceDict.itemsc                 C   s4   |   }g }|D ]}| }|d k	r|| q|S r   )rK   r=   rL   rM   r   r   r   rN      s    zWeakInstanceDict.valuesc                 C   s   t |  S r   )iterr   r   r   r   r   __iter__   s    zWeakInstanceDict.__iter__c                 C   s   t |  S r   )rQ   rP   r   r   r   r   	iteritems   s    zWeakInstanceDict.iteritemsc                 C   s   t |  S r   )rQ   rN   r   r   r   r   
itervalues   s    zWeakInstanceDict.itervaluesc                 C   s"   t jr| j S t| j S d S r   )r   py2kr   rN   listr   r   r   r   rK      s    
zWeakInstanceDict.all_statesc                 C   sB   z| j |j }W n tk
r$   Y nX ||kr>| j |jd  d S r   )r   r   r>   r/   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   sX   |j | jkrTz| j|j  }W n tk
r0   Y n$X ||krT| j|j d  | | d S r   )r   r   r>   r/   r'   rW   r   r   r   rZ      s    zWeakInstanceDict.safe_discard)N)r8   r9   r:   rA   rC   rD   r   r   r   rJ   rP   rN   rR   r   rU   rS   rT   rK   rY   r&   rZ   r   r   r   r   r;   Z   s"   	
	
r;   c                 C   s   t jdt|  ddd S )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)rF   rG   rH   rI   )r   r   r   r   r   r      s    r   )
r    r   rH   r   rF   objectr   r;   r   r   r   r   r   <module>   s   K 