U
    P|jÁ  ã                   @   sF   d Z ddlmZ ddlmZmZ ddlmZmZ G dd„ dej	ƒZ
dS )z 
An in-memory caching resolver.
é    )Údefer)ÚcommonÚdns)ÚfailureÚlogc                   @   sR   e Zd ZdZdZddd„Zdd„ Zdd	„ Zd
d„ Zddd„Z	ddd„Z
dd„ ZdS )ÚCacheResolverzƒ
    A resolver that serves records from a local, memory cache.

    @ivar _reactor: A provider of L{interfaces.IReactorTime}.
    Nr   c                 C   sd   t j | ¡ i | _|| _i | _|d kr2ddlm} || _|r`| 	¡ D ]\}\}}|  
|||¡ qDd S )Nr   )Úreactor)r   ÚResolverBaseÚ__init__ÚcacheÚverboseÚcancelÚtwisted.internetr   Ú_reactorÚitemsÚcacheResult)Úselfr   r   r   ÚqueryÚsecondsÚpayload© r   ú7/tmp/pip-unpacked-wheel-audpp6lv/twisted/names/cache.pyr
      s    zCacheResolver.__init__c           
      C   sb   || _ | j ¡ }| j ¡ D ]B\}\}\}}}|| }|| | D ]}	|	j|k r@| j|=  qq@qd S ©N)Ú__dict__r   r   r   r   Úttl)
r   ÚstateÚnowÚkÚwhenÚansÚaddÚnsÚdiffZrecr   r   r   Ú__setstate__&   s    

zCacheResolver.__setstate__c                 C   s(   | j  ¡ D ]}|  ¡  q
| j  ¡  | jS r   )r   ÚvaluesÚclearr   )r   Úcr   r   r   Ú__getstate__1   s    

zCacheResolver.__getstate__c              
      s  | j  ¡ }t |||¡}z| j| \}\}}	}
W nF tk
rv   | jdkr\t dt	|ƒ ¡ t
 t t |¡¡¡ Y S X | jr�t dt	|ƒ ¡ || ‰ z8‡ fdd„|D ƒ‡ fdd„|	D ƒ‡ fdd„|
D ƒf}W n, tk
� rü   t
 t t |¡¡¡ Y S X t
 |¡S d S )Né   zCache miss for zCache hit for c              	      s.   g | ]&}t  |jj|j|j|jˆ  |j¡‘qS r   ©r   ZRRHeaderÚnameÚtypeÚclsr   r   ©Ú.0Úr©r"   r   r   Ú
<listcomp>G   s   ý    ÿz)CacheResolver._lookup.<locals>.<listcomp>c              	      s.   g | ]&}t  |jj|j|j|jˆ  |j¡‘qS r   r)   r-   r0   r   r   r1   M   s   ý    ÿc              	      s.   g | ]&}t  |jj|j|j|jˆ  |j¡‘qS r   r)   r-   r0   r   r   r1   S   s   ý    ÿ)r   r   r   ZQueryr   ÚKeyErrorr   r   ÚmsgÚreprr   Úfailr   ÚFailureÚDomainErrorÚ
ValueErrorZsucceed)r   r*   r,   r+   Útimeoutr   Úqr   r   Úauthr    Úresultr   r0   r   Ú_lookup7   s2    


ü
ü
üózCacheResolver._lookupc                 C   s   t  t t |¡¡¡S r   )r   r5   r   r6   r   r7   )r   r*   r9   r   r   r   ÚlookupAllRecords_   s    zCacheResolver.lookupAllRecordsc                 C   s²   | j dkrt d| ¡ |p$| j ¡ |f| j|< || jkrH| j|  ¡  t|d ƒt|d ƒ t|d ƒ }|r’|d j}|D ]}t	||jƒ}q~nd}| j 
|| j|¡| j|< dS )a±  
        Cache a DNS entry.

        @param query: a L{dns.Query} instance.

        @param payload: a 3-tuple of lists of L{dns.RRHeader} records, the
            matching result of the query (answers, authority and additional).

        @param cacheTime: The time (seconds since epoch) at which the entry is
            considered to have been added to the cache. If L{None} is given,
            the current time is used.
        r(   zAdding %r to cacher   é   N)r   r   r3   r   r   r   r   Úlistr   ÚminZ	callLaterÚ
clearEntry)r   r   r   Z	cacheTimeÚsÚmr/   r   r   r   r   b   s    

$
zCacheResolver.cacheResultc                 C   s   | j |= | j|= d S r   )r   r   )r   r   r   r   r   rB   �   s    zCacheResolver.clearEntry)Nr   N)N)N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r
   r#   r'   r=   r>   r   rB   r   r   r   r   r      s   
(

r   N)rH   r   r   Ztwisted.namesr   r   Ztwisted.pythonr   r   r	   r   r   r   r   r   Ú<module>   s   