75 lines
1.8 KiB
Python
75 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 initialize(self):
|
||
|
pass
|
||
|
|
||
|
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)
|