summaryrefslogtreecommitdiff
path: root/addons/document_webdav/cache.py
diff options
context:
space:
mode:
authorFabien Pinckaers <fp@tinyerp.com>2009-12-01 09:26:50 +0100
committerFabien Pinckaers <fp@tinyerp.com>2009-12-01 09:26:50 +0100
commit90336e2e4e16de500c83db7aef8cd6a2a6678e00 (patch)
treebfa4f205a17ce2f2c61052cfaa8c9c683b72bddd /addons/document_webdav/cache.py
parent86794c725285c43083b1c807b92b250c34d16f24 (diff)
parent96737d284fef562e8e6b096592d284aa6db8fa4a (diff)
merge
bzr revid: fp@tinyerp.com-20091201082650-e6n201rwss3u0etn
Diffstat (limited to 'addons/document_webdav/cache.py')
-rw-r--r--addons/document_webdav/cache.py39
1 files changed, 39 insertions, 0 deletions
diff --git a/addons/document_webdav/cache.py b/addons/document_webdav/cache.py
new file mode 100644
index 00000000000..bc75114c4ae
--- /dev/null
+++ b/addons/document_webdav/cache.py
@@ -0,0 +1,39 @@
+import time
+import heapq
+
+def memoize(maxsize):
+ """decorator to 'memoize' a function - caching its results"""
+ def decorating_function(f):
+ cache = {} # map from key to value
+ heap = [] # list of keys, in LRU heap
+ cursize = 0 # because len() is slow
+ def wrapper(*args):
+ key = repr(args)
+ # performance crap
+ _cache=cache
+ _heap=heap
+ _heappop = heapq.heappop
+ _heappush = heapq.heappush
+ _time = time.time
+ _cursize = cursize
+ _maxsize = maxsize
+ if not _cache.has_key(key):
+ if _cursize == _maxsize:
+ # pop oldest element
+ (_,oldkey) = _heappop(_heap)
+ _cache.pop(oldkey)
+ else:
+ _cursize += 1
+ # insert this element
+ _cache[key] = f(*args)
+ _heappush(_heap,(_time(),key))
+ wrapper.misses += 1
+ else:
+ wrapper.hits += 1
+ return cache[key]
+ wrapper.__doc__ = f.__doc__
+ wrapper.__name__ = f.__name__
+ wrapper.hits = wrapper.misses = 0
+ return wrapper
+ return decorating_function
+