From e69fff175217555beb0283ceac26ee4806abe027 Mon Sep 17 00:00:00 2001
From: "Christian F. Brinkmann" <christian.brinkmann09@gmail.com>
Date: Thu, 26 Jan 2023 17:49:26 +0100
Subject: [PATCH 1/2] Deal with None/null values and general errors in dataset

---
 redisdl.py | 38 +++++++++++++++++++++++---------------
 1 file changed, 23 insertions(+), 15 deletions(-)

diff --git a/redisdl.py b/redisdl.py
index ec383d8..fc8dbea 100755
--- a/redisdl.py
+++ b/redisdl.py
@@ -176,21 +176,22 @@ def dump(fp, host='localhost', port=6379, password=None, db=0, pretty=False,
     fp.write('{')
     first = True
     for key, type, ttl, value in _reader(r, pretty, encoding, keys):
-        key = encoder.encode(key)
-        type = encoder.encode(type)
-        value = encoder.encode(value)
-        if ttl:
-            expireat = encoder.encode(_time.time() + ttl)
-            ttl = encoder.encode(ttl)
-            item = '%s:{"type":%s,"value":%s,"ttl":%s,"expireat":%s}' % (
-                key, type, value, ttl, expireat)
-        else:
-            item = '%s:{"type":%s,"value":%s}' % (key, type, value)
-        if first:
-            first = False
-        else:
-            fp.write(',')
-        fp.write(item)
+        if type is not None and value is not None:
+            key = encoder.encode(key)
+            type = encoder.encode(type)
+            value = encoder.encode(value)
+            if ttl:
+                expireat = encoder.encode(_time.time() + ttl)
+                ttl = encoder.encode(ttl)
+                item = '%s:{"type":%s,"value":%s,"ttl":%s,"expireat":%s}' % (
+                    key, type, value, ttl, expireat)
+            else:
+                item = '%s:{"type":%s,"value":%s}' % (key, type, value)
+            if first:
+                first = False
+            else:
+                fp.write(',')
+            fp.write(item)
     fp.write('}')
 
 class StringReader(object):
@@ -300,6 +301,10 @@ def _reader(r, pretty, encoding, keys='*'):
             except KeyTypeChangedError:
                 # retry reading type again
                 pass
+            except:
+                # Pass None values since retries are not going to help
+                handled = True
+                yield key, None, None, None
         if not handled:
             # ran out of retries
             raise ConcurrentModificationError('Key %s is being concurrently modified' % key)
@@ -482,6 +487,9 @@ def _writer(r, p, key, type, value, ttl, expireat, use_expireat):
             p.zadd(key, element, score)
     elif type == 'hash':
         p.hmset(key, value)
+    elif type is None:
+        # Ignore None types
+        pass
     else:
         raise UnknownTypeError("Unknown key type: %s" % type)
 

From 74854b702a8bacc1c2fdcdbca3631264208fab13 Mon Sep 17 00:00:00 2001
From: "Christian F. Brinkmann" <christian.brinkmann09@gmail.com>
Date: Thu, 26 Jan 2023 17:53:11 +0100
Subject: [PATCH 2/2] Fix zadd using presumably outdated redis-py parameter
 structure

---
 redisdl.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/redisdl.py b/redisdl.py
index fc8dbea..2897885 100755
--- a/redisdl.py
+++ b/redisdl.py
@@ -484,7 +484,7 @@ def _writer(r, p, key, type, value, ttl, expireat, use_expireat):
             p.sadd(key, element)
     elif type == 'zset':
         for element, score in value:
-            p.zadd(key, element, score)
+            p.zadd(key, {element: float(score)})
     elif type == 'hash':
         p.hmset(key, value)
     elif type is None: