matrix_sdk_indexeddb/crypto_store/migrations/
v0_to_v5.rs1use indexed_db_futures::{
19 database::Database,
20 error::{Error, OpenDbError},
21 Build,
22};
23
24use crate::crypto_store::{
25 keys,
26 migrations::{add_nonunique_index, add_unique_index, do_schema_upgrade, old_keys},
27 Result,
28};
29
30pub(crate) async fn schema_add(name: &str) -> Result<(), OpenDbError> {
32 do_schema_upgrade(name, 5, |tx, old_version| {
33 let db = tx.db();
34 if db.object_store_names().next().is_none() {
39 schema_add_v1(db)?;
40 }
41
42 if old_version < 2 {
43 schema_add_v2(db)?;
44 }
45
46 if old_version < 3 {
47 schema_add_v3(db)?;
48 }
49
50 if old_version < 4 {
51 schema_add_v4(db)?;
52 }
53
54 if old_version < 5 {
55 schema_add_v5(db)?;
56 }
57
58 Ok(())
59 })
60 .await
61}
62
63fn schema_add_v1(db: &Database) -> Result<(), Error> {
64 db.create_object_store(keys::CORE).build()?;
65 db.create_object_store(keys::SESSION).build()?;
66
67 db.create_object_store(old_keys::INBOUND_GROUP_SESSIONS_V1).build()?;
68 db.create_object_store(keys::OUTBOUND_GROUP_SESSIONS).build()?;
69 db.create_object_store(keys::TRACKED_USERS).build()?;
70 db.create_object_store(keys::OLM_HASHES).build()?;
71 db.create_object_store(keys::DEVICES).build()?;
72
73 db.create_object_store(keys::IDENTITIES).build()?;
74 db.create_object_store(keys::BACKUP_KEYS).build()?;
75
76 Ok(())
77}
78
79fn schema_add_v2(db: &Database) -> Result<(), Error> {
80 db.delete_object_store(old_keys::INBOUND_GROUP_SESSIONS_V1)?;
86 db.create_object_store(old_keys::INBOUND_GROUP_SESSIONS_V1).build()?;
87
88 db.create_object_store(keys::ROOM_SETTINGS).build()?;
89
90 Ok(())
91}
92
93fn schema_add_v3(db: &Database) -> Result<(), Error> {
94 db.delete_object_store(keys::OUTBOUND_GROUP_SESSIONS)?;
98 db.create_object_store(keys::OUTBOUND_GROUP_SESSIONS).build()?;
99
100 db.create_object_store(old_keys::DIRECT_WITHHELD_INFO).build()?;
102
103 Ok(())
104}
105
106fn schema_add_v4(db: &Database) -> Result<(), Error> {
107 db.create_object_store(keys::SECRETS_INBOX).build()?;
108 Ok(())
109}
110
111fn schema_add_v5(db: &Database) -> Result<(), Error> {
112 let object_store = db.create_object_store(keys::GOSSIP_REQUESTS).build()?;
114
115 add_nonunique_index(&object_store, keys::GOSSIP_REQUESTS_UNSENT_INDEX, "unsent")?;
116
117 add_unique_index(&object_store, keys::GOSSIP_REQUESTS_BY_INFO_INDEX, "info")?;
118
119 if db.object_store_names().any(|n| n == "outgoing_secret_requests") {
120 db.delete_object_store("outgoing_secret_requests")?;
122 db.delete_object_store("unsent_secret_requests")?;
123 db.delete_object_store("secret_requests_by_info")?;
124 }
125
126 Ok(())
127}