B
    .²ô`Ä(  ã               @   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   úF/home/dcms/DCMS/lib/python3.7/site-packages/sqlalchemy/orm/identity.pyÚ__init__   s    zIdentityMap.__init__c             C   s
   | j  ¡ S )N)r   Úkeys)r   r   r   r   r      s    zIdentityMap.keysc             C   s
   t ƒ ‚d S )N)ÚNotImplementedError)r   Ústater   r   r   Úreplace   s    zIdentityMap.replacec             C   s
   t ƒ ‚d S )N)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 data)r   )r   Údict_r   r   r   Úupdate$   s    zIdentityMap.updatec             C   s   t dƒ‚d S )Nz(IdentityMap uses remove() to remove data)r   )r   r   r   r   Úclear'   s    zIdentityMap.clearc             C   s   | j |_|jr| j |¡ d S )N)r   Ú_instance_dictÚmodifiedr
   r   )r   r   r   r   r   Ú_manage_incoming_state*   s    z"IdentityMap._manage_incoming_statec             C   s   |` |jr| j |¡ d S )N)r   r   r
   Údiscard)r   r   r   r   r   Ú_manage_removed_state0   s    z!IdentityMap._manage_removed_statec             C   s   | j S )N)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 )Nr   )r   r   r   r   r   Úhas_key?   s    zIdentityMap.has_keyc             C   s   t dƒ‚d S )Nz(IdentityMap uses remove() to remove data)r   )r   r   r   r   ÚpopitemB   s    zIdentityMap.popitemc             G   s   t dƒ‚d S )Nz(IdentityMap uses remove() to remove data)r   )r   r   Úargsr   r   r   ÚpopE   s    zIdentityMap.popNc             C   s   t dƒ‚d S )Nz%IdentityMap uses add() to insert data)r   )r   r   Údefaultr   r   r   Ú
setdefaultH   s    zIdentityMap.setdefaultc             C   s
   t | jƒS )N)Úlenr   )r   r   r   r   Ú__len__K   s    zIdentityMap.__len__c             C   s
   t ƒ ‚d S )N)r   )r   r   r   r   ÚcopyN   s    zIdentityMap.copyc             C   s   t dƒ‚d S )Nz%IdentityMap uses add() to insert data)r   )r   r   Úvaluer   r   r   Ú__setitem__Q   s    zIdentityMap.__setitem__c             C   s   t dƒ‚d S )Nz(IdentityMap uses remove() to remove data)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'   r)   r+   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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 )N)r   ÚobjÚKeyError)r   r   r   Úor   r   r   Ú__getitem__Y   s
    
zWeakInstanceDict.__getitem__c             C   sH   y&|| j kr | j | }| ¡ }ndS W n tk
r:   dS X |d k	S d S )NF)r   r4   r5   )r   r   r   r6   r   r   r   Ú__contains__`   s    


zWeakInstanceDict.__contains__c             C   s<   |j | jkr4y| j|j  |kS  tk
r0   dS X ndS d S )NF)r   r   r5   )r   r   r   r   r   Úcontains_statel   s    zWeakInstanceDict.contains_statec             C   sj   |j | jkrLy| j|j  }W n tk
r0   Y qPX ||k	rF|  |¡ qPd S nd }|| j|j < |  |¡ |S )N)r   r   r5   r    r   )r   r   Úexistingr   r   r   r   u   s    
zWeakInstanceDict.replacec             C   s„   |j }|| jkrly| 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   r5   r4   Úsa_excÚInvalidRequestErrorÚorm_utilÚ	state_strr   )r   r   r   Zexisting_stater6   r   r   r   r   ˆ   s     


zWeakInstanceDict.addc             C   s   || j |< | j|_d S )N)r   r   r   )r   r   r   r   r   r   r   ¡   s    
zWeakInstanceDict._add_unpresentNc             C   sN   || j kr|S y| j | }W n tk
r0   |S X | ¡ }|d krF|S |S d S )N)r   r5   r4   )r   r   r(   r   r6   r   r   r   Úget¦   s    
zWeakInstanceDict.getc             C   s>   |   ¡ }g }x,|D ]$}| ¡ }|d k	r| |j|f¡ qW |S )N)Ú
all_statesr4   Úappendr   )r   ÚvaluesÚresultr   r-   r   r   r   Úitems´   s    
zWeakInstanceDict.itemsc             C   s8   |   ¡ }g }x&|D ]}| ¡ }|d k	r| |¡ qW |S )N)r@   r4   rA   )r   rB   rC   r   r-   r   r   r   rB   ½   s    
zWeakInstanceDict.valuesc             C   s   t |  ¡ ƒS )N)Úiterr   )r   r   r   r   Ú__iter__Ç   s    zWeakInstanceDict.__iter__c             C   s   t |  ¡ ƒS )N)rE   rD   )r   r   r   r   Ú	iteritemsÌ   s    zWeakInstanceDict.iteritemsc             C   s   t |  ¡ ƒS )N)rE   rB   )r   r   r   r   Ú
itervaluesÏ   s    zWeakInstanceDict.itervaluesc             C   s"   t jr| j ¡ S t| j ¡ ƒS d S )N)r   Úpy2kr   rB   Úlist)r   r   r   r   r@   Ò   s    
zWeakInstanceDict.all_statesc             C   sB   y| j |j }W n tk
r$   Y nX ||kr>| j  |jd ¡ d S )N)r   r   r5   r'   )r   r   Ústr   r   r   Ú_fast_discardØ   s    zWeakInstanceDict._fast_discardc             C   s   |   |¡ d S )N)Úsafe_discard)r   r   r   r   r   r   ä   s    zWeakInstanceDict.discardc             C   sX   |j | jkrTy| j|j  }W n tk
r0   Y n$X ||krT| j |j d ¡ |  |¡ d S )N)r   r   r5   r'   r    )r   r   rK   r   r   r   rM   ç   s    zWeakInstanceDict.safe_discardc             C   s   dS )Nr   r   )r   r   r   r   Úpruneó   s    zWeakInstanceDict.prune)N)r0   r1   r2   r7   r8   r9   r   r   r   r?   rD   rB   rF   r   rI   rG   rH   r@   rL   r   rM   rN   r   r   r   r   r3   X   s$   	
	
r3   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 )N)r   rH   )r   r   r   r   rH     s    zStrongInstanceDict.itervaluesc             C   s
   | j  ¡ S )N)r   rG   )r   r   r   r   rG   	  s    zStrongInstanceDict.iteritemsc             C   s
   t | jƒS )N)rE   r   )r   r   r   r   rF     s    zStrongInstanceDict.__iter__c             C   s
   | j | S )N)r   )r   r   r   r   r   r7     s    zStrongInstanceDict.__getitem__c             C   s
   || j kS )N)r   )r   r   r   r   r   r8     s    zStrongInstanceDict.__contains__Nc             C   s   | j  ||¡S )N)r   r?   )r   r   r(   r   r   r   r?     s    zStrongInstanceDict.getc             C   s
   | j  ¡ S )N)r   rB   )r   r   r   r   rB     s    zStrongInstanceDict.valuesc             C   s
   | j  ¡ S )N)r   rD   )r   r   r   r   rD     s    zStrongInstanceDict.itemsc             C   s   dd„ |   ¡ D ƒS )Nc             S   s   g | ]}t  |¡‘qS r   )r   Úinstance_state)Ú.0r6   r   r   r   ú
<listcomp>  s    z1StrongInstanceDict.all_states.<locals>.<listcomp>)rB   )r   r   r   r   r@     s    zStrongInstanceDict.all_statesc             C   s   |j | kot | |j  ¡|kS )N)r   r   rP   )r   r   r   r   r   r9   !  s    
z!StrongInstanceDict.contains_statec             C   s^   |j | jkr<| j|j  }t |¡}||k	r6|  |¡ q@d S nd }| ¡ | j|j < |  |¡ |S )N)r   r   r   rP   r    r4   r   )r   r   r:   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 )NzZCan't attach instance %s; another instance with key %s is already present in this session.FT)
r   r   rP   r   r;   r<   r=   r>   r4   r   )r   r   r   r   r   r   6  s    

zStrongInstanceDict.addc             C   s   |  ¡ | j|< | j|_d S )N)r4   r   r   r   )r   r   r   r   r   r   r   E  s    z!StrongInstanceDict._add_unpresentc             C   sH   y| j |j }W n tk
r$   Y n X t |¡|krD| j  |jd ¡ d S )N)r   r   r5   r   rP   r'   )r   r   r4   r   r   r   rL   J  s    z StrongInstanceDict._fast_discardc             C   s   |   |¡ d S )N)rM   )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 )N)r   r   r   rP   r'   r    )r   r   r4   rK   r   r   r   rM   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   r4   )rQ   Úsr   r   r   rR   e  s    z,StrongInstanceDict.prune.<locals>.<listcomp>)	r*   r@   r   ÚWeakValueDictionaryr   r   r   r"   r   )r   Z	ref_countZdirtyZkeepersr   r   r   rN   a  s    


zStrongInstanceDict.prune)N)r0   r1   r2   Ú__doc__r   rI   rH   rG   rF   r7   r8   r?   rB   rD   r@   r9   r   r   r   rL   r   rM   rN   r   r   r   r   rO   ÷   s&   
rO   )r   Ú r   r   r=   r   r;   Úobjectr   r3   rO   r   r   r   r   Ú<module>   s   H  