
    Ϫf                     ^    d Z ddlmZ ddlmZmZ ddlmZmZ  G d dej                        Z
y)z 
An in-memory caching resolver.
    )defer)commondns)failurelogc                   D    e Zd ZdZdZd
dZd Zd Zd ZddZ	ddZ
d	 Zy)CacheResolverz
    A resolver that serves records from a local, memory cache.

    @ivar _reactor: A provider of L{interfaces.IReactorTime}.
    Nc                     t         j                  j                  |        i | _        || _        i | _        |ddlm} || _        |r/|j                         D ]  \  }\  }}| j                  |||        y y )Nr   )reactor)r   ResolverBase__init__cacheverbosecanceltwisted.internetr   _reactoritemscacheResult)selfr   r   r   querysecondspayloads          5/usr/lib/python3/dist-packages/twisted/names/cache.pyr   zCacheResolver.__init__   ss    $$T*
?0-2[[] :))  9:     c                     || _         | j                  j                         }| j                  j	                         D ]<  \  }\  }\  }}}||z
  }||z   |z   D ]   }	|	j
                  |k  s| j                  |=  < > y N)__dict__r   r   r   r   ttl)
r   statenowkwhenansaddnsdiffrecs
             r   __setstate__zCacheResolver.__setstate__&   s    mm##%)-)9)9); 	%A%nsC:DSy2~ 77T>

1	r   c                     | j                   j                         D ]  }|j                           | j                   j                          | j                  S r   )r   valuesclearr   )r   cs     r   __getstate__zCacheResolver.__getstate__1   sA    ##% 	AHHJ	}}r   c                 *   | j                   j                         }t        j                  |||      }	 | j                  |   \  }\  }}	}
| j
                  r!t        j                  dt        |      z          ||z
  }	 |D cg c]Z  }t        j                  |j                  j                  |j                  |j                  |j                  |z
  |j                        \ c}|	D cg c]Z  }t        j                  |j                  j                  |j                  |j                  |j                  |z
  |j                        \ c}|
D cg c]Z  }t        j                  |j                  j                  |j                  |j                  |j                  |z
  |j                        \ c}f}t        j                   |      S c c}w c c}w c c}w # t"        $ r> t        j$                  t'        j(                  t        j*                  |                  cY S w xY w# t,        $ rn | j
                  dkD  r!t        j                  dt        |      z          t        j$                  t'        j(                  t        j*                  |                  cY S w xY w)NzCache hit for    zCache miss for )r   r   r   Queryr   r   r   msgreprRRHeadernametypeclsr   r   r   succeed
ValueErrorfailr   FailureDomainErrorKeyError)r   r4   r6   r5   timeoutr    qr"   r#   authr$   r&   rresults                 r   _lookupzCacheResolver._lookup7   s   mm##%IIdD#&#	-%)ZZ]"D"3c ||(4:56:D- "%	  FFKKaii "&	  FFKKaii "%	  FFKKaii. }}V,,-  Jzz'//#//$2G"HIIJ=  	F||a)DJ67::goocood.CDEE	FsR   H <G  AGG %AGG 
AG)G G AHHA4JJc                 x    t        j                  t        j                  t	        j
                  |                  S r   )r   r9   r   r:   r   r;   )r   r4   r=   s      r   lookupAllRecordszCacheResolver.lookupAllRecords_   s#    zz'//#//$*?@AAr   c                 $   | j                   dkD  rt        j                  d|z         |xs | j                  j	                         |f| j
                  |<   || j                  v r| j                  |   j                          t        |d         t        |d         z   t        |d         z   }|r-|d   j                  }|D ]  }t        ||j                        } nd}| j                  j                  || j                  |      | j                  |<   y)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   r1   r   r   r   r   listr   min	callLater
clearEntry)r   r   r   	cacheTimesmr@   s          r   r   zCacheResolver.cacheResultb   s     <<!GG(501&A$--*?*?*A7K

5DKKKK%%'tGAJ//$wqz2BB!A "155M" A!]]44QOEr   c                 8    | j                   |= | j                  |= y r   )r   r   )r   r   s     r   rJ   zCacheResolver.clearEntry   s    JJuKKr   )Nr   Nr   )__name__
__module____qualname____doc__r   r   r(   r-   rB   rD   r   rJ    r   r   r	   r	      s4     E:	&-PBP>r   r	   N)rR   r   r   twisted.namesr   r   twisted.pythonr   r   r   r	   rS   r   r   <module>rV      s)   

 # % 'tF'' tr   