pub mod sealing; use std::{fs::File, path::Path}; use log::*; use sqlx::{Pool, Sqlite, sqlite::SqlitePoolOptions}; pub(crate) type DbType = Sqlite; pub(crate) type DbPool = Pool; /// Creates a SQLx SQLite database pool. /// If nonexistent, it creates a new SQLite file. /// /// Note: rvault uses compile-time queries. /// Hence, during development a migrated SQLite file is required. /// Use `cargo sqlx database reset` if required. /// Otherwise, set the env var `SQLX_OFFLINE=true` during compilation (not helpful for development). pub async fn create_pool(db_url: String) -> DbPool { // Create SQLite database file if it does not exist if db_url.starts_with("sqlite:") && db_url != ("sqlite::memory:") { let path = db_url.replace("sqlite:", ""); if !Path::new(&path).exists() { warn!("Sqlite database does not exist, creating file {path}"); File::create(&path).expect("Failed to create database file"); } } let pool = SqlitePoolOptions::new() .max_connections(5) .test_before_acquire(true) .connect(&db_url) .await .expect(&db_url); sqlx::migrate!() .run(&pool) .await .expect("Failed to apply migrations"); pool }