Files
web2py/gluon/contrib/gae_memcache.py
T
ortgit 222b087a8d time_expire=0 should clear memcache entry
If time_expire=0, then the cache should be cleared and reset with the
latest value to stay compatible with documented web2py functionality of
how caching works. Previous change broke this compatibility while adding
efficiency in other cases.
2014-04-14 01:32:54 -04:00

72 lines
1.8 KiB
Python

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
Developed by Robin Bhattacharyya (memecache for GAE)
Released under the web2py license (LGPL)
from gluon.contrib.gae_memcache import MemcacheClient
cache.ram=cache.disk=MemcacheClient(request)
"""
import time
from google.appengine.api.memcache import Client
class MemcacheClient(object):
client = Client()
def __init__(self, request, default_time_expire = 300):
self.request = request
self.default_time_expire = default_time_expire
def __call__(
self,
key,
f,
time_expire=None,
):
if time_expire is None:
time_expire = self.default_time_expire
key = '%s/%s' % (self.request.application, key)
value = None
obj = self.client.get(key) if time_expire != 0 else None
if obj:
value = obj[1]
elif f is not None:
value = f()
self.client.set(key, (time.time(), value), time=time_expire)
return value
def increment(self, key, value=1):
key = '%s/%s' % (self.request.application, key)
obj = self.client.get(key)
if obj:
value = obj[1] + value
self.client.set(key, (time.time(), value))
return value
def incr(self, key, value=1):
return self.increment(key, value)
def clear(self, key=None):
if key:
key = '%s/%s' % (self.request.application, key)
self.client.delete(key)
else:
self.client.flush_all()
def delete(self, *a, **b):
return self.client.delete(*a, **b)
def get(self, *a, **b):
return self.client.get(*a, **b)
def set(self, *a, **b):
return self.client.set(*a, **b)
def flush_all(self, *a, **b):
return self.client.delete(*a, **b)