Add file-system file locking functionality in the store

This commit is contained in:
Matthias Beyer 2017-06-04 19:30:13 +02:00
parent e88c5011ab
commit a70d7d347a
2 changed files with 26 additions and 1 deletions

View file

@ -66,3 +66,8 @@ verify = []
#
early-panic=[]
# File system locking
#
# Enable this feature to enable file-system locking in the store.
fs-locking = []

View file

@ -130,11 +130,18 @@ impl Iterator for Walk {
}
}
impl StoreEntry {
fn new(id: StoreId) -> Result<StoreEntry> {
let pb = try!(id.clone().into_pathbuf());
#[cfg(feature = "fs-lock")]
{
try!(open_file(pb.clone())
.and_then(|f| f.lock_exclusive().map_err_into(SEK::FileError))
.map_err_into(SEK::IoError));
}
Ok(StoreEntry {
id: id,
file: FileAbstraction::Absent(pb),
@ -176,6 +183,19 @@ impl StoreEntry {
}
}
#[cfg(feature = "fs-lock")]
impl Drop for StoreEntry {
fn drop(self) {
self.get_entry()
.and_then(|entry| open_file(entry.get_location().clone()).map_err_into(SEK::IoError))
.and_then(|f| f.unlock().map_err_into(SEK::FileError))
.map_err_into(SEK::IoError)
}
}
/// The Store itself, through this object one can interact with IMAG's entries
pub struct Store {
location: PathBuf,