Changeset 6955 for django/branches/newforms-admin/django/core/cache
- Timestamp:
- 12/18/07 23:20:55 (1 year ago)
- Files:
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
django/branches/newforms-admin
- Property svnmerge-integrated changed from /django/trunk:1-4345,4350-4357,4359-4365,4371-4372,4374-4377,4380-4386,4388,4390-4391,4400-4402,4404-4408,4410,4412-4419,4426-4427,4430-4432,4434,4441,4443-4444,4446-4447,4450,4452-4453,4455-4458,4476,4503,4546,4564-4569,4580-4586,4617,4630,4641-6390,6392-6863 to /django/trunk:1-4345,4350-4357,4359-4365,4371-4372,4374-4377,4380-4386,4388,4390-4391,4400-4402,4404-4408,4410,4412-4419,4426-4427,4430-4432,4434,4441,4443-4444,4446-4447,4450,4452-4453,4455-4458,4476,4503,4546,4564-4569,4580-4586,4617,4630,4641-6390,6392-6952
django/branches/newforms-admin/django/core/cache/backends/filebased.py
r6864 r6955 1 1 "File-based cache backend" 2 2 3 import md5 3 4 import os, time 4 5 try: … … 7 8 import pickle 8 9 from django.core.cache.backends.base import BaseCache 9 from django.utils.http import urlquote_plus10 10 11 11 class CacheClass(BaseCache): … … 30 30 31 31 def add(self, key, value, timeout=None): 32 fname = self._key_to_file(key) 33 if timeout is None: 34 timeout = self.default_timeout 35 try: 36 filelist = os.listdir(self._dir) 37 except (IOError, OSError): 38 self._createdir() 39 filelist = [] 40 if len(filelist) > self._max_entries: 41 self._cull(filelist) 42 if os.path.basename(fname) not in filelist: 43 try: 44 f = open(fname, 'wb') 45 now = time.time() 46 pickle.dump(now + timeout, f, 2) 47 pickle.dump(value, f, 2) 48 except (IOError, OSError): 49 pass 32 if self.has_key(key): 33 return None 34 35 self.set(key, value, timeout) 50 36 51 37 def get(self, key, default=None): … … 57 43 if exp < now: 58 44 f.close() 59 os.remove(fname)45 self._delete(fname) 60 46 else: 61 47 return pickle.load(f) … … 66 52 def set(self, key, value, timeout=None): 67 53 fname = self._key_to_file(key) 54 dirname = os.path.dirname(fname) 55 68 56 if timeout is None: 69 57 timeout = self.default_timeout 58 59 self._cull() 60 70 61 try: 71 filelist = os.listdir(self._dir) 72 except (IOError, OSError): 73 self._createdir() 74 filelist = [] 75 if len(filelist) > self._max_entries: 76 self._cull(filelist) 77 try: 62 if not os.path.exists(dirname): 63 os.makedirs(dirname) 64 78 65 f = open(fname, 'wb') 79 66 now = time.time() 80 pickle.dump(now + timeout, f, 2)81 pickle.dump(value, f, 2)67 pickle.dump(now + timeout, f, pickle.HIGHEST_PROTOCOL) 68 pickle.dump(value, f, pickle.HIGHEST_PROTOCOL) 82 69 except (IOError, OSError): 83 70 pass … … 85 72 def delete(self, key): 86 73 try: 87 os.remove(self._key_to_file(key)) 74 self._delete(self._key_to_file(key)) 75 except (IOError, OSError): 76 pass 77 78 def _delete(self, fname): 79 os.remove(fname) 80 try: 81 # Remove the 2 subdirs if they're empty 82 dirname = os.path.dirname(fname) 83 os.rmdir(dirname) 84 os.rmdir(os.path.dirname(dirname)) 88 85 except (IOError, OSError): 89 86 pass 90 87 91 88 def has_key(self, key): 92 return os.path.exists(self._key_to_file(key)) 89 fname = self._key_to_file(key) 90 try: 91 f = open(fname, 'rb') 92 exp = pickle.load(f) 93 now = time.time() 94 if exp < now: 95 f.close() 96 self._delete(fname) 97 return False 98 else: 99 return True 100 except (IOError, OSError, EOFError, pickle.PickleError): 101 return False 93 102 94 def _cull(self, filelist): 103 def _cull(self): 104 if int(self._num_entries) < self._max_entries: 105 return 106 107 try: 108 filelist = os.listdir(self._dir) 109 except (IOError, OSError): 110 return 111 95 112 if self._cull_frequency == 0: 96 113 doomed = filelist 97 114 else: 98 doomed = [k for (i, k) in enumerate(filelist) if i % self._cull_frequency == 0] 99 for fname in doomed: 115 doomed = [os.path.join(self._dir, k) for (i, k) in enumerate(filelist) if i % self._cull_frequency == 0] 116 117 for topdir in doomed: 100 118 try: 101 os.remove(os.path.join(self._dir, fname)) 119 for root, _, files in os.walk(topdir): 120 for f in files: 121 self._delete(os.path.join(root, f)) 102 122 except (IOError, OSError): 103 123 pass … … 110 130 111 131 def _key_to_file(self, key): 112 return os.path.join(self._dir, urlquote_plus(key)) 132 """ 133 Convert the filename into an md5 string. We'll turn the first couple 134 bits of the path into directory prefixes to be nice to filesystems 135 that have problems with large numbers of files in a directory. 136 137 Thus, a cache key of "foo" gets turnned into a file named 138 ``{cache-dir}ac/bd/18db4cc2f85cedef654fccc4a4d8``. 139 """ 140 path = md5.new(key.encode('utf-8')).hexdigest() 141 path = os.path.join(path[:2], path[2:4], path[4:]) 142 return os.path.join(self._dir, path) 143 144 def _get_num_entries(self): 145 count = 0 146 for _,_,files in os.walk(self._dir): 147 count += len(files) 148 return count 149 _num_entries = property(_get_num_entries) 150 django/branches/newforms-admin/django/core/cache/backends/locmem.py
r6864 r6955 30 30 self._lock = RWLock() 31 31 32 def _add(self, key, value, timeout=None):33 if len(self._cache) >= self._max_entries:34 self._cull()35 if timeout is None:36 timeout = self.default_timeout37 if key not in self._cache.keys():38 self._cache[key] = value39 self._expire_info[key] = time.time() + timeout40 41 32 def add(self, key, value, timeout=None): 42 33 self._lock.writer_enters() 43 # Python 2.3 and 2.4 don't allow combined try-except-finally blocks.44 34 try: 45 try: 46 self._add(key, pickle.dumps(value), timeout) 47 except pickle.PickleError: 48 pass 35 exp = self._expire_info.get(key) 36 if exp is None or exp <= time.time(): 37 try: 38 self._set(key, pickle.dumps(value), timeout) 39 except pickle.PickleError: 40 pass 49 41 finally: 50 42 self._lock.writer_leaves() 51 43 52 44 def get(self, key, default=None): 53 should_delete = False54 45 self._lock.reader_enters() 55 46 try: 56 now = time.time()57 47 exp = self._expire_info.get(key) 58 48 if exp is None: 59 49 return default 60 elif exp < now: 61 should_delete = True 62 else: 50 elif exp > time.time(): 63 51 try: 64 52 return pickle.loads(self._cache[key]) … … 67 55 finally: 68 56 self._lock.reader_leaves() 69 if should_delete: 70 self._lock.writer_enters() 71 try: 72 del self._cache[key] 73 del self._expire_info[key] 74 return default 75 finally: 76 self._lock.writer_leaves() 57 self._lock.writer_enters() 58 try: 59 del self._cache[key] 60 del self._expire_info[key] 61 return default 62 finally: 63 self._lock.writer_leaves() 77 64 78 65 def _set(self, key, value, timeout=None): … … 96 83 97 84 def has_key(self, key): 98 return key in self._cache 85 self._lock.reader_enters() 86 try: 87 exp = self._expire_info.get(key) 88 if exp is None: 89 return False 90 elif exp > time.time(): 91 return True 92 finally: 93 self._lock.reader_leaves() 94 95 self._lock.writer_enters() 96 try: 97 del self._cache[key] 98 del self._expire_info[key] 99 return False 100 finally: 101 self._lock.writer_leaves() 99 102 100 103 def _cull(self):
