memcache_object_store.py revision b2df76ea8fec9e32f6f3718986dba0d95315b29c
1# Copyright (c) 2012 The Chromium Authors. All rights reserved.
2# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4
5import logging
6
7from appengine_wrappers import memcache
8from object_store import ObjectStore
9
10class _AsyncMemcacheGetFuture(object):
11  def __init__(self, rpc):
12    self._rpc = rpc
13
14  def Get(self):
15    return self._rpc.get_result()
16
17class MemcacheObjectStore(ObjectStore):
18  def __init__(self, namespace):
19    self._namespace = namespace
20
21  def SetMulti(self, mapping):
22    # talking_alarm_clock always fails because the zip is too big.
23    # TODO(kalman): store example zips in blobstore.
24    if any(key.find('talking_alarm_clock') != -1 for key in mapping.iterkeys()):
25      return
26    try:
27      memcache.Client().set_multi_async(mapping, namespace=self._namespace)
28    except ValueError as e:
29      logging.error('Caught "ValueError: %s" when mapping keys %s' % (
30          e, mapping.keys()))
31
32  def GetMulti(self, keys):
33    rpc = memcache.Client().get_multi_async(keys, namespace=self._namespace)
34    return _AsyncMemcacheGetFuture(rpc)
35
36  def DelMulti(self, keys):
37    memcache.delete_multi(keys, namespace=self._namespace)
38