Index: chrome/common/extensions/docs/server2/persistent_object_store.py |
diff --git a/chrome/common/extensions/docs/server2/persistent_object_store.py b/chrome/common/extensions/docs/server2/persistent_object_store.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..853b660eaf921dab8a9c6c22ba6dfe290ae2450d |
--- /dev/null |
+++ b/chrome/common/extensions/docs/server2/persistent_object_store.py |
@@ -0,0 +1,50 @@ |
+# Copyright 2013 The Chromium Authors. All rights reserved. |
+# Use of this source code is governed by a BSD-style license that can be |
+# found in the LICENSE file. |
+ |
+from appengine_wrappers import db, IsDevServer |
+from datastore_models import PersistentObjectStoreItem |
+from future import Future |
+import logging |
+from object_store import ObjectStore |
+ |
+class _AsyncGetFuture(object): |
+ def __init__(self, object_store, keys): |
+ self._futures = dict( |
+ (k, db.get_async( |
+ PersistentObjectStoreItem.CreateKey(object_store._namespace, k))) |
+ for k in keys) |
+ |
+ def Get(self): |
+ return dict((key, future.get_result().GetValue()) |
+ for key, future in self._futures.iteritems() |
+ if future.get_result() is not None) |
+ |
+class PersistentObjectStore(ObjectStore): |
+ '''Stores data persistently using the AppEngine Datastore API. |
+ ''' |
+ def __init__(self, namespace): |
+ self._namespace = namespace |
+ |
+ def SetMulti(self, mapping): |
+ futures = [] |
+ for key, value in mapping.items(): |
+ futures.append(db.put_async( |
+ PersistentObjectStoreItem.CreateItem(self._namespace, key, value))) |
+ # If running the dev server, the futures don't complete until the server is |
+ # *quitting*. This is annoying. Flush now. |
+ if IsDevServer(): |
+ [future.wait() for future in futures] |
+ |
+ def GetMulti(self, keys): |
+ return Future(delegate=_AsyncGetFuture(self, keys)) |
+ |
+ def DelMulti(self, keys): |
+ futures = [] |
+ for key in keys: |
+ futures.append(db.delete_async( |
+ PersistentObjectStoreItem.CreateKey(self._namespace, key))) |
+ # If running the dev server, the futures don't complete until the server is |
+ # *quitting*. This is annoying. Flush now. |
+ if IsDevServer(): |
+ [future.wait() for future in futures] |