aboutsummaryrefslogtreecommitdiff
path: root/src/db/mod.rs
diff options
context:
space:
mode:
authorJoris2025-02-07 08:25:28 +0100
committerJoris2025-02-07 08:25:28 +0100
commitbfe4aa78d882b9d95bd1f954371136f3aa5c38c9 (patch)
tree597f20035a42f4603d4a1c693a4c070ef00e112e /src/db/mod.rs
parentfedb4e7c7ebf21619f89c29d011e288363a978e9 (diff)
Migrate database at startup
Diffstat (limited to 'src/db/mod.rs')
-rw-r--r--src/db/mod.rs35
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?)
}