upend/src/filesystem.rs

67 lines
1.8 KiB
Rust
Raw Normal View History

2020-08-27 00:11:50 +02:00
use std::fs;
use std::path::{Path, PathBuf};
use actix::prelude::*;
2020-09-07 21:21:54 +02:00
use anyhow::Result;
2020-09-06 12:32:17 +02:00
use chrono::prelude::*;
2020-09-07 21:21:54 +02:00
use log::{info, warn};
use walkdir::WalkDir;
2020-08-27 00:11:50 +02:00
2020-09-07 21:21:54 +02:00
use crate::hash::{encode, ComputeHash, Hash, HasherWorker};
use crate::models::NewFile;
2020-08-27 00:11:50 +02:00
pub async fn update_directory<T: AsRef<Path>>(
directory: T,
db_executor: &Addr<crate::database::DbExecutor>,
hasher_worker: &Addr<HasherWorker>,
) -> Result<()> {
for entry in WalkDir::new(&directory)
.into_iter()
.filter_map(|e| e.ok())
.filter(|e| e.path().is_file())
{
info!("Processing: {}", entry.path().display());
let metadata = fs::metadata(entry.path())?;
let size = metadata.len() as i64;
if size < 0 {
panic!("File {} too large?!", entry.path().display());
}
let msg = ComputeHash {
path: entry.path().to_path_buf(),
};
2020-09-07 21:21:54 +02:00
let digest: Result<Result<Hash>, MailboxError> = hasher_worker.send(msg).await;
2020-08-27 00:11:50 +02:00
let new_file = NewFile {
path: entry
.path()
.to_str()
.expect("path not valid unicode?!")
.to_string(),
2020-09-07 21:21:54 +02:00
hash: encode(digest??.0),
2020-08-28 13:51:22 +02:00
size,
2020-09-06 12:32:17 +02:00
created: NaiveDateTime::from_timestamp(Utc::now().timestamp(), 0),
2020-08-27 00:11:50 +02:00
};
let _insert_result = db_executor
.send(crate::database::InsertFile { file: new_file })
.await?;
}
info!("Finished updating {}.", directory.as_ref().display());
Ok(())
}
pub async fn update_directory_bg(
directory: PathBuf,
db_executor: Addr<crate::database::DbExecutor>,
hasher_worker: Addr<HasherWorker>,
) {
let result = update_directory(directory, &db_executor, &hasher_worker).await;
2020-08-30 22:14:24 +02:00
if result.is_err() {
warn!("Update did not succeed!");
}
}