diff libervia/backend/memory/migration/versions/fe3a02cb4bec_convert_legacypickle_columns_to_json.py @ 4216:1a7a3e4b52a4

core (memory/migration): Update XEP-0384 and `fe3a02cb4bec_convert_legacypickle_columns_to_json.py` migration to properly handle (de)serialisation of `TrustMessageCacheEntry`.
author Goffi <goffi@goffi.org>
date Tue, 05 Mar 2024 17:31:12 +0100
parents 5f2d496c633f
children 79a4870cfbdf
line wrap: on
line diff
--- a/libervia/backend/memory/migration/versions/fe3a02cb4bec_convert_legacypickle_columns_to_json.py	Tue Mar 05 16:43:45 2024 +0100
+++ b/libervia/backend/memory/migration/versions/fe3a02cb4bec_convert_legacypickle_columns_to_json.py	Tue Mar 05 17:31:12 2024 +0100
@@ -10,6 +10,7 @@
 import pickle
 import json
 from libervia.backend.plugins.plugin_xep_0373 import PublicKeyMetadata
+from libervia.backend.plugins.plugin_xep_0384 import TrustMessageCacheEntry
 
 # revision identifiers, used by Alembic.
 revision = "fe3a02cb4bec"
@@ -46,6 +47,21 @@
             # `from_dict` methods.
             deserialized = [pkm.to_dict() for pkm in deserialized]
 
+        elif (
+            table == "private_ind_bin"
+            and primary_keys[0] == "XEP-0384/TM"
+            and primary_keys[1] == "cache"
+        ):
+            # Same issue and solution as for XEP-0373
+            try:
+                deserialized = [tm.to_dict() for tm in deserialized]
+            except Exception as e:
+                print(
+                    "Warning: Failed to convert Trust Management cache with value "
+                    f" {deserialized!r}, using empty array instead: {e}"
+                )
+                deserialized=[]
+
         ret = json.dumps(deserialized, ensure_ascii=False, default=str)
         if table == 'history' and ret == "{}":
             # For history, we can remove empty data, but for other tables it may be
@@ -104,6 +120,14 @@
             # Convert list of dicts back to set of PublicKeyMetadata objects
             if isinstance(deserialized, list):
                 deserialized = {PublicKeyMetadata.from_dict(d) for d in deserialized}
+        elif (
+            table == "private_ind_bin"
+            and primary_keys[0] == "XEP-0384/TM"
+            and primary_keys[1] == "cache"
+        ):
+            # Convert list of dicts back to set of TrustMessageCacheEntry objects
+            if isinstance(deserialized, list):
+                deserialized = {TrustMessageCacheEntry.from_dict(d) for d in deserialized}
         return pickle.dumps(deserialized, 0)
     except Exception as e:
         print(