diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/db.rs | 19 | ||||
| -rw-r--r-- | src/files.rs | 46 | ||||
| -rw-r--r-- | src/main.rs | 6 |
3 files changed, 41 insertions, 30 deletions
@@ -8,7 +8,8 @@ use std::{ use tokio::fs; use turso::{Connection, params, transaction::Transaction}; -const TABLE_CREATE: &str = "CREATE TABLE IF NOT EXISTS flacs (path TEXT PRIMARY KEY UNIQUE, toencode BOOLEAN NOT NULL, modtime INTEGER)"; +const TABLE_CREATE: &str = + "CREATE TABLE flacs (path TEXT PRIMARY KEY UNIQUE, toencode BOOLEAN NOT NULL, modtime INTEGER)"; const ADD_FILE: &str = "INSERT INTO flacs (path, toencode, modtime) VALUES (?1, ?2, ?3)"; const UPDATE_FILE: &str = "UPDATE flacs SET toencode = ?2, modtime = ?3 WHERE path = ?1"; const TOENCODE_PATHS: &str = "SELECT path FROM flacs WHERE toencode"; @@ -20,7 +21,7 @@ const GET_MODTIME: &str = "SELECT modtime FROM flacs WHERE path = ?1"; pub(crate) async fn init_db(path: Option<&PathBuf>) -> Result<turso::Database> { let db = if let Some(file) = path { - turso::Builder::new_local(file.canonicalize()?.to_str().unwrap()) + turso::Builder::new_local(file.to_str().unwrap()) .build() .await? } else if let Some(base_dir) = BaseDirs::new() { @@ -31,8 +32,10 @@ pub(crate) async fn init_db(path: Option<&PathBuf>) -> Result<turso::Database> { } else { return Err(anyhow!("Failed to locate data directory")); }; - let conn = db.connect()?; - conn.execute(TABLE_CREATE, ()).await?; + let mut conn = db.connect()?; + let tx = Transaction::new(&mut conn, turso::transaction::TransactionBehavior::Deferred).await?; + tx.execute(TABLE_CREATE, ()).await?; + tx.commit().await?; Ok(db) } @@ -74,8 +77,8 @@ pub(crate) async fn update_file<'a>(tx: Transaction<'a>, filename: &Path) -> Res Ok(()) } -pub(crate) async fn check_file<'a>(tx: &Transaction<'a>, filename: &Path) -> Result<bool> { - Ok(tx +pub(crate) async fn check_file(conn: &Connection, filename: &Path) -> Result<bool> { + Ok(conn .query(CHECK_FILE, params!(filename.to_str().unwrap())) .await? .next() @@ -122,8 +125,8 @@ pub(crate) async fn get_toencode_number(conn: &Connection) -> Result<u64, turso: .get::<u64>(0) } -pub(crate) async fn get_modtime<'a>(tx: &Transaction<'a>, file: &Path) -> Result<u64> { - Ok(tx +pub(crate) async fn get_modtime(conn: &Connection, file: &Path) -> Result<u64> { + Ok(conn .query(GET_MODTIME, params![file.to_str().unwrap()]) .await? .next() diff --git a/src/files.rs b/src/files.rs index 10e3b2e..617414a 100644 --- a/src/files.rs +++ b/src/files.rs @@ -16,7 +16,7 @@ use std::{ }; use tokio::fs; use turso::{ - Database, + Connection, Database, transaction::{Transaction, TransactionBehavior}, }; use walkdir::WalkDir; @@ -54,18 +54,20 @@ impl Display for FileError { impl Error for FileError {} -async fn handle_file<'a>(file: &Path, tx: Transaction<'a>) -> Result<()> { - if db::check_file(&tx, file).await? { +async fn handle_file(file: &Path, mut conn: Connection) -> Result<()> { + if db::check_file(&conn, file).await? { let modtime = fs::metadata(&file) .await? .modified()? .duration_since(UNIX_EPOCH)? .as_secs(); - let db_modtime = db::get_modtime(&tx, file).await?; + let db_modtime = db::get_modtime(&conn, file).await?; if modtime != db_modtime { + let tx = Transaction::new(&mut conn, TransactionBehavior::Deferred).await?; db::update_file(tx, file).await?; } } else { + let tx = Transaction::new(&mut conn, TransactionBehavior::Deferred).await?; db::insert_file(tx, file).await?; } @@ -100,15 +102,12 @@ pub async fn index_files_recursively( continue; } if path.extension().is_some_and(|x| x == "flac") { - let mut conn = db.connect()?; + let conn = db.connect()?; #[cfg(not(test))] let newbar = bar.clone(); tasks.spawn(async move { - let tx = Transaction::new(&mut conn, TransactionBehavior::Deferred) - .await - .unwrap(); - if let Err(error) = handle_file(&path, tx).await { + if let Err(error) = handle_file(&path, conn).await { #[cfg(not(test))] newbar.println(format!("{}", FileError::new(&path, error))); } else { @@ -342,20 +341,27 @@ mod tests { assert!(counter == 3) } - #[tokio::test] - async fn test_reencode_lots_of_files() { + #[test] + fn test_reencode_lots_of_files() { + let runtime = tokio::runtime::Runtime::new().unwrap(); let dbname = PathBuf::from("temp5.db"); let handler = Arc::new(AtomicBool::new(true)); - let db = db::init_db(Some(&dbname)).await.unwrap(); - let conn = db.connect().unwrap(); - let temp = handler.clone(); - index_files_recursively(Path::new("./testfiles"), &db, temp) - .await - .unwrap(); - let runtime = tokio::runtime::Runtime::new().unwrap(); - println!("\n{}", db::get_toencode_number(&conn).await.unwrap()); + let db = runtime.block_on(async { db::init_db(Some(&dbname)).await.unwrap() }); + runtime.block_on(async { + let conn = db.connect().unwrap(); + let temp = handler.clone(); + index_files_recursively(Path::new("./testfiles"), &db, temp) + .await + .unwrap(); + println!("\n{}", db::get_toencode_number(&conn).await.unwrap()); + }); reencode_files(&db, handler, 4, runtime).unwrap(); - println!("\n{}", db::get_toencode_number(&conn).await.unwrap()); + + let runtime = tokio::runtime::Runtime::new().unwrap(); + let conn = db.connect().unwrap(); + runtime.block_on(async { + println!("\n{}", db::get_toencode_number(&conn).await.unwrap()); + }); std::fs::remove_file(dbname).unwrap(); } } diff --git a/src/main.rs b/src/main.rs index 5774e5f..18dbba7 100644 --- a/src/main.rs +++ b/src/main.rs @@ -91,8 +91,10 @@ fn main() -> Result<()> { })?; let runtime = tokio::runtime::Builder::new_multi_thread().build()?; - let path = args.get_one::<PathBuf>("db"); - let db = runtime.block_on(async { db::init_db(path).await })?; + let dbpath = args.get_one::<PathBuf>("db"); + let db = runtime.block_on(async { db::init_db(dbpath).await })?; + + let path = args.get_one::<PathBuf>("path"); if path.is_none() && !args.get_flag("clean") && !args.get_flag("doit") { let count = runtime.block_on(async { db::get_toencode_number(&db.connect()?).await })?; |
