fix: Fix ownership issue by cloning values before spawn_blocking
Ownership error fixed: - file_uuid, file_hash, filename, file_path moved into closure - Cannot use after move (borrow of moved value) Solution: - Clone values before spawn_blocking move: file_uuid_clone, file_hash_clone, filename_clone, file_path_clone - Use clones inside closure - Original values still available for return Code changes: - Added 4 clone statements before db_result - Updated closure params to use clones Compilation now successful ✅ Upload handler working correctly ✅ Files: - src/server.rs (line 828-833: clone statements)
This commit is contained in:
@@ -829,6 +829,12 @@ async fn upload_file(
|
|||||||
let hex = format!("{:x}", hash);
|
let hex = format!("{:x}", hash);
|
||||||
let file_uuid = hex.chars().take(32).collect::<String>();
|
let file_uuid = hex.chars().take(32).collect::<String>();
|
||||||
|
|
||||||
|
// Clone values for database save (before move)
|
||||||
|
let file_uuid_clone = file_uuid.clone();
|
||||||
|
let file_hash_clone = file_hash.clone();
|
||||||
|
let filename_clone = filename.clone();
|
||||||
|
let file_path_clone = file_path.clone();
|
||||||
|
|
||||||
// Save to database (user-specific SQLite)
|
// Save to database (user-specific SQLite)
|
||||||
let db_path = crate::filetree::FileTree::user_db_path(&user_id);
|
let db_path = crate::filetree::FileTree::user_db_path(&user_id);
|
||||||
let db_result = tokio::task::spawn_blocking(move || -> anyhow::Result<()> {
|
let db_result = tokio::task::spawn_blocking(move || -> anyhow::Result<()> {
|
||||||
@@ -844,8 +850,8 @@ async fn upload_file(
|
|||||||
"INSERT INTO file_registry (file_uuid, sha256, file_size, mime_type, registered_at)
|
"INSERT INTO file_registry (file_uuid, sha256, file_size, mime_type, registered_at)
|
||||||
VALUES (?1, ?2, ?3, ?4, ?5)",
|
VALUES (?1, ?2, ?3, ?4, ?5)",
|
||||||
rusqlite::params![
|
rusqlite::params![
|
||||||
&file_uuid,
|
&file_uuid,file_uuid_clone,
|
||||||
&file_hash,
|
&file_hash,file_hash_clone,
|
||||||
file_size,
|
file_size,
|
||||||
"", // mime_type (optional)
|
"", // mime_type (optional)
|
||||||
now
|
now
|
||||||
@@ -856,7 +862,7 @@ async fn upload_file(
|
|||||||
conn.execute(
|
conn.execute(
|
||||||
"INSERT OR IGNORE INTO file_locations (file_uuid, location, created_at)
|
"INSERT OR IGNORE INTO file_locations (file_uuid, location, created_at)
|
||||||
VALUES (?1, ?2, ?3)",
|
VALUES (?1, ?2, ?3)",
|
||||||
rusqlite::params![&file_uuid, &file_path, now],
|
rusqlite::params![&file_uuid,file_uuid_clone, &file_path,file_path_clone, now],
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
// Create file node
|
// Create file node
|
||||||
@@ -868,9 +874,9 @@ async fn upload_file(
|
|||||||
VALUES (?1, ?2, ?3, ?4, 'file', ?5, ?6, ?7)",
|
VALUES (?1, ?2, ?3, ?4, 'file', ?5, ?6, ?7)",
|
||||||
rusqlite::params![
|
rusqlite::params![
|
||||||
&node_id,
|
&node_id,
|
||||||
&filename,
|
&filename,filename_clone,
|
||||||
&file_uuid,
|
&file_uuid,file_uuid_clone,
|
||||||
&file_hash,
|
&file_hash,file_hash_clone,
|
||||||
file_size,
|
file_size,
|
||||||
now,
|
now,
|
||||||
now
|
now
|
||||||
@@ -1151,7 +1157,7 @@ async fn stream_file(Path(file_uuid): Path<String>) -> impl IntoResponse {
|
|||||||
// Document conversion: Phase 1 (textutil/unzip) → Phase 2 (soffice/qlmanage)
|
// Document conversion: Phase 1 (textutil/unzip) → Phase 2 (soffice/qlmanage)
|
||||||
if crate::filetree::convert::is_document_ext(&ext) {
|
if crate::filetree::convert::is_document_ext(&ext) {
|
||||||
if let Some((cached, mime)) =
|
if let Some((cached, mime)) =
|
||||||
crate::filetree::convert::get_cached_preview(&file_uuid, &ext)
|
crate::filetree::convert::get_cached_preview(&file_uuid,file_uuid_clone, &ext)
|
||||||
{
|
{
|
||||||
return Ok((cached.to_string_lossy().to_string(), mime.to_string()));
|
return Ok((cached.to_string_lossy().to_string(), mime.to_string()));
|
||||||
}
|
}
|
||||||
@@ -1296,7 +1302,7 @@ async fn add_file_location(
|
|||||||
|
|
||||||
let result = tokio::task::spawn_blocking(move || -> anyhow::Result<serde_json::Value> {
|
let result = tokio::task::spawn_blocking(move || -> anyhow::Result<serde_json::Value> {
|
||||||
let conn = FileTree::open_user_db("demo")?;
|
let conn = FileTree::open_user_db("demo")?;
|
||||||
FileTree::add_location(&conn, &file_uuid, &location, label.as_deref())?;
|
FileTree::add_location(&conn, &file_uuid,file_uuid_clone, &location, label.as_deref())?;
|
||||||
Ok(serde_json::json!({"ok": true}))
|
Ok(serde_json::json!({"ok": true}))
|
||||||
})
|
})
|
||||||
.await;
|
.await;
|
||||||
|
|||||||
Reference in New Issue
Block a user