equal
deleted
inserted
replaced
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 |