U
    
W[                     @   sV   d Z ddlmZmZ ddlmZmZ ddlmZm	Z	 ddl
mZ G dd dejZdS )	z 
An in-memory caching resolver.
    )divisionabsolute_import)dnscommon)failurelog)deferc                   @   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   5/usr/lib/python3/dist-packages/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__4   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rt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>K   s   z)CacheResolver._lookup.<locals>.<listcomp>c              	      s.   g | ]&}t |jj|j|j|j  |jqS r   r+   r/   r2   r   r   r3   M   s   c              	      s.   g | ]&}t |jj|j|j|j  |jqS r   r+   r/   r2   r   r   r3   O   s   )r   r   r   ZQueryr   KeyErrorr   r   msgreprr   failr   FailureDomainError
ValueErrorZsucceed)r   r,   r.   r-   timeoutr   qr    r!   Zauthr"   resultr   r2   r   _lookup;   s2    




zCacheResolver._lookupc                 C   s   t tt|S r   )r   r7   r   r8   r   r9   )r   r,   r;   r   r   r   lookupAllRecordsW   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   r5   r   r   r   r   listr   minZ	callLater
clearEntry)r   r   r   Z	cacheTimesmr1   r   r   r   r   [   s    

$
zCacheResolver.cacheResultc                 C   s   | j |= | j|= d S r   )r   r   )r   r   r   r   r   rC   {   s    zCacheResolver.clearEntry)Nr   N)N)N)__name__
__module____qualname____doc__r   r   r%   r)   r>   r?   r   rC   r   r   r   r   r	      s   


 r	   N)rI   Z
__future__r   r   Ztwisted.namesr   r   Ztwisted.pythonr   r   r   r   r   r	   r   r   r   r   <module>   s
   