[FIX] remove unused clear function
[odoo/odoo.git] / openerp / tools / cache.py
1 import lru
2
3 class ormcache(object):
4     """ LRU cache decorator for orm methods
5     """
6
7     def __init__(self, skiparg=2, size=8192, multi=None, timeout=None):
8         self.skiparg = skiparg
9         self.size = size
10         self.method = None
11         self.stat_miss = 0
12         self.stat_hit = 0
13         self.stat_err = 0
14
15     def __call__(self,m):
16         self.method = m
17         def lookup(self2, cr, *args):
18             r = self.lookup(self2, cr, *args)
19             #self.stat()
20             return r
21         lookup.clear_cache = self.clear
22         #print "lookup-func",lookup
23         return lookup
24
25     def stat(self):
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) )
27
28     def lru(self, self2):
29         try:
30             ormcache = getattr(self2, '_ormcache')
31         except AttributeError:
32             ormcache = self2._ormcache = {}
33         try:
34             d = ormcache[self.method]
35         except KeyError:
36             d = ormcache[self.method] = lru.LRU(self.size)
37         return d
38
39     def lookup(self, self2, cr, *args):
40         d = self.lru(self2)
41         key = args[self.skiparg-2:]
42         try:
43            r = d[key]
44            #print "lookup-hit",self2,cr,key,r
45            self.stat_hit += 1
46            return r
47         except KeyError:
48            self.stat_miss += 1
49            #print "lookup-miss",self2,cr,key
50            value = d[args] = self.method(self2, cr, *args)
51            #print "lookup-miss-value",value
52            return value
53         except TypeError:
54            self.stat_err += 1
55            #print "lookup-error",self2,cr,key
56            return self.method(self2, cr, *args)
57
58     def clear(self, self2, *args):
59         """ Remove *args entry from the cache or all keys if *args is undefined 
60         """
61         d = self.lru(self2)
62         if args:
63             try:
64                 key = args[self.skiparg-2:]
65                 #print "del",key
66                 del d[key]
67             except KeyError:
68                 pass
69         else:
70             d.clear()
71
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
76
77     def lookup(self, self2, cr, *args):
78         d = self.lru(self2)
79         args = list(args)
80         multi = self.multi
81         #print args, multi
82         ids = args[multi]
83         r = {}
84         miss = []
85
86         for i in ids:
87             args[multi] = i
88             key = tuple(args[self.skiparg-2:])
89             try:
90                r[i] = d[key]
91                #print "lookup-hit",self2,cr,key,r[i]
92                self.stat_hit += 1
93             except Exception:
94                self.stat_miss += 1
95                miss.append(i)
96                #print "lookup-miss",self2,cr,key
97
98         if miss:
99             args[multi] = miss
100             r.update(self.method(self2, cr, *args))
101
102         for i in miss:
103             args[multi] = i
104             key = tuple(args[self.skiparg-2:])
105             d[key] = r[i]
106
107         return r
108
109 class dummy_cache(object):
110     """ Cache decorator replacement to actually do no caching.
111     """
112     def __init__(self, *l, **kw):
113         pass
114     def __call__(self, fn):
115         fn.clear_cache = self.clear
116         return fn
117     def clear(self, *l, **kw):
118         pass
119
120 #ormcache = dummy_cache
121 cache = dummy_cache
122
123 if __name__ == '__main__':
124
125     class A():
126         @ormcache()
127         def m(self,a,b):
128             print  "A::m(", self,a,b
129             return 1
130
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])
135
136     a=A()
137     #r=a.m(1,2)
138     #r=a.m(1,2)
139     r=a.n("cr",1,[1,2,3,4])
140     r=a.n("cr",1,[1,2])
141     print r
142     for i in a._ormcache:
143         print a._ormcache[i].d
144     a.n.clear_cache(a,1,1)
145     r=a.n("cr",1,[1,2])
146     print r
147     #r=a.n("cr",1,[1,2])