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 5 import logging 6 7 from appengine_wrappers import memcache 8 from object_store import ObjectStore 9 10 class _AsyncMemcacheGetFuture(object): 11 def __init__(self, rpc): 12 self._rpc = rpc 13 14 def Get(self): 15 return self._rpc.get_result() 16 17 class 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