From 470b5dabf507e6c7a9d5485e46648840c303cd97 Mon Sep 17 00:00:00 2001 From: Jayson Reis Date: Wed, 10 Jun 2020 13:44:09 +0200 Subject: [PATCH] Add ability to return default value on get but breaking get's API --- bmemcached/client/distributed.py | 8 +++++++- bmemcached/client/mixin.py | 2 +- bmemcached/client/replicating.py | 7 ++++++- test/test_simple_functions.py | 4 ++++ 4 files changed, 18 insertions(+), 3 deletions(-) diff --git a/bmemcached/client/distributed.py b/bmemcached/client/distributed.py index f810015..66000e1 100644 --- a/bmemcached/client/distributed.py +++ b/bmemcached/client/distributed.py @@ -126,12 +126,13 @@ def replace(self, key, value, time=0, compress_level=-1): server = self._get_server(key) return server.replace(key, value, time, compress_level) - def get(self, key, get_cas=False): + def get(self, key, default=None, get_cas=False): """ Get a key from server. :param key: Key's name :type key: six.string_types + :param default: In case memcached does not find a key, return a default value :param get_cas: If true, return (value, cas), where cas is the new CAS value. :type get_cas: boolean :return: Returns a key data from server. @@ -144,6 +145,11 @@ def get(self, key, get_cas=False): return value, cas return value + if default is not None: + if get_cas: + return default, None + return default + if get_cas: return None, None diff --git a/bmemcached/client/mixin.py b/bmemcached/client/mixin.py index 990f6a8..2d9ba26 100644 --- a/bmemcached/client/mixin.py +++ b/bmemcached/client/mixin.py @@ -123,7 +123,7 @@ def disconnect_all(self): for server in self.servers: server.disconnect() - def get(self, key, get_cas=False): + def get(self, key, default=None, get_cas=False): raise NotImplementedError() def gets(self, key): diff --git a/bmemcached/client/replicating.py b/bmemcached/client/replicating.py index b09df99..5bd9e5c 100644 --- a/bmemcached/client/replicating.py +++ b/bmemcached/client/replicating.py @@ -27,12 +27,13 @@ def enable_retry_delay(self, enable): # add exponential falloff in the future. _set_retry_delay is exposed for tests. self._set_retry_delay(5 if enable else 0) - def get(self, key, get_cas=False): + def get(self, key, default=None, get_cas=False): """ Get a key from server. :param key: Key's name :type key: six.string_types + :param default: In case memcached does not find a key, return a default value :param get_cas: If true, return (value, cas), where cas is the new CAS value. :type get_cas: boolean :return: Returns a key data from server. @@ -45,6 +46,10 @@ def get(self, key, get_cas=False): return value, cas else: return value + if default is not None: + if get_cas: + return default, None + return default if get_cas: return None, None diff --git a/test/test_simple_functions.py b/test/test_simple_functions.py index 7ffb0b9..c04c7e5 100644 --- a/test/test_simple_functions.py +++ b/test/test_simple_functions.py @@ -44,6 +44,10 @@ def testGetSimple(self): self.client.set('test_key', 'test') self.assertEqual('test', self.client.get('test_key')) + def testGetDefault(self): + self.assertEqual(None, self.client.get('test_key')) + self.assertEqual('default_value', self.client.get('test_key', 'default_value')) + def testGetBytes(self): # Ensure the code is 8-bit clean. value = b'\x01z\x7f\x00\x80\xfe\xff\x00'