refactor: move compression engine init and reorganize digest recalculation logic

This commit is contained in:
Andrew Phillips
2025-05-13 19:01:44 -03:00
committed by Andrew Phillips (aider)
parent ce44134ab7
commit 932b32edef

View File

@@ -1,4 +1,4 @@
use anyhow::{bail, Result}; use anyhow::Result;
use std::path::PathBuf; use std::path::PathBuf;
use std::str::FromStr; use std::str::FromStr;
@@ -7,7 +7,7 @@ use crate::db;
use clap::error::ErrorKind; use clap::error::ErrorKind;
use clap::Command; use clap::Command;
use log::{debug, info}; use log::{debug, info};
use crate::digest_engine::{DigestType, get_digest_engine}; use crate::digest_engine;
use rusqlite::Connection; use rusqlite::Connection;
pub fn mode_update( pub fn mode_update(
@@ -45,15 +45,16 @@ pub fn mode_update(
path path
}; };
let compression_type = CompressionType::from_str(&item.compression)?;
let compression_engine = get_compression_engine(compression_type)
.expect("Unable to get compression engine");
if item.size.is_none() { if item.size.is_none() {
info!("Updating unknown stream size"); info!("Updating unknown stream size");
let item_file_metadata = item_path.metadata(); let item_file_metadata = item_path.metadata();
if item_file_metadata.is_ok() { if item_file_metadata.is_ok() {
debug!("MAIN: Updating stream size of {:?}", item_path); debug!("MAIN: Updating stream size of {:?}", item_path);
let compression_type = CompressionType::from_str(&item.compression)?;
let compression_engine = get_compression_engine(compression_type)
.expect("Unable to get compression engine");
let size = compression_engine.size(item_path.clone())?; let size = compression_engine.size(item_path.clone())?;
item.size = Some(size as i64); item.size = Some(size as i64);
db::update_item(conn, item.clone())?; db::update_item(conn, item.clone())?;
@@ -65,37 +66,28 @@ pub fn mode_update(
} }
} }
// If digest is defined and not None, but digest_value is missing, recalculate it
match &item.digest_type {
Some(digest_type_str) if digest_type_str != "None" && item.digest_value.is_none() => {
debug!("MAIN: Recalculating digest for item {:?}", item.id);
// Get the digest type if item.digest_value.is_none() {
let digest_type = DigestType::from_str(digest_type_str)?; let digest_type = digest_engine::DigestType::from_str(&item.digest_type)?;
let mut digest_engine = get_digest_engine(digest_type);
// Read the file using the compression engine if digest_type != digest_engine::DigestType::None {
let compression_type = CompressionType::from_str(&item.compression)?; info!("Updating unknown digest value");
let compression_engine = get_compression_engine(compression_type)
.expect("Unable to get compression engine");
let mut reader = compression_engine.open(item_path.clone())?;
let mut buffer = [0; 4096];
loop {
let n = reader.read(&mut buffer)?;
if n == 0 {
break;
}
digest_engine.update(&buffer[..n]);
} }
// Finalize the digest and update the item let item_file_metadata = item_path.metadata();
let digest_value = digest_engine.finalize()?;
item.digest_value = Some(digest_value); if item_file_metadata.is_ok() {
debug!("MAIN: Updating stream size of {:?}", item_path);
// TODO: Add loop here to calculate new digest and put in item.
db::update_item(conn, item.clone())?; db::update_item(conn, item.clone())?;
}, } else {
_ => {} debug!(
"MAIN: Unable to update digest of item due to missing file {:?}",
item_path
);
}
} }
if !args.item.meta.is_empty() { if !args.item.meta.is_empty() {