Package gluon :: Module cache
[hide private]
[frames] | no frames]

Source Code for Module gluon.cache

 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   
11 -class CacheInRam(object):
12 locker=thread.allocate_lock() 13 storage={}
14 - def __init__(self,request):
15 self.request=request
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
35 -class CacheOnDisk(object):
36 - def __init__(self,request):
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
61 -class Cache(object):
62 - def __init__(self,request):
63 self.ram=CacheInRam(request) 64 self.disk=CacheOnDisk(request)
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