summaryrefslogtreecommitdiff
path: root/src/generation.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/generation.rs')
-rw-r--r--src/generation.rs32
1 files changed, 32 insertions, 0 deletions
diff --git a/src/generation.rs b/src/generation.rs
index 4e7589c..7a4b71b 100644
--- a/src/generation.rs
+++ b/src/generation.rs
@@ -1,4 +1,5 @@
use crate::chunkid::ChunkId;
+use crate::error::ObnamError;
use crate::fsentry::FilesystemEntry;
use rusqlite::{params, Connection, OpenFlags, Row, Transaction};
use std::path::Path;
@@ -184,4 +185,35 @@ impl LocalGeneration {
}
Ok(ids)
}
+
+ pub fn get_file(&self, filename: &Path) -> anyhow::Result<Option<FilesystemEntry>> {
+ match self.get_file_and_fileno(filename)? {
+ None => Ok(None),
+ Some((_, e)) => Ok(Some(e)),
+ }
+ }
+
+ pub fn get_fileno(&self, filename: &Path) -> anyhow::Result<Option<u64>> {
+ match self.get_file_and_fileno(filename)? {
+ None => Ok(None),
+ Some((id, _)) => Ok(Some(id)),
+ }
+ }
+
+ fn get_file_and_fileno(
+ &self,
+ filename: &Path,
+ ) -> anyhow::Result<Option<(u64, FilesystemEntry)>> {
+ let files = self.files()?;
+ let files: Vec<(u64, FilesystemEntry)> = files
+ .iter()
+ .filter(|(_, e)| e.pathbuf() == filename)
+ .map(|(id, e)| (*id, e.clone()))
+ .collect();
+ match files.len() {
+ 0 => Ok(None),
+ 1 => Ok(Some((files[0].0, files[0].1.clone()))),
+ _ => return Err(ObnamError::TooManyFiles(filename.to_path_buf()).into()),
+ }
+ }
}