U
    xž^Ä(  ã                   @   sl   d dl Z ddlm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	G dd„ deƒZ
dS )é    Né   )Ú
attributes)Ú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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-install-dq5v43_d/SQLAlchemy/sqlalchemy/orm/identity.pyÚ__init__   s    zIdentityMap.__init__c                 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   Ú_add_unpresent   s    zIdentityMap._add_unpresentc                 C   s   t dƒ‚d S ©Nz%IdentityMap uses add() to insert datar   )r   Ú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_state0   s    z!IdentityMap._manage_removed_statec                 C   s   | j S r   )r   r   r   r   r   Ú_dirty_states5   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_modified8   s    zIdentityMap.check_modifiedc                 C   s   || kS r   r   ©r   r   r   r   r   Úhas_key?   s    zIdentityMap.has_keyc                 C   s   t dƒ‚d S r!   r   r   r   r   r   ÚpopitemB   s    zIdentityMap.popitemc                 G   s   t dƒ‚d S r!   r   )r   r   Úargsr   r   r   ÚpopE   s    zIdentityMap.popNc                 C   s   t dƒ‚d S r   r   ©r   r   Údefaultr   r   r   Ú
setdefaultH   s    zIdentityMap.setdefaultc                 C   s
   t | jƒS r   )Úlenr	   r   r   r   r   Ú__len__K   s    zIdentityMap.__len__c                 C   s
   t ƒ ‚d S r   r   r   r   r   r   ÚcopyN   s    zIdentityMap.copyc                 C   s   t dƒ‚d S r   r   )r   r   Úvaluer   r   r   Ú__setitem__Q   s    zIdentityMap.__setitem__c                 C   s   t dƒ‚d S r!   r   r+   r   r   r   Ú__delitem__T   s    zIdentityMap.__delitem__)N)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r    r"   r%   r'   r(   r*   r,   r-   r/   r2   r4   r5   r7   r8   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"d#„ ZdS )%ÚWeakInstanceDictc                 C   s&   | j | }| ¡ }|d kr"t|ƒ‚|S r   ©r	   ÚobjÚKeyError©r   r   r   Úor   r   r   Ú__getitem__Y   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__`   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 rC   )r   r	   r?   r   r   r   r   Úcontains_statel   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   u   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_staterA   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   r1   r   rA   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   r6   r   r   r   Úitems´   s    zWeakInstanceDict.itemsc                 C   s4   |   ¡ }g }|D ]}| ¡ }|d k	r| |¡ q|S r   )rN   r>   rO   rP   r   r   r   rQ   ½   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   )rT   rS   r   r   r   r   Ú	iteritemsÌ   s    zWeakInstanceDict.iteritemsc                 C   s   t |  ¡ ƒS r   )rT   rQ   r   r   r   r   Ú
itervaluesÏ   s    zWeakInstanceDict.itervaluesc                 C   s"   t jr| j ¡ S t| j ¡ ƒS d S r   )r   Úpy2kr	   rQ   Úlistr   r   r   r   rN   Ò   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'   rZ   r   r   r   r^   ç   s    zWeakInstanceDict.safe_discardc                 C   s   dS )Nr   r   r   r   r   r   Úpruneó   s    zWeakInstanceDict.prune)N)r9   r:   r;   rB   rD   rE   r   r   r   rM   rS   rQ   rU   r   rX   rV   rW   rN   r\   r&   r^   r_   r   r   r   r   r<   X   s$   	
	
r<   c                   @   s    e Zd ZdZejr"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d„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ ZdS )&ÚStrongInstanceDicta&  A 'strong-referencing' version of the identity map.

    .. deprecated 1.1::
        The strong
        reference identity map is legacy.  See the
        recipe at :ref:`session_referencing_behavior` for
        an event-based approach to maintaining strong identity
        references.


    c                 C   s
   | j  ¡ S r   )r	   rW   r   r   r   r   rW     s    zStrongInstanceDict.itervaluesc                 C   s
   | j  ¡ S r   )r	   rV   r   r   r   r   rV   	  s    zStrongInstanceDict.iteritemsc                 C   s
   t | jƒS r   )rT   r   r   r   r   r   rU     s    zStrongInstanceDict.__iter__c                 C   s
   | j | S r   ©r	   r+   r   r   r   rB     s    zStrongInstanceDict.__getitem__c                 C   s
   || j kS r   ra   r+   r   r   r   rD     s    zStrongInstanceDict.__contains__Nc                 C   s   | j  ||¡S r   )r	   rM   r0   r   r   r   rM     s    zStrongInstanceDict.getc                 C   s
   | j  ¡ S r   )r	   rQ   r   r   r   r   rQ     s    zStrongInstanceDict.valuesc                 C   s
   | j  ¡ S r   )r	   rS   r   r   r   r   rS     s    zStrongInstanceDict.itemsc                 C   s   dd„ |   ¡ D ƒS )Nc                 S   s   g | ]}t  |¡‘qS r   )r   Úinstance_state)Ú.0rA   r   r   r   Ú
<listcomp>  s     z1StrongInstanceDict.all_states.<locals>.<listcomp>)rQ   r   r   r   r   rN     s    zStrongInstanceDict.all_statesc                 C   s   |j | kot | |j  ¡|kS r   )r   r   rb   r   r   r   r   rE   !  s    
þz!StrongInstanceDict.contains_statec                 C   s^   |j | jkr<| j|j  }t |¡}||k	r6|  |¡ q@d S nd }| ¡ | j|j < |  |¡ |S r   )r   r	   r   rb   r'   r>   r%   rF   r   r   r   r   '  s    

zStrongInstanceDict.replacec                 C   s`   |j | kr>t | j|j  ¡|k	r:t dt |¡|j f ¡‚dS | ¡ | j|j < |  	|¡ dS d S rH   )
r   r   rb   r	   rI   rJ   rK   rL   r>   r%   r   r   r   r   r   6  s    
ýÿ
zStrongInstanceDict.addc                 C   s   |  ¡ | j|< | j|_d S r   )r>   r	   r   r#   r   r   r   r   r   E  s    z!StrongInstanceDict._add_unpresentc                 C   sH   z| j |j }W n tk
r$   Y n X t |¡|krD| j  |jd ¡ d S r   )r	   r   r?   r   rb   r/   )r   r   r>   r   r   r   r\   J  s    z StrongInstanceDict._fast_discardc                 C   s   |   |¡ d S r   r]   r   r   r   r   r&   V  s    zStrongInstanceDict.discardc                 C   sH   |j | jkrD| j|j  }t |¡}||krD| j |j d ¡ |  |¡ d S r   )r   r	   r   rb   r/   r'   )r   r   r>   r[   r   r   r   r^   Y  s    
zStrongInstanceDict.safe_discardc                 C   sX   t | ƒ}dd„ |  ¡ D ƒ}t ¡ }| | ¡ | j ¡  | j |¡ t|ƒ| _|t | ƒ S )z%prune unreferenced, non-dirty states.c                 S   s   g | ]}|j r| ¡ ‘qS r   )r$   r>   )rc   Úsr   r   r   rd   e  s      z,StrongInstanceDict.prune.<locals>.<listcomp>)	r3   rN   r   ÚWeakValueDictionaryr    r	   r"   r)   r$   )r   Z	ref_countZdirtyZkeepersr   r   r   r_   a  s    


zStrongInstanceDict.prune)N)r9   r:   r;   Ú__doc__r   rX   rW   rV   rU   rB   rD   rM   rQ   rS   rN   rE   r   r   r   r\   r&   r^   r_   r   r   r   r   r`   ÷   s&   
r`   )r   Ú r   r   rK   r   rI   Úobjectr   r<   r`   r   r   r   r   Ú<module>   s   H  