From 7351bdb331c32e42ce817ffad216dc875b25b912 Mon Sep 17 00:00:00 2001 From: Joe Gordon Date: Fri, 24 Mar 2017 16:39:33 -0700 Subject: 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 --- pymemcache/client/base.py | 14 ++++++++++++-- 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' -- cgit v1.2.1