def _Dynamic_Set()

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)