annotate libervia/backend/memory/migration/versions/fe3a02cb4bec_convert_legacypickle_columns_to_json.py @ 4242:8acf46ed7f36

frontends: remote control implementation: This is the frontends common part of remote control implementation. It handle the creation of WebRTC session, and management of inputs. For now the reception use freedesktop.org Desktop portal, and works mostly with Wayland based Desktop Environments. rel 436
author Goffi <goffi@goffi.org>
date Sat, 11 May 2024 13:52:43 +0200
parents 79a4870cfbdf
children 0d7bb4df2343
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4212
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
1 """convert LegacyPickle columns to JSON
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
2
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
3 Revision ID: fe3a02cb4bec
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
4 Revises: 610345f77e75
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
5 Create Date: 2024-02-22 14:55:59.993983
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
6
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
7 """
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
8 from alembic import op
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
9 import sqlalchemy as sa
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
10 import pickle
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
11 import json
4228
79a4870cfbdf migration: fix migration when XEP-0373 or XEP-0384 can't be imported:
Goffi <goffi@goffi.org>
parents: 4216
diff changeset
12 try:
79a4870cfbdf migration: fix migration when XEP-0373 or XEP-0384 can't be imported:
Goffi <goffi@goffi.org>
parents: 4216
diff changeset
13 from libervia.backend.plugins.plugin_xep_0373 import PublicKeyMetadata
79a4870cfbdf migration: fix migration when XEP-0373 or XEP-0384 can't be imported:
Goffi <goffi@goffi.org>
parents: 4216
diff changeset
14 except Exception:
79a4870cfbdf migration: fix migration when XEP-0373 or XEP-0384 can't be imported:
Goffi <goffi@goffi.org>
parents: 4216
diff changeset
15 PublicKeyMetadata = None
79a4870cfbdf migration: fix migration when XEP-0373 or XEP-0384 can't be imported:
Goffi <goffi@goffi.org>
parents: 4216
diff changeset
16 print(
79a4870cfbdf migration: fix migration when XEP-0373 or XEP-0384 can't be imported:
Goffi <goffi@goffi.org>
parents: 4216
diff changeset
17 "Warning: Can't import XEP-0373, its data won't be updated. It's probably not "
79a4870cfbdf migration: fix migration when XEP-0373 or XEP-0384 can't be imported:
Goffi <goffi@goffi.org>
parents: 4216
diff changeset
18 "used on this installation."
79a4870cfbdf migration: fix migration when XEP-0373 or XEP-0384 can't be imported:
Goffi <goffi@goffi.org>
parents: 4216
diff changeset
19 )
79a4870cfbdf migration: fix migration when XEP-0373 or XEP-0384 can't be imported:
Goffi <goffi@goffi.org>
parents: 4216
diff changeset
20 try:
79a4870cfbdf migration: fix migration when XEP-0373 or XEP-0384 can't be imported:
Goffi <goffi@goffi.org>
parents: 4216
diff changeset
21 from libervia.backend.plugins.plugin_xep_0384 import TrustMessageCacheEntry
79a4870cfbdf migration: fix migration when XEP-0373 or XEP-0384 can't be imported:
Goffi <goffi@goffi.org>
parents: 4216
diff changeset
22 except Exception:
79a4870cfbdf migration: fix migration when XEP-0373 or XEP-0384 can't be imported:
Goffi <goffi@goffi.org>
parents: 4216
diff changeset
23 TrustMessageCacheEntry = None
79a4870cfbdf migration: fix migration when XEP-0373 or XEP-0384 can't be imported:
Goffi <goffi@goffi.org>
parents: 4216
diff changeset
24 print(
79a4870cfbdf migration: fix migration when XEP-0373 or XEP-0384 can't be imported:
Goffi <goffi@goffi.org>
parents: 4216
diff changeset
25 "Warning: Can't import XEP-0384, its data won't be updated. It's probably not "
79a4870cfbdf migration: fix migration when XEP-0373 or XEP-0384 can't be imported:
Goffi <goffi@goffi.org>
parents: 4216
diff changeset
26 "used on this installation."
79a4870cfbdf migration: fix migration when XEP-0373 or XEP-0384 can't be imported:
Goffi <goffi@goffi.org>
parents: 4216
diff changeset
27 )
4212
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
28
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
29 # revision identifiers, used by Alembic.
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
30 revision = "fe3a02cb4bec"
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
31 down_revision = "610345f77e75"
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
32 branch_labels = None
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
33 depends_on = None
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
34
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
35
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
36 def convert_pickle_to_json(value, table, primary_keys):
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
37 """Convert pickled data to JSON, handling potential errors."""
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
38 if value is None:
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
39 return None
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
40 try:
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
41 # some values are converted to bytes with LegacyPickle
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
42 if isinstance(value, str):
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
43 value = value.encode()
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
44 try:
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
45 deserialized = pickle.loads(value, encoding="utf-8")
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
46 except ModuleNotFoundError:
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
47 deserialized = pickle.loads(
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
48 value.replace(b"sat.plugins", b"libervia.backend.plugins"),
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
49 encoding="utf-8",
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
50 )
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
51 if (
4228
79a4870cfbdf migration: fix migration when XEP-0373 or XEP-0384 can't be imported:
Goffi <goffi@goffi.org>
parents: 4216
diff changeset
52 PublicKeyMetadata is not None
79a4870cfbdf migration: fix migration when XEP-0373 or XEP-0384 can't be imported:
Goffi <goffi@goffi.org>
parents: 4216
diff changeset
53 and table == "private_ind_bin"
4212
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
54 and primary_keys[0] == "XEP-0373"
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
55 and not primary_keys[1].startswith("/trust")
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
56 and isinstance(deserialized, set)
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
57 and deserialized
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
58 and isinstance(next(iter(deserialized)), PublicKeyMetadata)
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
59 ):
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
60 # XEP-0373 plugin was pickling an internal class, this can't be converted
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
61 # directly to JSON, so we do a special treatment with the add `to_dict` and
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
62 # `from_dict` methods.
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
63 deserialized = [pkm.to_dict() for pkm in deserialized]
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
64
4216
1a7a3e4b52a4 core (memory/migration):
Goffi <goffi@goffi.org>
parents: 4212
diff changeset
65 elif (
4228
79a4870cfbdf migration: fix migration when XEP-0373 or XEP-0384 can't be imported:
Goffi <goffi@goffi.org>
parents: 4216
diff changeset
66 TrustMessageCacheEntry is not None
79a4870cfbdf migration: fix migration when XEP-0373 or XEP-0384 can't be imported:
Goffi <goffi@goffi.org>
parents: 4216
diff changeset
67 and table == "private_ind_bin"
4216
1a7a3e4b52a4 core (memory/migration):
Goffi <goffi@goffi.org>
parents: 4212
diff changeset
68 and primary_keys[0] == "XEP-0384/TM"
1a7a3e4b52a4 core (memory/migration):
Goffi <goffi@goffi.org>
parents: 4212
diff changeset
69 and primary_keys[1] == "cache"
1a7a3e4b52a4 core (memory/migration):
Goffi <goffi@goffi.org>
parents: 4212
diff changeset
70 ):
1a7a3e4b52a4 core (memory/migration):
Goffi <goffi@goffi.org>
parents: 4212
diff changeset
71 # Same issue and solution as for XEP-0373
1a7a3e4b52a4 core (memory/migration):
Goffi <goffi@goffi.org>
parents: 4212
diff changeset
72 try:
1a7a3e4b52a4 core (memory/migration):
Goffi <goffi@goffi.org>
parents: 4212
diff changeset
73 deserialized = [tm.to_dict() for tm in deserialized]
1a7a3e4b52a4 core (memory/migration):
Goffi <goffi@goffi.org>
parents: 4212
diff changeset
74 except Exception as e:
1a7a3e4b52a4 core (memory/migration):
Goffi <goffi@goffi.org>
parents: 4212
diff changeset
75 print(
1a7a3e4b52a4 core (memory/migration):
Goffi <goffi@goffi.org>
parents: 4212
diff changeset
76 "Warning: Failed to convert Trust Management cache with value "
1a7a3e4b52a4 core (memory/migration):
Goffi <goffi@goffi.org>
parents: 4212
diff changeset
77 f" {deserialized!r}, using empty array instead: {e}"
1a7a3e4b52a4 core (memory/migration):
Goffi <goffi@goffi.org>
parents: 4212
diff changeset
78 )
1a7a3e4b52a4 core (memory/migration):
Goffi <goffi@goffi.org>
parents: 4212
diff changeset
79 deserialized=[]
1a7a3e4b52a4 core (memory/migration):
Goffi <goffi@goffi.org>
parents: 4212
diff changeset
80
4212
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
81 ret = json.dumps(deserialized, ensure_ascii=False, default=str)
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
82 if table == 'history' and ret == "{}":
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
83 # For history, we can remove empty data, but for other tables it may be
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
84 # significant.
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
85 ret = None
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
86 return ret
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
87 except Exception as e:
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
88 print(
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
89 f"Warning: Failed to convert pickle to JSON, using NULL instead. Error: {e}"
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
90 )
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
91 return None
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
92
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
93
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
94 def upgrade():
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
95 print(
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
96 "This migration may take very long, please be patient and don't stop the process."
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
97 )
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
98 connection = op.get_bind()
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
99
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
100 tables_and_columns = [
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
101 ("history", "extra", "uid"),
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
102 ("private_gen_bin", "value", "namespace", "key"),
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
103 ("private_ind_bin", "value", "namespace", "key", "profile_id"),
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
104 ]
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
105
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
106 for table, column, *primary_keys in tables_and_columns:
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
107 primary_key_clause = " AND ".join(f"{pk} = :{pk}" for pk in primary_keys)
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
108 select_stmt = sa.text(f"SELECT {', '.join(primary_keys)}, {column} FROM {table}")
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
109 update_stmt = sa.text(
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
110 f"UPDATE {table} SET {column} = :{column} WHERE {primary_key_clause}"
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
111 )
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
112
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
113 result = connection.execute(select_stmt)
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
114 for row in result:
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
115 value = row[-1]
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
116 if value is None:
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
117 continue
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
118 data = {pk: row[idx] for idx, pk in enumerate(primary_keys)}
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
119 data[column] = convert_pickle_to_json(value, table, row[:-1])
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
120 connection.execute(update_stmt.bindparams(**data))
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
121
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
122
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
123 def convert_json_to_pickle(value, table, primary_keys):
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
124 """Convert JSON data back to pickled data, handling potential errors."""
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
125 if value is None:
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
126 return None
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
127 try:
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
128 deserialized = json.loads(value)
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
129 # Check for the specific table and primary key conditions that require special
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
130 # handling
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
131 if (
4228
79a4870cfbdf migration: fix migration when XEP-0373 or XEP-0384 can't be imported:
Goffi <goffi@goffi.org>
parents: 4216
diff changeset
132 PublicKeyMetadata is not None
79a4870cfbdf migration: fix migration when XEP-0373 or XEP-0384 can't be imported:
Goffi <goffi@goffi.org>
parents: 4216
diff changeset
133 and table == "private_ind_bin"
4212
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
134 and primary_keys[0] == "XEP-0373"
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
135 and not primary_keys[1].startswith("/trust")
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
136 ):
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
137 # Convert list of dicts back to set of PublicKeyMetadata objects
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
138 if isinstance(deserialized, list):
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
139 deserialized = {PublicKeyMetadata.from_dict(d) for d in deserialized}
4216
1a7a3e4b52a4 core (memory/migration):
Goffi <goffi@goffi.org>
parents: 4212
diff changeset
140 elif (
4228
79a4870cfbdf migration: fix migration when XEP-0373 or XEP-0384 can't be imported:
Goffi <goffi@goffi.org>
parents: 4216
diff changeset
141 TrustMessageCacheEntry is not None
79a4870cfbdf migration: fix migration when XEP-0373 or XEP-0384 can't be imported:
Goffi <goffi@goffi.org>
parents: 4216
diff changeset
142 and table == "private_ind_bin"
4216
1a7a3e4b52a4 core (memory/migration):
Goffi <goffi@goffi.org>
parents: 4212
diff changeset
143 and primary_keys[0] == "XEP-0384/TM"
1a7a3e4b52a4 core (memory/migration):
Goffi <goffi@goffi.org>
parents: 4212
diff changeset
144 and primary_keys[1] == "cache"
1a7a3e4b52a4 core (memory/migration):
Goffi <goffi@goffi.org>
parents: 4212
diff changeset
145 ):
1a7a3e4b52a4 core (memory/migration):
Goffi <goffi@goffi.org>
parents: 4212
diff changeset
146 # Convert list of dicts back to set of TrustMessageCacheEntry objects
1a7a3e4b52a4 core (memory/migration):
Goffi <goffi@goffi.org>
parents: 4212
diff changeset
147 if isinstance(deserialized, list):
1a7a3e4b52a4 core (memory/migration):
Goffi <goffi@goffi.org>
parents: 4212
diff changeset
148 deserialized = {TrustMessageCacheEntry.from_dict(d) for d in deserialized}
4212
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
149 return pickle.dumps(deserialized, 0)
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
150 except Exception as e:
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
151 print(
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
152 f"Warning: Failed to convert JSON to pickle, using NULL instead. Error: {e}"
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
153 )
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
154 return None
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
155
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
156
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
157 def downgrade():
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
158 print(
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
159 "Reverting JSON columns to LegacyPickle format. This may take a while, please be "
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
160 "patient."
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
161 )
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
162 connection = op.get_bind()
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
163
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
164 tables_and_columns = [
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
165 ("history", "extra", "uid"),
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
166 ("private_gen_bin", "value", "namespace", "key"),
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
167 ("private_ind_bin", "value", "namespace", "key", "profile_id"),
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
168 ]
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
169
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
170 for table, column, *primary_keys in tables_and_columns:
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
171 primary_key_clause = " AND ".join(f"{pk} = :{pk}" for pk in primary_keys)
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
172 select_stmt = sa.text(f"SELECT {', '.join(primary_keys)}, {column} FROM {table}")
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
173 update_stmt = sa.text(
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
174 f"UPDATE {table} SET {column} = :{column} WHERE {primary_key_clause}"
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
175 )
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
176
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
177 result = connection.execute(select_stmt)
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
178 for row in result:
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
179 value = row[-1]
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
180 if value is None:
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
181 continue
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
182 data = {pk: row[idx] for idx, pk in enumerate(primary_keys)}
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
183 data[column] = convert_json_to_pickle(value, table, row[:-1])
5f2d496c633f core: get rid of `pickle`:
Goffi <goffi@goffi.org>
parents:
diff changeset
184 connection.execute(update_stmt.bindparams(**data))