3 class ormcache(object):
4 """ LRU cache decorator for orm methods
7 def __init__(self, skiparg=2, size=8192, multi=None, timeout=None):
17 def lookup(self2, cr, *args):
18 r = self.lookup(self2, cr, *args)
21 lookup.clear_cache = self.clear
22 #print "lookup-func",lookup
26 print "lookup-stats hit=%s miss=%s err=%s ratio=%.1f" % (self.stat_hit,self.stat_miss,self.stat_err, (100*float(self.stat_hit))/(self.stat_miss+self.stat_hit) )
30 ormcache = getattr(self2, '_ormcache')
31 except AttributeError:
32 ormcache = self2._ormcache = {}
34 d = ormcache[self.method]
36 d = ormcache[self.method] = lru.LRU(self.size)
39 def lookup(self, self2, cr, *args):
41 key = args[self.skiparg-2:]
44 #print "lookup-hit",self2,cr,key,r
49 #print "lookup-miss",self2,cr,key
50 value = d[args] = self.method(self2, cr, *args)
51 #print "lookup-miss-value",value
55 #print "lookup-error",self2,cr,key
56 return self.method(self2, cr, *args)
58 def clear(self, self2, *args):
59 """ Remove *args entry from the cache or all keys if *args is undefined
64 key = args[self.skiparg-2:]
72 class ormcache_multi(ormcache):
73 def __init__(self, skiparg=2, size=8192, multi=3):
74 super(ormcache_multi,self).__init__(skiparg,size)
75 self.multi = multi - 2
77 def lookup(self, self2, cr, *args):
88 key = tuple(args[self.skiparg-2:])
91 #print "lookup-hit",self2,cr,key,r[i]
96 #print "lookup-miss",self2,cr,key
100 r.update(self.method(self2, cr, *args))
104 key = tuple(args[self.skiparg-2:])
109 class dummy_cache(object):
110 """ Cache decorator replacement to actually do no caching.
112 def __init__(self, *l, **kw):
114 def __call__(self, fn):
115 fn.clear_cache = self.clear
117 def clear(self, *l, **kw):
120 #ormcache = dummy_cache
123 if __name__ == '__main__':
128 print "A::m(", self,a,b
131 @ormcache_multi(multi=3)
132 def n(self,cr,uid,ids):
133 print "m", self,cr,uid,ids
134 return dict([(i,i) for i in ids])
139 r=a.n("cr",1,[1,2,3,4])
142 for i in a._ormcache:
143 print a._ormcache[i].d
144 a.n.clear_cache(a,1,1)