web/lib/django/core/cache/backends/filebased.py
changeset 29 cc9b7e14412b
parent 0 0d40e90630ef
equal deleted inserted replaced
28:b758351d191f 29:cc9b7e14412b
     1 "File-based cache backend"
     1 "File-based cache backend"
     2 
     2 
     3 import os
     3 import os
     4 import time
     4 import time
       
     5 import shutil
     5 try:
     6 try:
     6     import cPickle as pickle
     7     import cPickle as pickle
     7 except ImportError:
     8 except ImportError:
     8     import pickle
     9     import pickle
     9 
    10 
    39 
    40 
    40     def get(self, key, default=None):
    41     def get(self, key, default=None):
    41         fname = self._key_to_file(key)
    42         fname = self._key_to_file(key)
    42         try:
    43         try:
    43             f = open(fname, 'rb')
    44             f = open(fname, 'rb')
    44             exp = pickle.load(f)
    45             try:
    45             now = time.time()
    46                 exp = pickle.load(f)
    46             if exp < now:
    47                 now = time.time()
       
    48                 if exp < now:
       
    49                     self._delete(fname)
       
    50                 else:
       
    51                     return pickle.load(f)
       
    52             finally:
    47                 f.close()
    53                 f.close()
    48                 self._delete(fname)
       
    49             else:
       
    50                 return pickle.load(f)
       
    51         except (IOError, OSError, EOFError, pickle.PickleError):
    54         except (IOError, OSError, EOFError, pickle.PickleError):
    52             pass
    55             pass
    53         return default
    56         return default
    54 
    57 
    55     def set(self, key, value, timeout=None):
    58     def set(self, key, value, timeout=None):
    64         try:
    67         try:
    65             if not os.path.exists(dirname):
    68             if not os.path.exists(dirname):
    66                 os.makedirs(dirname)
    69                 os.makedirs(dirname)
    67 
    70 
    68             f = open(fname, 'wb')
    71             f = open(fname, 'wb')
    69             now = time.time()
    72             try:
    70             pickle.dump(now + timeout, f, pickle.HIGHEST_PROTOCOL)
    73                 now = time.time()
    71             pickle.dump(value, f, pickle.HIGHEST_PROTOCOL)
    74                 pickle.dump(now + timeout, f, pickle.HIGHEST_PROTOCOL)
       
    75                 pickle.dump(value, f, pickle.HIGHEST_PROTOCOL)
       
    76             finally:
       
    77                 f.close()
    72         except (IOError, OSError):
    78         except (IOError, OSError):
    73             pass
    79             pass
    74 
    80 
    75     def delete(self, key):
    81     def delete(self, key):
    76         try:
    82         try:
    90 
    96 
    91     def has_key(self, key):
    97     def has_key(self, key):
    92         fname = self._key_to_file(key)
    98         fname = self._key_to_file(key)
    93         try:
    99         try:
    94             f = open(fname, 'rb')
   100             f = open(fname, 'rb')
    95             exp = pickle.load(f)
   101             try:
    96             now = time.time()
   102                 exp = pickle.load(f)
    97             if exp < now:
   103                 now = time.time()
       
   104                 if exp < now:
       
   105                     self._delete(fname)
       
   106                     return False
       
   107                 else:
       
   108                     return True
       
   109             finally:
    98                 f.close()
   110                 f.close()
    99                 self._delete(fname)
       
   100                 return False
       
   101             else:
       
   102                 return True
       
   103         except (IOError, OSError, EOFError, pickle.PickleError):
   111         except (IOError, OSError, EOFError, pickle.PickleError):
   104             return False
   112             return False
   105 
   113 
   106     def _cull(self):
   114     def _cull(self):
   107         if int(self._num_entries) < self._max_entries:
   115         if int(self._num_entries) < self._max_entries:
   127 
   135 
   128     def _createdir(self):
   136     def _createdir(self):
   129         try:
   137         try:
   130             os.makedirs(self._dir)
   138             os.makedirs(self._dir)
   131         except OSError:
   139         except OSError:
   132             raise EnvironmentError, "Cache directory '%s' does not exist and could not be created'" % self._dir
   140             raise EnvironmentError("Cache directory '%s' does not exist and could not be created'" % self._dir)
   133 
   141 
   134     def _key_to_file(self, key):
   142     def _key_to_file(self, key):
   135         """
   143         """
   136         Convert the filename into an md5 string. We'll turn the first couple
   144         Convert the filename into an md5 string. We'll turn the first couple
   137         bits of the path into directory prefixes to be nice to filesystems
   145         bits of the path into directory prefixes to be nice to filesystems
   148         count = 0
   156         count = 0
   149         for _,_,files in os.walk(self._dir):
   157         for _,_,files in os.walk(self._dir):
   150             count += len(files)
   158             count += len(files)
   151         return count
   159         return count
   152     _num_entries = property(_get_num_entries)
   160     _num_entries = property(_get_num_entries)
       
   161 
       
   162     def clear(self):
       
   163         try:
       
   164             shutil.rmtree(self._dir)
       
   165         except (IOError, OSError):
       
   166             pass