1 """
2 This file is part of web2py Web Framework (Copyrighted, 2007)
3 Developed by Massimo Di Pierro <mdipierro@cs.depaul.edu>
4 License: GPL v2
5 """
6
7 import time, portalocker, shelve, thread, cPickle, dbhash, os
8
9 __all__=['Cache']
10
12 locker=thread.allocate_lock()
13 storage={}
16 - def __call__(self,key,f,time_expire=300):
17 key='%s/%s' % (self.request.application,key)
18 dt=time_expire
19 self.locker.acquire()
20 value=None
21 if self.storage.has_key(key) and self.storage[key][0]>time.time()-dt:
22 value=self.storage[key][1]
23 elif f is None:
24 if self.storage.has_key(key): del self.storage[key]
25 else:
26 try:
27 value=f()
28 self.storage[key]=(time.time(),value)
29 except BaseException, e:
30 self.locker.release()
31 raise e
32 self.locker.release()
33 return value
34
37 self.request=request
38 self.locker=open(os.path.join(request.folder,'cache/cache.lock'),'a')
39 self.shelve_name=os.path.join(request.folder,'cache/cache.shelve')
40 - def __call__(self,key,f,time_expire=300):
41 key='%s/%s' % (self.request.application,key)
42 dt=time_expire
43 portalocker.lock(self.locker, portalocker.LOCK_EX)
44 storage=shelve.open(self.shelve_name)
45 value=None
46 if storage.has_key(key) and storage[key][0]>time.time()-dt:
47 value=storage[key][1]
48 elif f is None:
49 if storage.has_key(key): del storage[key]
50 else:
51 try:
52 value=f()
53 storage[key]=(time.time(),value)
54 storage.sync()
55 except BaseException, e:
56 portalocker.unlock(self.locker)
57 raise e
58 portalocker.unlock(self.locker)
59 return value
60
65 - def __call__(self,key=None,time_expire=300,cache_model=None):
66 if not cache_model: cache_model=self.ram
67 def tmp(func):
68 return lambda: cache_model(key,func,time_expire)
69 return tmp
70