in src/google/appengine/api/memcache/memcache_stub.py [0:0]
def _Dynamic_Set(self, request, response):
"""Implementation of `MemcacheService::Set()`.
Args:
request: A `MemcacheSetRequest`.
response: A `MemcacheSetResponse`.
"""
namespace = request.name_space
for item in request.item:
key = item.key
set_policy = item.set_policy
old_entry = self._GetKey(namespace, key)
set_status = MemcacheSetResponse.NOT_STORED
if ((set_policy == MemcacheSetRequest.SET) or
(set_policy == MemcacheSetRequest.ADD and old_entry is None) or
(set_policy == MemcacheSetRequest.REPLACE and old_entry is not None)):
if (old_entry is None or set_policy == MemcacheSetRequest.SET or
not old_entry.CheckLocked()):
set_status = MemcacheSetResponse.STORED
elif (set_policy == MemcacheSetRequest.CAS and item.HasField('cas_id')):
if old_entry is None or old_entry.CheckLocked():
set_status = MemcacheSetResponse.NOT_STORED
elif old_entry.cas_id != item.cas_id:
set_status = MemcacheSetResponse.EXISTS
else:
set_status = MemcacheSetResponse.STORED
if set_status == MemcacheSetResponse.STORED:
if namespace not in self._the_cache:
self._the_cache[namespace] = {}
if old_entry:
self._lru.Remove(old_entry)
self._the_cache[namespace][key] = CacheEntry(
item.value,
item.expiration_time,
item.flags,
self._next_cas_id,
gettime=self._gettime,
namespace=namespace,
key=key)
self._lru.Update(self._the_cache[namespace][key])
while self._lru.total_byte_size > self._max_size_bytes:
oldest = self._lru.oldest
self._lru.Remove(oldest)
del self._the_cache[oldest.namespace][oldest.key]
self._next_cas_id += 1
response.set_status.append(set_status)