diff --git a/src/accounts.rs b/src/accounts.rs index e6774fa98..ba1ab7545 100644 --- a/src/accounts.rs +++ b/src/accounts.rs @@ -166,6 +166,14 @@ impl Accounts { .remove(&id) .with_context(|| format!("no account with id {id}"))?; ctx.stop_io().await; + + // Explicitly close the database. + // + // Stopping I/O aborts the tasks that keep `Context` clones, + // but aborting the task does not immediately drops the future. + // To make sure the database file is closed + // and can be removed on Windows, we drop all the connections manually. + ctx.sql.close().await; drop(ctx); if let Some(cfg) = self.config.get_account(id) { diff --git a/src/sql.rs b/src/sql.rs index 841325e31..06c52708a 100644 --- a/src/sql.rs +++ b/src/sql.rs @@ -126,7 +126,7 @@ impl Sql { } /// Closes all underlying Sqlite connections. - async fn close(&self) { + pub(crate) async fn close(&self) { let _ = self.pool.write().await.take(); // drop closes the connection }