diff --git a/src/main.rs b/src/main.rs index 22b5113..80777b0 100644 --- a/src/main.rs +++ b/src/main.rs @@ -28,6 +28,8 @@ enum Command { Run, /// Export logs for a single room as a plain text file. Export { room: String, file: PathBuf }, + /// Compact and clean up vault. + Gc, } impl Default for Command { @@ -54,6 +56,11 @@ async fn main() -> anyhow::Result<()> { match args.command.unwrap_or_default() { Command::Run => run(&vault).await?, Command::Export { room, file } => export::export(&vault, room, &file).await?, + Command::Gc => { + println!("Cleaning up and compacting vault"); + println!("This may take a while..."); + vault.gc().await; + } } vault.close().await; diff --git a/src/vault.rs b/src/vault.rs index 101feb4..cddede3 100644 --- a/src/vault.rs +++ b/src/vault.rs @@ -13,6 +13,7 @@ pub use self::euph::{EuphMsg, EuphVault}; enum Request { Close(oneshot::Sender<()>), + Gc(oneshot::Sender<()>), Euph(EuphRequest), } @@ -28,6 +29,12 @@ impl Vault { let _ = rx.await; } + pub async fn gc(&self) { + let (tx, rx) = oneshot::channel(); + let _ = self.tx.send(Request::Gc(tx)); + let _ = rx.await; + } + pub fn euph(&self, room: String) -> EuphVault { EuphVault { tx: self.tx.clone(), @@ -48,6 +55,9 @@ fn run(mut conn: Connection, mut rx: mpsc::UnboundedReceiver) { drop(tx); break; } + Request::Gc(tx) => { + let _ = conn.execute_batch("ANALYZE; VACUUM;"); + } Request::Euph(r) => r.perform(&mut conn), } }