
    \d                     \    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
dS )z 
An in-memory caching resolver.
    )defer)commondns)failurelogc                   F    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dS )CacheResolverz
    A resolver that serves records from a local, memory cache.

    @ivar _reactor: A provider of L{interfaces.IReactorTime}.
    Nr   c                     t           j                            |            i | _        || _        i | _        |ddlm} || _        |r4|	                                D ]!\  }\  }}| 
                    |||            d S d S )Nr   )reactor)r   ResolverBase__init__cacheverbosecanceltwisted.internetr   _reactoritemscacheResult)selfr   r   r   querysecondspayloads          3lib/python3.11/site-packages/twisted/names/cache.pyr   zCacheResolver.__init__   s    $$T***
?000000 	:-2[[]] : :))  9999	: 	:: :    c                     || _         | j                                        }| j                                        D ]1\  }\  }\  }}}||z
  }||z   |z   D ]}	|	j        |k     r
| j        |=  n2d S N)__dict__r   r   r   r   ttl)
r   statenowkwhenansaddnsdiffrecs
             r   __setstate__zCacheResolver.__setstate__&   s    m##%%+/:+;+;+=+= 	 	'Q&~S":DSy2~  7T>>
1E "	 	r   c                     | j                                         D ]}|                                  | j                                          | j        S r   )r   valuesclearr   )r   cs     r   __getstate__zCacheResolver.__getstate__1   sJ    ##%% 	 	AHHJJJJ}r   c                    | j                                         }t          j        |||          }	 | j        |         \  }\  }}	}
| j        r$t          j        dt          |          z              ||z
  	 fd|D             fd|	D             fd|
D             f}t          j
        |          S # t          $ r; t          j        t          j        t          j        |                              cY S w xY w# t           $ rj | j        dk    r$t          j        dt          |          z              t          j        t          j        t          j        |                              cY S w xY w)NzCache hit for c           	          g | ];}t          j        |j        j        |j        |j        |j        z
  |j                  <S  r   RRHeadernametypeclsr   r   .0rr&   s     r   
<listcomp>z)CacheResolver._lookup.<locals>.<listcomp>G   R         FKai   r   c           	          g | ];}t          j        |j        j        |j        |j        |j        z
  |j                  <S r0   r1   r6   s     r   r9   z)CacheResolver._lookup.<locals>.<listcomp>M   r:   r   c           	          g | ];}t          j        |j        j        |j        |j        |j        z
  |j                  <S r0   r1   r6   s     r   r9   z)CacheResolver._lookup.<locals>.<listcomp>S   r:   r      zCache miss for )r   r   r   Queryr   r   r   msgreprr   succeed
ValueErrorfailr   FailureDomainErrorKeyError)r   r3   r5   r4   timeoutr    qr"   r#   authr$   resultr&   s               @r   _lookupzCacheResolver._lookup7   s   m##%%IdD#&&#	-%)Z]"D"3c | 7(4::5666:D-    "%	      "&	      "%	  . }V,,,  J J Jz'/#/$2G2G"H"HIIIIIJ=  	F 	F 	F|a)DJJ6777:gocod.C.CDDEEEEE	Fs%   C< 7)B4 4AC98C9<A1E0/E0c                 r    t          j        t          j        t	          j        |                              S r   )r   rC   r   rD   r   rE   )r   r3   rG   s      r   lookupAllRecordszCacheResolver.lookupAllRecords_   s&    z'/#/$*?*?@@AAAr   c                    | j         dk    rt          j        d|z             |p| j                                        |f| j        |<   || j        v r| j        |                                          t          |d                   t          |d                   z   t          |d                   z   }|r(|d         j        }|D ]}t          ||j                  }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   r?   r   r   r   r   listr   min	callLater
clearEntry)r   r   r   	cacheTimesmr8   s          r   r   zCacheResolver.cacheResultb   s    <!G(50111&A$-*?*?*A*A7K
5DKK%%'''tGAJ///$wqz2B2BB 	!A " "15MM" A!]44QOOEr   c                 &    | j         |= | j        |= d S r   )r   r   )r   r   s     r   rS   zCacheResolver.clearEntry   s    JuKr   )Nr   Nr   )__name__
__module____qualname____doc__r   r   r(   r-   rK   rM   r   rS   r0   r   r   r	   r	      s          E: : : :	 	 	  &- &- &-PB B B BP P P P>    r   r	   N)r[   r   r   twisted.namesr   r   twisted.pythonr   r   r   r	   r0   r   r   <module>r^      s   
 
 # " " " " " % % % % % % % % ' ' ' ' ' ' ' 't t t t tF' t t t t tr   