this repo has no description
1use sqlx::sqlite::{SqliteConnectOptions, SqlitePoolOptions};
2use sqlx::SqlitePool;
3use std::str::FromStr;
4
5pub async fn init_pool(database_url: &str) -> SqlitePool {
6 let options = SqliteConnectOptions::from_str(database_url)
7 .expect("Invalid DATABASE_URL")
8 .create_if_missing(true);
9
10 SqlitePoolOptions::new()
11 .max_connections(5)
12 .connect_with(options)
13 .await
14 .expect("Failed to create database pool")
15}
16
17pub async fn run_migrations(pool: &SqlitePool) {
18 let migrations = [
19 include_str!("../migrations/001_create_users.sql"),
20 include_str!("../migrations/002_create_progress.sql"),
21 include_str!("../migrations/003_create_lesson_state.sql"),
22 include_str!("../migrations/004_add_streak_freezes.sql"),
23 include_str!("../migrations/005_push_notifications.sql"),
24 ];
25
26 for sql in &migrations {
27 // Each migration file may contain multiple statements separated by semicolons.
28 for statement in sql.split(';') {
29 let trimmed = statement.trim();
30 if trimmed.is_empty() {
31 continue;
32 }
33 if let Err(e) = sqlx::query(trimmed).execute(pool).await {
34 // ALTER TABLE ADD COLUMN is not idempotent in SQLite —
35 // ignore "duplicate column" errors on restart.
36 let msg = e.to_string();
37 if msg.contains("duplicate column") {
38 continue;
39 }
40 panic!("Failed to run migration: {e}");
41 }
42 }
43 }
44}