diff --git a/src/database.rs b/src/database.rs index e0f9eec..2e471d8 100644 --- a/src/database.rs +++ b/src/database.rs @@ -735,40 +735,81 @@ impl Database { let shortroomid = db.globals.next_count()?.to_be_bytes(); db.rooms.roomid_shortroomid.insert(&room_id, &shortroomid)?; db.rooms.shortroomid_roomid.insert(&shortroomid, &room_id)?; + println!("Migration: 8"); } // Update pduids db layout - for (key, v) in db.rooms.pduid_pdu.iter() { + let mut batch = db.rooms.pduid_pdu.iter().filter_map(|(key, v)| { + if !key.starts_with(b"!") { + return None; + } let mut parts = key.splitn(2, |&b| b == 0xff); let room_id = parts.next().unwrap(); let count = parts.next().unwrap(); - let short_room_id = db.rooms.roomid_shortroomid.get(&room_id)?.unwrap(); + let short_room_id = db + .rooms + .roomid_shortroomid + .get(&room_id) + .unwrap() + .expect("shortroomid should exist"); let mut new_key = short_room_id; new_key.extend_from_slice(count); - println!("{:?}", new_key); + Some((new_key, v)) + }); + + db.rooms.pduid_pdu.insert_batch(&mut batch)?; + + for (key, _) in db.rooms.pduid_pdu.iter() { + if key.starts_with(b"!") { + db.rooms.pduid_pdu.remove(&key); + } } + db.globals.bump_database_version(8)?; + + println!("Migration: 7 -> 8 finished"); + } + + if db.globals.database_version()? < 9 { // Update tokenids db layout - for (key, _) in db.rooms.tokenids.iter() { + let mut batch = db.rooms.tokenids.iter().filter_map(|(key, _)| { + if !key.starts_with(b"!") { + return None; + } let mut parts = key.splitn(4, |&b| b == 0xff); let room_id = parts.next().unwrap(); let word = parts.next().unwrap(); let _pdu_id_room = parts.next().unwrap(); let pdu_id_count = parts.next().unwrap(); - let short_room_id = db.rooms.roomid_shortroomid.get(&room_id)?.unwrap(); + let short_room_id = db + .rooms + .roomid_shortroomid + .get(&room_id) + .unwrap() + .expect("shortroomid should exist"); let mut new_key = short_room_id; new_key.extend_from_slice(word); new_key.push(0xff); new_key.extend_from_slice(pdu_id_count); - println!("{:?}", new_key); + println!("old {:?}", key); + println!("new {:?}", new_key); + Some((new_key, Vec::new())) + }); + + db.rooms.tokenids.insert_batch(&mut batch)?; + + for (key, _) in db.rooms.tokenids.iter() { + if key.starts_with(b"!") { + db.rooms.pduid_pdu.remove(&key)?; + } } - db.globals.bump_database_version(8)?; + db.globals.bump_database_version(9)?; - println!("Migration: 7 -> 8 finished"); + println!("Migration: 8 -> 9 finished"); } panic!(); diff --git a/src/database/abstraction/sqlite.rs b/src/database/abstraction/sqlite.rs index f37dd9e..f420021 100644 --- a/src/database/abstraction/sqlite.rs +++ b/src/database/abstraction/sqlite.rs @@ -223,7 +223,10 @@ impl Tree for SqliteTable { let statement = Box::leak(Box::new( guard - .prepare(&format!("SELECT key, value FROM {} ORDER BY key ASC", &self.name)) + .prepare(&format!( + "SELECT key, value FROM {} ORDER BY key ASC", + &self.name + )) .unwrap(), ));