diff options
author | Joe Gordon <jogo@pinterest.com> | 2017-03-24 16:39:33 -0700 |
---|---|---|
committer | Joe Gordon <jogo@pinterest.com> | 2017-03-29 11:04:31 -0700 |
commit | 7351bdb331c32e42ce817ffad216dc875b25b912 (patch) | |
tree | 5042cb96d761433b302d527417748857c3c977b0 | |
parent | 082f0745421a10bf834759e87ef46c2212698ec4 (diff) | |
download | pymemcache-7351bdb331c32e42ce817ffad216dc875b25b912.tar.gz |
Add support for stats cachedump
Stats cachedump has a different input and output format compared to
most stats commands. Previously this would fail with a cryptic error.
Fixes issue #103
-rw-r--r-- | pymemcache/client/base.py | 14 | ||||
-rw-r--r-- | pymemcache/test/test_client.py | 8 |
2 files changed, 20 insertions, 2 deletions
diff --git a/pymemcache/client/base.py b/pymemcache/client/base.py index 3578058..6c47ffd 100644 --- a/pymemcache/client/base.py +++ b/pymemcache/client/base.py @@ -705,8 +705,14 @@ class Client(object): raise MemcacheServerError(error) def _fetch_cmd(self, name, keys, expect_cas): - checked_keys = dict((self.check_key(k), k) for k in keys) - cmd = name + b' ' + b' '.join(checked_keys) + b'\r\n' + if name == b'stats': + # stats commands can have multiple arguments + # `stats cachedump 1 1` + checked_keys = [self.check_key(k) for k in keys] + cmd = name + b' ' + b' '.join(checked_keys) + b'\r\n' + else: + checked_keys = dict((self.check_key(k), k) for k in keys) + cmd = name + b' ' + b' '.join(checked_keys) + b'\r\n' try: if not self.sock: @@ -744,6 +750,10 @@ class Client(object): elif name == b'stats' and line.startswith(b'STAT'): key_value = line.split() result[key_value[1]] = key_value[2] + elif name == b'stats' and line.startswith(b'ITEM'): + # For 'stats cachedump' commands + key_value = line.split() + result[key_value[1]] = b' '.join(key_value[2:]) else: raise MemcacheUnknownError(line[:32]) except Exception: diff --git a/pymemcache/test/test_client.py b/pymemcache/test/test_client.py index 606a950..6cd683c 100644 --- a/pymemcache/test/test_client.py +++ b/pymemcache/test/test_client.py @@ -664,6 +664,14 @@ class TestClient(ClientTestMixin, unittest.TestCase): } assert result == expected + def test_stats_cachedump(self): + client = self.make_client([b'ITEM bob [7 b; 0 s]\r\n', b'END\r\n']) + result = client.stats('cachedump', '1', '1') + assert client.sock.send_bufs == [ + b'stats cachedump 1 1\r\n' + ] + assert result == {b'bob': b'[7 b; 0 s]'} + def test_python_dict_set_is_supported(self): client = self.make_client([b'STORED\r\n']) client[b'key'] = b'value' |