summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/db.rs19
-rw-r--r--src/files.rs46
-rw-r--r--src/main.rs6
3 files changed, 41 insertions, 30 deletions
diff --git a/src/db.rs b/src/db.rs
index a4896ee..47d18d6 100644
--- a/src/db.rs
+++ b/src/db.rs
@@ -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 })?;