Index: third_party/google-endpoints/dogpile/cache/backends/memory.py |
diff --git a/third_party/google-endpoints/dogpile/cache/backends/memory.py b/third_party/google-endpoints/dogpile/cache/backends/memory.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..e2083f7f052c7ada123edec8d90a98b98f283487 |
--- /dev/null |
+++ b/third_party/google-endpoints/dogpile/cache/backends/memory.py |
@@ -0,0 +1,124 @@ |
+""" |
+Memory Backends |
+--------------- |
+ |
+Provides simple dictionary-based backends. |
+ |
+The two backends are :class:`.MemoryBackend` and :class:`.MemoryPickleBackend`; |
+the latter applies a serialization step to cached values while the former |
+places the value as given into the dictionary. |
+ |
+""" |
+ |
+from ..api import CacheBackend, NO_VALUE |
+from ...util.compat import pickle |
+ |
+ |
+class MemoryBackend(CacheBackend): |
+ """A backend that uses a plain dictionary. |
+ |
+ There is no size management, and values which |
+ are placed into the dictionary will remain |
+ until explicitly removed. Note that |
+ Dogpile's expiration of items is based on |
+ timestamps and does not remove them from |
+ the cache. |
+ |
+ E.g.:: |
+ |
+ from dogpile.cache import make_region |
+ |
+ region = make_region().configure( |
+ 'dogpile.cache.memory' |
+ ) |
+ |
+ |
+ To use a Python dictionary of your choosing, |
+ it can be passed in with the ``cache_dict`` |
+ argument:: |
+ |
+ my_dictionary = {} |
+ region = make_region().configure( |
+ 'dogpile.cache.memory', |
+ arguments={ |
+ "cache_dict":my_dictionary |
+ } |
+ ) |
+ |
+ |
+ """ |
+ pickle_values = False |
+ |
+ def __init__(self, arguments): |
+ self._cache = arguments.pop("cache_dict", {}) |
+ |
+ def get(self, key): |
+ value = self._cache.get(key, NO_VALUE) |
+ if value is not NO_VALUE and self.pickle_values: |
+ value = pickle.loads(value) |
+ return value |
+ |
+ def get_multi(self, keys): |
+ ret = [ |
+ self._cache.get(key, NO_VALUE) |
+ for key in keys] |
+ if self.pickle_values: |
+ ret = [ |
+ pickle.loads(value) |
+ if value is not NO_VALUE else value |
+ for value in ret |
+ ] |
+ return ret |
+ |
+ def set(self, key, value): |
+ if self.pickle_values: |
+ value = pickle.dumps(value, pickle.HIGHEST_PROTOCOL) |
+ self._cache[key] = value |
+ |
+ def set_multi(self, mapping): |
+ pickle_values = self.pickle_values |
+ for key, value in mapping.items(): |
+ if pickle_values: |
+ value = pickle.dumps(value, pickle.HIGHEST_PROTOCOL) |
+ self._cache[key] = value |
+ |
+ def delete(self, key): |
+ self._cache.pop(key, None) |
+ |
+ def delete_multi(self, keys): |
+ for key in keys: |
+ self._cache.pop(key, None) |
+ |
+ |
+class MemoryPickleBackend(MemoryBackend): |
+ """A backend that uses a plain dictionary, but serializes objects on |
+ :meth:`.MemoryBackend.set` and deserializes :meth:`.MemoryBackend.get`. |
+ |
+ E.g.:: |
+ |
+ from dogpile.cache import make_region |
+ |
+ region = make_region().configure( |
+ 'dogpile.cache.memory_pickle' |
+ ) |
+ |
+ The usage of pickle to serialize cached values allows an object |
+ as placed in the cache to be a copy of the original given object, so |
+ that any subsequent changes to the given object aren't reflected |
+ in the cached value, thus making the backend behave the same way |
+ as other backends which make use of serialization. |
+ |
+ The serialization is performed via pickle, and incurs the same |
+ performance hit in doing so as that of other backends; in this way |
+ the :class:`.MemoryPickleBackend` performance is somewhere in between |
+ that of the pure :class:`.MemoryBackend` and the remote server oriented |
+ backends such as that of Memcached or Redis. |
+ |
+ Pickle behavior here is the same as that of the Redis backend, using |
+ either ``cPickle`` or ``pickle`` and specifying ``HIGHEST_PROTOCOL`` |
+ upon serialize. |
+ |
+ .. versionadded:: 0.5.3 |
+ |
+ """ |
+ pickle_values = True |