pub mod artists; pub mod paths; pub mod tracks; use r2d2::{Pool, PooledConnection}; use r2d2_sqlite::SqliteConnectionManager; pub fn establish_connection() -> Pool { dotenvy::dotenv().ok(); let database_url = std::env::var("DATABASE_URL").expect("DATABASE_URL must be set"); let manager = SqliteConnectionManager::file(database_url); let pool = Pool::new(manager).expect("Error creating SQLite pool"); pool } pub fn initialize_database( connection: &PooledConnection, ) -> Result<(), r2d2_sqlite::rusqlite::Error> { connection.execute( " CREATE TABLE IF NOT EXISTS library_paths ( id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, path TEXT NOT NULL ); ", [], )?; connection.execute( "CREATE TABLE IF NOT EXISTS artists ( id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, name TEXT NOT NULL )", [], )?; connection.execute( " CREATE TABLE IF NOT EXISTS tracks ( hash TEXT PRIMARY KEY NOT NULL, library_path_id INTEGER NOT NULL, name TEXT NOT NULL, artist_id INTEGER NOT NULL, path TEXT NOT NULL, duration INTEGER NOT NULL, FOREIGN KEY (library_path_id) REFERENCES library_paths (id) ON DELETE CASCADE, FOREIGN KEY (artist_id) REFERENCES artists (id) ON DELETE CASCADE ); ", [], )?; Ok(()) }