From 692ef8fb41a11f24b19beeb4fbbb668130ef5736 Mon Sep 17 00:00:00 2001 From: jakka Date: Fri, 13 Jun 2025 15:39:38 +0300 Subject: cleaned up code --- src/db.rs | 91 ++++++++++++++++++++++++++++----------------------------------- 1 file changed, 41 insertions(+), 50 deletions(-) (limited to 'src/db.rs') diff --git a/src/db.rs b/src/db.rs index cb63575..b261e2c 100644 --- a/src/db.rs +++ b/src/db.rs @@ -33,17 +33,18 @@ impl Display for Errors { } } -pub trait Reencoder { - async fn insert_file(&self, filename: &impl AsRef) -> Result<()>; - async fn update_file(&self, filename: &impl AsRef) -> Result<()>; - async fn get_files_toencode(&self) -> Result>; - async fn check_file(&self, filename: &impl AsRef) -> Result; - async fn get_modtime(&self, filename: &impl AsRef) -> Result; - async fn clean_files(&self) -> Result<()>; -} +#[derive(Debug, Clone)] +pub struct Database(pub Connection); + +impl Database { + pub async fn new(path: impl AsRef) -> Result { + let conn = Builder::new_local(path).build().await?.connect()?; + conn.execute(TABLE_CREATE, ()).await?; + + Ok(Database(conn)) + } -impl Reencoder for Connection { - async fn insert_file(&self, filename: &impl AsRef) -> Result<()> { + pub async fn insert_file(&self, filename: &impl AsRef) -> Result<()> { let abs_filename = absolute(Path::new(filename))?; let toencode = !matches!(get_vendor(&abs_filename)?.as_str(), CURRENT_VENDOR); @@ -53,16 +54,17 @@ impl Reencoder for Connection { .duration_since(UNIX_EPOCH)? .as_secs(); - self.execute( - ADD_NEW_ITEM, - params![abs_filename.to_str().unwrap(), toencode, modtime], - ) - .await?; + self.0 + .execute( + ADD_NEW_ITEM, + params![abs_filename.to_str().unwrap(), toencode, modtime], + ) + .await?; Ok(()) } - async fn update_file(&self, filename: &impl AsRef) -> Result<()> { + pub async fn update_file(&self, filename: &impl AsRef) -> Result<()> { let abs_filename = absolute(Path::new(filename))?; let modtime = abs_filename @@ -71,17 +73,18 @@ impl Reencoder for Connection { .duration_since(UNIX_EPOCH)? .as_secs(); - self.execute( - REPLACE_ITEM, - params![abs_filename.to_str().unwrap(), false, modtime], - ) - .await?; + self.0 + .execute( + REPLACE_ITEM, + params![abs_filename.to_str().unwrap(), false, modtime], + ) + .await?; Ok(()) } - async fn get_files_toencode(&self) -> Result> { - let rows = self.query(TOENCODE_QUERY, ()).await?; + pub async fn get_files_toencode(&self) -> Result> { + let rows = self.0.query(TOENCODE_QUERY, ()).await?; if rows.column_count() == 0 { return Err(anyhow!(Errors::EmptyQuery)); }; @@ -95,10 +98,11 @@ impl Reencoder for Connection { Ok(filenames) } - async fn check_file(&self, filename: &impl AsRef) -> Result { + pub async fn check_file(&self, filename: &impl AsRef) -> Result { let abs_filename = absolute(Path::new(filename))?; if let Some(row) = self + .0 .query(CHECK_FILE, params!(abs_filename.to_str().unwrap())) .await? .next() @@ -110,10 +114,11 @@ impl Reencoder for Connection { } } - async fn get_modtime(&self, filename: &impl AsRef) -> Result { + pub async fn get_modtime(&self, filename: &impl AsRef) -> Result { let abs_filename = absolute(Path::new(filename))?; if let Some(row) = self + .0 .query(FETCH_MODTIME, params!(abs_filename.to_str().unwrap())) .await? .next() @@ -129,11 +134,11 @@ impl Reencoder for Connection { } } - async fn clean_files(&self) -> Result<()> { + pub async fn clean_files(&self) -> Result<()> { let mut tasks = tokio::task::JoinSet::new(); - while let Ok(Some(row)) = self.query(FETCH_FILES, ()).await?.next().await { + while let Ok(Some(row)) = self.0.query(FETCH_FILES, ()).await?.next().await { let path = absolute(Path::new(row.get_str(0)?))?; - let conn = self.clone(); + let conn = self.0.clone(); tasks.spawn(async move { if !path.exists() { let _ = conn @@ -149,39 +154,24 @@ impl Reencoder for Connection { } } -pub async fn open_db() -> Result { - let conn = if let Some(base_dir) = BaseDirs::new() { +pub async fn open_default_db() -> Result { + if let Some(base_dir) = BaseDirs::new() { let db_name = Path::new(base_dir.data_dir()).join("reencoder.db"); - Builder::new_local(db_name).build().await?.connect()? + Ok(Database::new(db_name).await?) } else { - return Err(anyhow!("Failed to locate data directory")); - }; - - conn.execute(TABLE_CREATE, ()).await?; - - Ok(conn) + Err(anyhow!("Failed to locate data directory")) + } } #[cfg(test)] mod tests { use super::*; - async fn dummy_db(name: impl AsRef) -> Connection { - let conn = Builder::new_local(name) - .build() - .await - .unwrap() - .connect() - .unwrap(); - conn.execute(TABLE_CREATE, ()).await.unwrap(); - conn - } - #[tokio::test] async fn check_localfiles() { let dbname = String::from("temp1.db"); let filenames = ["16bit.flac", "24bit.flac", "32bit.flac"]; - let conn = dummy_db(&dbname).await; + let conn = Database::new(&dbname).await.unwrap(); for file in filenames { let _ = conn.insert_file(&file.to_string()).await; } @@ -194,12 +184,13 @@ mod tests { async fn check_update() { let dbname = String::from("temp2.db"); let filenames = ["16bit.flac", "24bit.flac", "32bit.flac"]; - let conn = dummy_db(&dbname).await; + let conn = Database::new(&dbname).await.unwrap(); for file in filenames { let _ = conn.insert_file(&file.to_string()).await; } let _ = conn + .0 .execute( REPLACE_ITEM, params![ -- cgit v1.3.1