From 40e50d7f501425515e95f5859eb06aeb049f886b Mon Sep 17 00:00:00 2001 From: thePR0M3TH3AN <53631862+PR0M3TH3AN@users.noreply.github.com> Date: Mon, 26 May 2025 21:51:24 -0400 Subject: [PATCH] Update rename handling --- libmarlin/src/watcher.rs | 21 ++++++++++++++++++--- libmarlin/src/watcher_tests.rs | 4 ++-- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/libmarlin/src/watcher.rs b/libmarlin/src/watcher.rs index ec3b083..e1e0a25 100644 --- a/libmarlin/src/watcher.rs +++ b/libmarlin/src/watcher.rs @@ -5,7 +5,7 @@ //! event-debouncing, batch processing and a small state-machine so that the //! watcher can be paused, resumed and shut down cleanly. -use crate::db::{self, Database}; +use crate::db::Database; use crate::utils::{canonicalize_lossy, to_db_path}; use anyhow::{anyhow, Context, Result}; use crossbeam_channel::{bounded, Receiver}; @@ -293,12 +293,27 @@ impl FileWatcher { new_s: &str, is_dir: bool, ) -> Result<()> { + use rusqlite::params; + let mut guard = db_mutex.lock().map_err(|_| anyhow!("db mutex poisoned"))?; + let conn = guard.conn_mut(); + if is_dir { - db::rename_directory(guard.conn_mut(), old_s, new_s)?; + let old_prefix = format!("{}/", old_s.trim_end_matches('/')); + let new_prefix = format!("{}/", new_s.trim_end_matches('/')); + let like_pattern = format!("{}%", old_prefix); + conn.execute( + "UPDATE files SET path = REPLACE(path, ?1, ?2) WHERE path LIKE ?3", + params![old_prefix, new_prefix, like_pattern], + )?; } else { - db::update_file_path(guard.conn_mut(), old_s, new_s)?; + conn.execute( + "UPDATE files SET path = ?1 WHERE path = ?2", + params![new_s, old_s], + )?; } + + conn.execute("PRAGMA optimize", [])?; // keep FTS in sync Ok(()) } diff --git a/libmarlin/src/watcher_tests.rs b/libmarlin/src/watcher_tests.rs index c486bfa..97b9503 100644 --- a/libmarlin/src/watcher_tests.rs +++ b/libmarlin/src/watcher_tests.rs @@ -74,7 +74,7 @@ mod tests { ) .unwrap(); - thread::sleep(Duration::from_millis(100)); + thread::sleep(Duration::from_millis(250)); let new_file = dir.join("b.txt"); fs::rename(&file, &new_file).unwrap(); @@ -123,7 +123,7 @@ mod tests { ) .unwrap(); - thread::sleep(Duration::from_millis(100)); + thread::sleep(Duration::from_millis(250)); let new = dir.join("newdir"); fs::rename(&sub, &new).unwrap(); let new_canonical = canonicalize_lossy(&new);