Add interface impl for FSStore

This commit is contained in:
Matthias Beyer 2016-01-13 22:04:06 +01:00
parent 912c84e663
commit 3f20028bac
2 changed files with 79 additions and 0 deletions

View file

@ -0,0 +1,78 @@
use std::collections::HashMap;
use std::fs::File;
use std::ops::Drop;
use std::path::PathBuf;
use std::result::Result as RResult;
use std::sync::Arc;
use std::sync::RwLock;
pub use store::Store;
pub use store::Result;
pub use entry::Entry;
pub use error::StoreError;
pub struct FSStore {
location: PathBuf,
/**
* Internal Path->File cache map
*
* Caches the files, so they remain flock()ed
*
* Could be optimized for a threadsafe HashMap
*/
cache: Arc<RwLock<HashMap<PathBuf, File>>>,
}
impl FSStore {
pub fn new(location: PathBuf) -> FSStore {
FSStore {
location: location,
cache: Arc::new(RwLock::new(HashMap::new())),
}
}
}
impl Store for FSStore {
fn location(&self) -> &PathBuf {
&self.location
}
fn create(&self, entry: Entry) -> Result<()> {
unimplemented!()
}
fn read(&self, path: PathBuf) -> Result<Arc<RwLock<Entry>>> {
unimplemented!()
}
fn update(&self, entry: Arc<RwLock<Entry>>) -> Result<()> {
unimplemented!()
}
fn delete(&self, path: PathBuf) -> Result<()> {
unimplemented!()
}
}
impl Drop for FSStore {
/**
* Unlock all files on drop
*
* TODO: Error message when file cannot be unlocked?
*/
fn drop(&mut self) {
use std::ops::DerefMut;
use fs2::FileExt;
let cache = self.cache.clone();
cache.write().unwrap().deref_mut().iter().map(|(_, f)| f.unlock());
}
}

View file

@ -4,6 +4,7 @@ extern crate toml;
pub mod content; pub mod content;
pub mod entry; pub mod entry;
pub mod error; pub mod error;
pub mod fsstore;
pub mod header; pub mod header;
pub mod store; pub mod store;