diff options
Diffstat (limited to 'src/db/mod.rs')
-rw-r--r-- | src/db/mod.rs | 35 |
1 files changed, 30 insertions, 5 deletions
diff --git a/src/db/mod.rs b/src/db/mod.rs index 1282f0c..ef5ccef 100644 --- a/src/db/mod.rs +++ b/src/db/mod.rs @@ -1,4 +1,5 @@ use anyhow::{Error, Result}; +use rusqlite_migration::{Migrations, M}; use tokio_rusqlite::Connection; pub mod categories; @@ -13,13 +14,37 @@ pub async fn init(path: &str) -> Result<Connection> { Error::msg(format!("Error opening connection: {err}")) })?; - support_foreign_keys(&connection).await?; - + apply_migrations(&connection).await?; + set_pragma(&connection, "foreign_keys", "ON").await?; + set_pragma(&connection, "journal_mode", "wal").await?; Ok(connection) } -async fn support_foreign_keys(conn: &Connection) -> Result<()> { +async fn apply_migrations(conn: &Connection) -> Result<()> { + let migrations = Migrations::new(vec![ + M::up(include_str!("migration/01-init.sql")), + M::up(include_str!("migration/02-payment-category.sql")), + M::up(include_str!("migration/03-sign-in-token.sql")), + M::up(include_str!("migration/04-plural-naming.sql")), + M::up(include_str!("migration/05-strict-tables.sql")), + ]); + + Ok(conn + .call(move |conn| { + migrations.to_latest(conn).map_err(|migration_err| { + tokio_rusqlite::Error::Other(Box::new(migration_err)) + }) + }) + .await?) +} + +async fn set_pragma(conn: &Connection, key: impl Into<String>, value: impl Into<String>) -> Result<()> { + let key = key.into(); + let value = value.into(); Ok(conn - .call(move |conn| Ok(conn.pragma_update(None, "foreign_keys", "ON"))) - .await??) + .call(move |conn| { + conn.pragma_update(None, &key, &value) + .map_err(tokio_rusqlite::Error::Rusqlite) + }) + .await?) } |