21 '"Sverre Rabbelier" <sverre@rabbelier.nl>', |
21 '"Sverre Rabbelier" <sverre@rabbelier.nl>', |
22 ] |
22 ] |
23 |
23 |
24 |
24 |
25 from google.appengine.api import memcache |
25 from google.appengine.api import memcache |
|
26 from google.appengine.ext import db |
26 |
27 |
27 import soc.cache.base |
28 import soc.cache.base |
28 |
29 |
29 |
30 |
30 def key(model, filter): |
31 def key(model, filter, order): |
31 """Returns the memcache key for this query. |
32 """Returns the memcache key for this query. |
32 """ |
33 """ |
33 |
34 |
34 return 'query_for_%s_%s' % (repr(model.kind()), repr(filter)) |
35 new_filter = {} |
|
36 |
|
37 for key, value in filter.iteritems(): |
|
38 new_value = value.key().name() if isinstance(value, db.Model) else value |
|
39 new_filter[key] = new_value |
|
40 |
|
41 return 'query_for_%(kind)s_%(filter)s_%(order)s' % { |
|
42 'kind': repr(model.kind()), |
|
43 'filter': repr(new_filter), |
|
44 'order': repr(order), |
|
45 } |
35 |
46 |
36 |
47 |
37 def get(model, filter, *args, **kwargs): |
48 def get(model, filter, order, *args, **kwargs): |
38 """Retrieves the data for the specified query from the memcache. |
49 """Retrieves the data for the specified query from the memcache. |
39 """ |
50 """ |
40 |
51 |
41 memcache_key = key(model, filter) |
52 memcache_key = key(model, filter, order) |
42 import logging; logging.info(memcache_key) |
|
43 return memcache.get(memcache_key), memcache_key |
53 return memcache.get(memcache_key), memcache_key |
44 |
54 |
45 |
55 |
46 def put(data, memcache_key, *args, **kwargs): |
56 def put(data, memcache_key, *args, **kwargs): |
47 """Sets the data for the specified query in the memcache. |
57 """Sets the data for the specified query in the memcache. |
50 data: the data to be cached |
60 data: the data to be cached |
51 """ |
61 """ |
52 |
62 |
53 # Store data for fifteen minutes to force a refresh every so often |
63 # Store data for fifteen minutes to force a refresh every so often |
54 retention = 15*60 |
64 retention = 15*60 |
55 |
|
56 memcache.add(memcache_key, data, retention) |
65 memcache.add(memcache_key, data, retention) |
57 |
66 |
58 |
67 |
59 def flush(model, filter): |
68 def flush(model, filter): |
60 """Removes the data for the current user from the memcache. |
69 """Removes the data for the current user from the memcache. |