1 # Copyright 2013 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 from appengine_wrappers import db, IsDevServer 6 from datastore_models import PersistentObjectStoreItem 7 from future import Future 8 from object_store import ObjectStore 9 10 class _AsyncGetFuture(object): 11 def __init__(self, object_store, keys): 12 self._futures = dict( 13 (k, db.get_async( 14 PersistentObjectStoreItem.CreateKey(object_store._namespace, k))) 15 for k in keys) 16 17 def Get(self): 18 return dict((key, future.get_result().GetValue()) 19 for key, future in self._futures.iteritems() 20 if future.get_result() is not None) 21 22 class PersistentObjectStore(ObjectStore): 23 '''Stores data persistently using the AppEngine Datastore API. 24 ''' 25 def __init__(self, namespace): 26 self._namespace = namespace 27 28 def SetMulti(self, mapping): 29 futures = [] 30 for key, value in mapping.items(): 31 futures.append(db.put_async( 32 PersistentObjectStoreItem.CreateItem(self._namespace, key, value))) 33 # If running the dev server, the futures don't complete until the server is 34 # *quitting*. This is annoying. Flush now. 35 if IsDevServer(): 36 [future.wait() for future in futures] 37 38 def GetMulti(self, keys): 39 return Future(delegate=_AsyncGetFuture(self, keys)) 40 41 def DelMulti(self, keys): 42 futures = [] 43 for key in keys: 44 futures.append(db.delete_async( 45 PersistentObjectStoreItem.CreateKey(self._namespace, key))) 46 # If running the dev server, the futures don't complete until the server is 47 # *quitting*. This is annoying. Flush now. 48 if IsDevServer(): 49 [future.wait() for future in futures] 50