OLD | NEW |
---|---|
1 # Copyright 2013 The Chromium Authors. All rights reserved. | 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 | 2 # Use of this source code is governed by a BSD-style license that can be |
3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
4 | 4 |
5 from appengine_wrappers import db | 5 from appengine_wrappers import db |
6 from datastore_models import PersistentObjectStoreItem | 6 from datastore_models import PersistentObjectStoreItem |
7 from environment import IsDevServer | 7 from environment import IsDevServer |
8 from future import Future | 8 from future import All, Future |
9 from object_store import ObjectStore | 9 from object_store import ObjectStore |
10 | 10 |
11 | 11 |
12 class PersistentObjectStore(ObjectStore): | 12 class PersistentObjectStore(ObjectStore): |
13 '''Stores data persistently using the AppEngine Datastore API. | 13 '''Stores data persistently using the AppEngine Datastore API. |
14 ''' | 14 ''' |
15 def __init__(self, namespace): | 15 def __init__(self, namespace): |
16 self._namespace = namespace | 16 self._namespace = namespace |
17 | 17 |
18 def SetMulti(self, mapping): | 18 def SetMulti(self, mapping): |
19 futures = [] | 19 rpcs = [db.put_async( |
20 for key, value in mapping.items(): | 20 PersistentObjectStoreItem.CreateItem(self._namespace, key, value)) |
21 futures.append(db.put_async( | 21 for key, value in mapping.items()] |
not at google - send to devlin
2014/10/23 20:00:19
iteritems
| |
22 PersistentObjectStoreItem.CreateItem(self._namespace, key, value))) | |
23 # If running the dev server, the futures don't complete until the server is | 22 # If running the dev server, the futures don't complete until the server is |
24 # *quitting*. This is annoying. Flush now. | 23 # *quitting*. This is annoying. Flush now. |
25 if IsDevServer(): | 24 if IsDevServer(): |
26 [future.wait() for future in futures] | 25 [rpc.wait() for rpc in rpcs] |
26 futures = [Future(callback=lambda: rpc.get_result()) for rpc in rpcs] | |
27 return All(futures) | |
not at google - send to devlin
2014/10/23 20:00:19
this is another case where you should be able to p
Ken Rockot(use gerrit already)
2014/10/23 20:16:18
Done.
Given my previous comment, note that unlike
| |
27 | 28 |
28 def GetMulti(self, keys): | 29 def GetMulti(self, keys): |
29 db_futures = dict( | 30 db_futures = dict( |
30 (k, db.get_async( | 31 (k, db.get_async( |
31 PersistentObjectStoreItem.CreateKey(self._namespace, k))) | 32 PersistentObjectStoreItem.CreateKey(self._namespace, k))) |
32 for k in keys) | 33 for k in keys) |
33 def resolve(): | 34 def resolve(): |
34 return dict((key, future.get_result().GetValue()) | 35 return dict((key, future.get_result().GetValue()) |
35 for key, future in db_futures.iteritems() | 36 for key, future in db_futures.iteritems() |
36 if future.get_result() is not None) | 37 if future.get_result() is not None) |
37 return Future(callback=resolve) | 38 return Future(callback=resolve) |
38 | 39 |
39 def DelMulti(self, keys): | 40 def DelMulti(self, keys): |
40 futures = [] | 41 futures = [] |
41 for key in keys: | 42 for key in keys: |
42 futures.append(db.delete_async( | 43 futures.append(db.delete_async( |
43 PersistentObjectStoreItem.CreateKey(self._namespace, key))) | 44 PersistentObjectStoreItem.CreateKey(self._namespace, key))) |
44 # If running the dev server, the futures don't complete until the server is | 45 # If running the dev server, the futures don't complete until the server is |
45 # *quitting*. This is annoying. Flush now. | 46 # *quitting*. This is annoying. Flush now. |
46 if IsDevServer(): | 47 if IsDevServer(): |
47 [future.wait() for future in futures] | 48 [future.wait() for future in futures] |
OLD | NEW |