src/cm/utils/cache.py
author Simon Descarpentries <sid@sopinspace.com>
Tue, 06 May 2014 13:52:01 +0200
changeset 651 9bbc657f6837
parent 349 8d1ce1bda109
permissions -rw-r--r--
Replace DISABLE_TRACKING and TRACKING_HTML by a TRACKING_ID variable in configuration files
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     1
from django.core.cache import cache
261
b60ab54b6782 fix usage of dj caching
raph
parents: 0
diff changeset
     2
from hashlib import sha1
349
8d1ce1bda109 workspace in parameter for memoize
Production Moz <dev@sopinspace.com>
parents: 261
diff changeset
     3
from django.conf import settings
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     4
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     5
# adapted [to django] from http://code.activestate.com/recipes/325205/
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     6
def dj_memoize(f):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     7
    def g(*args, **kwargs):
349
8d1ce1bda109 workspace in parameter for memoize
Production Moz <dev@sopinspace.com>
parents: 261
diff changeset
     8
        key = sha1( str((settings.SITE_URL, f.__name__, f, tuple(args), frozenset(kwargs.items())) )).hexdigest()
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     9
        val = cache.get(key)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    10
        if not val:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    11
            val = f(*args, **kwargs)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    12
            cache.set(key,val)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    13
        return val
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    14
    return g
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    15
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    16
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    17
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    18
# adapted from http://code.activestate.com/recipes/496879/
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    19
# decorator with LRU policy
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    20
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    21
# changed : 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    22
#  - default limit is 100
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    23
#  - store sha1 of key (shorter) 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    24
import cPickle, hashlib
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    25
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    26
def memoize(function, limit=100):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    27
    if isinstance(function, int):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    28
        def memoize_wrapper(f):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    29
            return memoize(f, function)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    30
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    31
        return memoize_wrapper
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    32
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    33
    dict = {}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    34
    list = []
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    35
    def memoize_wrapper(*args, **kwargs):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    36
        key = hashlib.sha1(cPickle.dumps((args, kwargs))).digest()
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    37
        try:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    38
            list.append(list.pop(list.index(key)))
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    39
        except ValueError:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    40
            dict[key] = function(*args, **kwargs)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    41
            list.append(key)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    42
            if limit is not None and len(list) > limit:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    43
                del dict[list.pop(0)]
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    44
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    45
        return dict[key]
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    46
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    47
    memoize_wrapper._memoize_dict = dict
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    48
    memoize_wrapper._memoize_list = list
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    49
    memoize_wrapper._memoize_limit = limit
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    50
    memoize_wrapper._memoize_origfunc = function
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    51
    memoize_wrapper.func_name = function.func_name
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    52
    return memoize_wrapper