From 31f60ad6fd7feee087f5d340ac5858f70d675e48 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Timo=20K=C3=B6sters?= <timo@koesters.xyz>
Date: Mon, 2 Aug 2021 22:32:28 +0200
Subject: [PATCH] improvement: migrations, batch inserts

---
 src/database.rs                    | 57 +++++++++++++++++++++++++-----
 src/database/abstraction/sqlite.rs |  5 ++-
 2 files changed, 53 insertions(+), 9 deletions(-)

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(),
         ));