persistent_object_store.py revision 7d4cd473f85ac64c3747c96c277f9e506a0d2246
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
5from appengine_wrappers import db, IsDevServer
6from datastore_models import PersistentObjectStoreItem
7from future import Future
8from object_store import ObjectStore
9
10class _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
22class 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