summaryrefslogtreecommitdiff
path: root/mako/cache.py
blob: 43f7317861e449461dd33cadd5e49b8dd4c4719b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
from mako import exceptions

try:
    from beaker import cache
    cache = cache.CacheManager()
except ImportError:
    cache = None

class Cache(object):
    def __init__(self, id, starttime):
        self.id = id
        self.starttime = starttime
        self.def_regions = {}
        
    def put(self, key, value, **kwargs):
        defname = kwargs.pop('defname', None)
        expiretime = kwargs.pop('expiretime', None)
        createfunc = kwargs.pop('createfunc', None)
        
        self._get_cache(defname, **kwargs).put_value(key, starttime=self.starttime, expiretime=expiretime)
        
    def get(self, key, **kwargs):
        defname = kwargs.pop('defname', None)
        expiretime = kwargs.pop('expiretime', None)
        createfunc = kwargs.pop('createfunc', None)
        
        return self._get_cache(defname, **kwargs).get_value(key, starttime=self.starttime, expiretime=expiretime, createfunc=createfunc)
        
    def invalidate(self, key, **kwargs):
        defname = kwargs.pop('defname', None)
        expiretime = kwargs.pop('expiretime', None)
        createfunc = kwargs.pop('createfunc', None)
        
        self._get_cache(defname, **kwargs).remove_value(key, starttime=self.starttime, expiretime=expiretime)
    
    def invalidate_body(self):
        self.invalidate('render_body', defname='render_body')
    
    def invalidate_def(self, name):
        self.invalidate('render_%s' % name, defname='render_%s' % name)
        
    def invalidate_closure(self, name):
        self.invalidate(name, defname=name)
    
    def _get_cache(self, defname, type=None, **kw):
        if not cache:
            raise exceptions.RuntimeException("the Beaker package is required to use cache functionality.")
        if type == 'memcached':
            type = 'ext:memcached'
        if not type:
            (type, kw) = self.def_regions.get(defname, ('memory', {}))
        else:
            self.def_regions[defname] = (type, kw)
        return cache.get_cache(self.id, type=type, **kw)