summaryrefslogtreecommitdiff
path: root/pymemcache/client
diff options
context:
space:
mode:
authoropapy <opapy.worker@gmail.com>2018-07-26 17:00:39 +0900
committeropapy <opapy.worker@gmail.com>2018-07-26 17:00:39 +0900
commit8d1bc90bd688cf311aeebd2d709b90dbe09b7f9a (patch)
tree52c2552f20dde575b24db377badf73aeb6883024 /pymemcache/client
parent1d99958432ceee039d026abed87bd5f88255ad77 (diff)
downloadpymemcache-8d1bc90bd688cf311aeebd2d709b90dbe09b7f9a.tar.gz
add validation code with NOT_STORED
Diffstat (limited to 'pymemcache/client')
-rw-r--r--pymemcache/client/base.py30
-rw-r--r--pymemcache/client/hash.py17
2 files changed, 33 insertions, 14 deletions
diff --git a/pymemcache/client/base.py b/pymemcache/client/base.py
index 5694c6b..bc9be55 100644
--- a/pymemcache/client/base.py
+++ b/pymemcache/client/base.py
@@ -311,12 +311,17 @@ class Client(object):
Returns:
Empty list
"""
-
# TODO: make this more performant by sending all the values first, then
# waiting for all the responses.
+ if noreply is None:
+ noreply = self.default_noreply
+
+ failed = []
for key, value in six.iteritems(values):
- self.set(key, value, expire, noreply)
- return []
+ result = self._store_cmd(b'set', key, expire, noreply, value, None, (b'STORED', b'NOT_STORED'))
+ if not result:
+ failed.append(key)
+ return failed
set_multi = set_many
@@ -763,7 +768,15 @@ class Client(object):
return {}
raise
- def _store_cmd(self, name, key, expire, noreply, data, cas=None):
+ def _store_cmd(
+ self,
+ name,
+ key,
+ expire,
+ noreply,
+ data,
+ cas=None,
+ validate_store_results=None):
key = self.check_key(key)
if not self.sock:
self._connect()
@@ -801,7 +814,10 @@ class Client(object):
buf, line = _readline(self.sock, buf)
self._raise_errors(line, name)
- if line in VALID_STORE_RESULTS[name]:
+ if validate_store_results is None:
+ validate_store_results = VALID_STORE_RESULTS[name]
+
+ if line in validate_store_results:
if line == b'STORED':
return True
if line == b'NOT_STORED':
@@ -927,8 +943,8 @@ class PooledClient(object):
def set_many(self, values, expire=0, noreply=None):
with self.client_pool.get_and_release(destroy_on_fail=True) as client:
- client.set_many(values, expire=expire, noreply=noreply)
- return []
+ failed = client.set_many(values, expire=expire, noreply=noreply)
+ return failed
set_multi = set_many
diff --git a/pymemcache/client/hash.py b/pymemcache/client/hash.py
index d78dfc1..d3778e0 100644
--- a/pymemcache/client/hash.py
+++ b/pymemcache/client/hash.py
@@ -257,13 +257,16 @@ class HashClient(object):
for server, values in client_batches.items():
client = self.clients['%s:%s' % server]
- new_args = list(args)
- new_args.insert(0, values)
- result = self._safely_run_func(
- client,
- client.set_many, values.keys(), *new_args, **kwargs
- )
- failed.extend(result)
+
+ for value in values:
+ new_args = list(args)
+ new_args.insert(0, value)
+ result = self._safely_run_func(
+ client,
+ client.set, False, *new_args, **kwargs
+ )
+ if not result:
+ failed.extend(result)
return failed