diff --git a/src/vault.rs b/src/vault.rs index c4667fe..96de220 100644 --- a/src/vault.rs +++ b/src/vault.rs @@ -1,5 +1,6 @@ mod euph; mod migrate; +mod prepare; use std::path::Path; use std::{fs, thread}; @@ -70,6 +71,7 @@ pub fn launch(path: &Path) -> rusqlite::Result { conn.pragma_update(None, "trusted_schema", false)?; migrate::migrate(&mut conn)?; + prepare::prepare(&mut conn)?; let (tx, rx) = mpsc::unbounded_channel(); thread::spawn(move || run(conn, rx)); diff --git a/src/vault/migrate.rs b/src/vault/migrate.rs index 1c019bb..3351eaa 100644 --- a/src/vault/migrate.rs +++ b/src/vault/migrate.rs @@ -60,13 +60,6 @@ fn m1(tx: &mut Transaction) -> rusqlite::Result<()> { CHECK (start IS NULL OR end IS NOT NULL) ) STRICT; - CREATE TABLE euph_trees ( - room TEXT NOT NULL, - id INT NOT NULL, - - PRIMARY KEY (room, id) - ); - CREATE INDEX euph_idx_msgs_room_id_parent ON euph_msgs (room, id, parent); diff --git a/src/vault/prepare.rs b/src/vault/prepare.rs new file mode 100644 index 0000000..c6f1ca1 --- /dev/null +++ b/src/vault/prepare.rs @@ -0,0 +1,29 @@ +use rusqlite::Connection; + +pub fn prepare(conn: &mut Connection) -> rusqlite::Result<()> { + conn.execute_batch( + " + CREATE TEMPORARY TABLE euph_trees ( + room TEXT NOT NULL, + id INT NOT NULL, + + PRIMARY KEY (room, id) + ) STRICT; + + INSERT INTO euph_trees (room, id) + SELECT room, id + FROM euph_msgs + WHERE parent IS NULL + UNION + SELECT room, parent + FROM euph_msgs + WHERE parent IS NOT NULL + AND NOT EXISTS( + SELECT * + FROM euph_msgs AS parents + WHERE parents.room = euph_msgs.room + AND parents.id = euph_msgs.parent + ); + ", + ) +}