summaryrefslogtreecommitdiff
path: root/redis/client.py
diff options
context:
space:
mode:
Diffstat (limited to 'redis/client.py')
-rwxr-xr-xredis/client.py21
1 files changed, 17 insertions, 4 deletions
diff --git a/redis/client.py b/redis/client.py
index 2645e83..24120d2 100755
--- a/redis/client.py
+++ b/redis/client.py
@@ -191,6 +191,8 @@ def parse_sentinel_get_master(response):
def pairs_to_dict(response, decode_keys=False):
"Create a dict given a list of key/value pairs"
+ if response is None:
+ return {}
if decode_keys:
# the iter form is faster, but I don't know how to make that work
# with a nativestr() map
@@ -244,6 +246,12 @@ def int_or_none(response):
return int(response)
+def nativestr_or_none(response):
+ if response is None:
+ return None
+ return nativestr(response)
+
+
def parse_stream_list(response):
if response is None:
return None
@@ -508,7 +516,7 @@ class Redis(object):
'CONFIG RESETSTAT': bool_ok,
'CONFIG SET': bool_ok,
'DEBUG OBJECT': parse_debug_object,
- 'GEOHASH': lambda r: list(map(nativestr, r)),
+ 'GEOHASH': lambda r: list(map(nativestr_or_none, r)),
'GEOPOS': lambda r: list(map(lambda ll: (float(ll[0]),
float(ll[1]))
if ll is not None else None, r)),
@@ -767,7 +775,8 @@ class Redis(object):
return self.parse_response(connection, command_name, **options)
except (ConnectionError, TimeoutError) as e:
connection.disconnect()
- if not connection.retry_on_timeout and isinstance(e, TimeoutError):
+ if not (connection.retry_on_timeout and
+ isinstance(e, TimeoutError)):
raise
connection.send_command(*args)
return self.parse_response(connection, command_name, **options)
@@ -2199,7 +2208,7 @@ class Redis(object):
return self.execute_command('XREAD', *pieces)
def xreadgroup(self, groupname, consumername, streams, count=None,
- block=None):
+ block=None, noack=False):
"""
Read from a stream via a consumer group.
groupname: name of the consumer group.
@@ -2209,6 +2218,7 @@ class Redis(object):
count: if set, only return this many items, beginning with the
earliest available.
block: number of milliseconds to wait, if nothing already present.
+ noack: do not add messages to the PEL
"""
pieces = [Token.get_token('GROUP'), groupname, consumername]
if count is not None:
@@ -2222,6 +2232,8 @@ class Redis(object):
"integer")
pieces.append(Token.get_token("BLOCK"))
pieces.append(str(block))
+ if noack:
+ pieces.append(Token.get_token("NOACK"))
if not isinstance(streams, dict) or len(streams) == 0:
raise DataError('XREADGROUP streams must be a non empty dict')
pieces.append(Token.get_token('STREAMS'))
@@ -3001,7 +3013,8 @@ class PubSub(object):
return command(*args)
except (ConnectionError, TimeoutError) as e:
connection.disconnect()
- if not connection.retry_on_timeout and isinstance(e, TimeoutError):
+ if not (connection.retry_on_timeout and
+ isinstance(e, TimeoutError)):
raise
# Connect manually here. If the Redis server is down, this will
# fail and raise a ConnectionError as desired.