Skip to main content

max / goingson

2.2 KB · 74 lines History Blame Raw
1 //! SQLite database layer for GoingsOn.
2 //!
3 //! Provides SQLite implementations of all repository traits defined in `goingson-core`.
4 //! Uses `sqlx` for async database operations with connection pooling.
5 //!
6 //! # Usage
7 //!
8 //! ```ignore
9 //! let pool = goingson_db_sqlite::init_pool(Some("./data.db")).await?;
10 //! goingson_db_sqlite::run_migrations(&pool).await?;
11 //! let task_repo = SqliteTaskRepository::new(pool.clone());
12 //! ```
13
14 pub mod migrations;
15 pub mod repository;
16 pub mod utils;
17
18 use sqlx::sqlite::{SqliteConnectOptions, SqliteJournalMode, SqlitePoolOptions};
19 use sqlx::SqlitePool;
20 use std::str::FromStr;
21 use std::time::Duration;
22
23 /// Initialize the SQLite database connection pool
24 /// If database_path is None, uses an in-memory database
25 pub async fn init_pool(database_path: Option<&str>) -> Result<SqlitePool, sqlx::Error> {
26 let path = database_path.unwrap_or("goingson.db");
27
28 let options = SqliteConnectOptions::from_str(&format!("sqlite:{}", path))?
29 .create_if_missing(true)
30 .foreign_keys(true)
31 .journal_mode(SqliteJournalMode::Wal);
32
33 SqlitePoolOptions::new()
34 .max_connections(5)
35 .acquire_timeout(Duration::from_secs(3))
36 .connect_with(options)
37 .await
38 }
39
40 /// Run database migrations
41 pub async fn run_migrations(pool: &SqlitePool) -> Result<(), sqlx::migrate::MigrateError> {
42 sqlx::migrate!("../../migrations/sqlite")
43 .run(pool)
44 .await?;
45
46 // Ensure foreign keys are enabled (safety net for interrupted migrations)
47 sqlx::query("PRAGMA foreign_keys = ON")
48 .execute(pool)
49 .await
50 .map_err(|e| sqlx::migrate::MigrateError::Execute(e))?;
51
52 Ok(())
53 }
54
55 pub use repository::{
56 SqliteAttachmentRepository,
57 SqliteBackupSettingsRepository,
58 SqliteContactRepository,
59 SqliteDailyNoteRepository,
60 SqliteProjectRepository,
61 SqliteTaskRepository,
62 SqliteEventRepository,
63 SqliteEmailRepository,
64 SqliteUserRepository,
65 SqliteEmailAccountRepository,
66 SqliteStatsRepository,
67 SqliteSearchRepository,
68 SqliteMilestoneRepository,
69 SqliteMonthlyReviewRepository,
70 SqliteSavedViewRepository,
71 SqliteSyncAccountRepository,
72 SqliteWeeklyReviewRepository,
73 };
74