
    df                         d Z ddlZddlZddlZddlZddlZddlZddlZddlm	Z	 ddl
mZmZ ddlmZ ddlmZ  G d de          ZdS )	zFile-based cache backend    N)md5)DEFAULT_TIMEOUT	BaseCache)locks)file_move_safec                        e Zd ZdZej        Z fdZedfdZ	ddZ
d ZedfdZedfdZdd	Zd
 ZddZd Zd ZddZd Zd Zd Z xZS )FileBasedCachez.djcachec                     t                                          |           t          j                            |          | _        |                                  d S N)super__init__ospathabspath_dir
_createdir)selfdirparams	__class__s      `D:\Python Project\djangoTemplates\venv\Lib\site-packages\django/core/cache/backends/filebased.pyr   zFileBasedCache.__init__   sF       GOOC((	    Nc                 f    |                      ||          rdS |                     ||||           dS NFT)has_keyset)r   keyvaluetimeoutversions        r   addzFileBasedCache.add   s:    <<W%% 	5eWg...tr   c                 Z   |                      ||          }	 t          |d          5 }|                     |          sDt          j        t          j        |                                                    cd d d            S 	 d d d            n# 1 swxY w Y   n# t          $ r Y nw xY w|S )Nrb)	_key_to_fileopen_is_expiredpickleloadszlib
decompressreadFileNotFoundError)r   r   defaultr    fnamefs         r   getzFileBasedCache.get   s"   !!#w//	eT"" Ca''** C!<(A(ABBC C C C C C C CCC C C C C C C C C C C C C C C ! 	 	 	D	s;   B AB5B B BB BB 
B('B(c                    |                      |          }|                    t          j        || j                             |                    t          j        t          j        || j                                       d S r   )get_backend_timeoutwriter'   dumpspickle_protocolr)   compress)r   filer   r   expirys        r   _write_contentzFileBasedCache._write_content)   sg    ))'22

6<(<==>>>

4=eT5I!J!JKKLLLLLr   c                    |                                   |                     ||          }|                                  t          j        | j                  \  }}d}	 t          |d          5 }	|                     |	||           d d d            n# 1 swxY w Y   t          ||d           d}|st          j
        |           d S d S # |st          j
        |           w w xY w)N)r   FwbT)allow_overwrite)r   r$   _culltempfilemkstempr   r%   r9   r   r   remove)
r   r   r   r   r    r.   fdtmp_pathrenamedr/   s
             r   r   zFileBasedCache.set.   s4   !!#w//

'DI666H	$b$ 71##Aw6667 7 7 7 7 7 7 7 7 7 7 7 7 7 78UDAAAAG $	(#####$ $7 $	(####$s0   C /BC BC BC C%c                 v   	 t          |                     ||          d          5 }	 t          j        |t          j                   |                     |          r"	 t          j        |           d d d            dS t          j        t          j
        |                                                    }|                    d           |                     |||           	 t          j        |           d d d            dS # t          j        |           w xY w# 1 swxY w Y   d S # t          $ r Y dS w xY w)Nzr+bFr   T)r%   r$   r   lockLOCK_EXr&   unlockr'   r(   r)   r*   r+   seekr9   r,   )r   r   r   r    r/   previous_values         r   touchzFileBasedCache.touch=   s   	d''W55u== $
$Jq%-000''** $$ LOOO$ $ $ $ $ $ $ $ *0doaffhh6O6O)P)Pq			++AwGGG#LOOO$ $ $ $ $ $ $ $ LOOOO$ $ $ $ $ $ $ $ $ $ ! 	 	 	55	s^   $D* D4DD1D* >A$D#D7D* DDD!!D* $D!%D* *
D87D8c                 T    |                      |                     ||                    S r   )_deleter$   r   r   r    s      r   deletezFileBasedCache.deleteN   s$    ||D--c7;;<<<r   c                     |                     | j                  rt          j                            |          sdS 	 t          j        |           n# t          $ r Y dS w xY wdS r   )
startswithr   r   r   existsr@   r,   r   r.   s     r   rL   zFileBasedCache._deleteQ   su    	** 	"'..2G2G 	5	Ie  	 	 	55	 ts   A 
A A c                     |                      ||          }	 t          |d          5 }|                     |           cd d d            S # 1 swxY w Y   d S # t          $ r Y dS w xY w)Nr#   F)r$   r%   r&   r,   )r   r   r    r.   r/   s        r   r   zFileBasedCache.has_key[   s    !!#w//	eT"" /a++A.../ / / / / / / / / / / / / / / / / /  	 	 	55	s3   A AA AA AA 
A&%A&c                 ,   |                                  }t          |          }|| j        k     rdS | j        dk    r|                                 S t          j        |t          || j        z                      }|D ]}|                     |           dS )z
        Remove random cache entries if max_entries is reached at a ratio
        of num_entries / cull_frequency. A value of 0 for CULL_FREQUENCY means
        that the entire cache will be purged.
        Nr   )	_list_cache_fileslen_max_entries_cull_frequencyclearrandomsampleintrL   )r   filelistnum_entriesr.   s       r   r=   zFileBasedCache._cullc   s     ))++(mm***F1$$::<<=3{T=Q/Q+R+RSS 	  	 ELL	  	 r   c                     t          j        d          }	 t          j        | j        dd           t          j        |           d S # t          j        |           w xY w)N?   i  T)exist_ok)r   umaskmakedirsr   )r   	old_umasks     r   r   zFileBasedCache._createdirt   s[     HUOO		 K	548888HYBHYs   A Ac           	         |                      ||          }t          j                            | j        d                    t          |                                d                                          | j        g                    S )z
        Convert a key into a cache file path. Basically this is the
        root cache path joined with the md5sum of the key and a suffix.
        )r     F)usedforsecurity)	make_and_validate_keyr   r   joinr   r   encode	hexdigestcache_suffixrM   s      r   r$   zFileBasedCache._key_to_file}   sy    
 ((g(>>w||IGG

e<<<FFHH% 
 
 	
r   c                 ^    |                                  D ]}|                     |           dS )z-
        Remove all the cache files.
        N)rU   rL   rR   s     r   rY   zFileBasedCache.clear   s>     ++-- 	  	 ELL	  	 r   c                     	 t          j        |          }n# t          $ r d}Y nw xY w|G|t          j                    k     r0|                                 |                     |j                   dS dS )zL
        Take an open cache file `f` and delete it if it's expired.
        r   NTF)r'   loadEOFErrortimecloserL   name)r   r/   exps      r   r&   zFileBasedCache._is_expired   sz    	+a..CC 	 	 	CCC	?sTY[[00GGIIILL   4us    &&c                 `      fdt          j         j        d j        z            D             S )z
        Get a list of paths to all the cache files. These are all the files
        in the root cache dir that end on the cache_suffix.
        c                 Z    g | ]'}t           j                            j        |          (S  )r   r   ri   r   ).0r.   r   s     r   
<listcomp>z4FileBasedCache._list_cache_files.<locals>.<listcomp>   s;     
 
 
 GLLE**
 
 
r   z*%s)globglob1r   rl   )r   s   `r   rU   z FileBasedCache._list_cache_files   sD    

 
 
 
DIut7H/HII
 
 
 	
r   )NNr   )__name__
__module____qualname__rl   r'   HIGHEST_PROTOCOLr5   r   r   r!   r0   r9   r   rJ   rN   rL   r   r=   r   r$   rY   r&   rU   __classcell__)r   s   @r   r	   r	      sR       L-O    
 '6t       M M M
 '6t $ $ $ $ "1$    "= = = =          "     
 
 
 
        
 
 
 
 
 
 
r   r	   )__doc__rz   r   r'   rZ   r>   rq   r)   hashlibr   django.core.cache.backends.baser   r   django.core.filesr   django.core.files.mover   r	   rw   r   r   <module>r      s       				            F F F F F F F F # # # # # # 1 1 1 1 1 1Z
 Z
 Z
 Z
 Z
Y Z
 Z
 Z
 Z
 Z
r   