Add entry_creation
This commit is contained in:
parent
d949cddc65
commit
ba2e52788b
4 changed files with 59 additions and 12 deletions
|
@ -16,6 +16,14 @@ pub struct Entry {
|
||||||
|
|
||||||
impl Entry {
|
impl Entry {
|
||||||
|
|
||||||
|
fn new(loc: StoreId) -> Entry {
|
||||||
|
Entry {
|
||||||
|
location: loc,
|
||||||
|
header: EntryHeader::new_current(),
|
||||||
|
content: EntryContent::new()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub fn get_location(&self) -> &StoreId {
|
pub fn get_location(&self) -> &StoreId {
|
||||||
&self.location
|
&self.location
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,6 +18,7 @@ pub enum StoreErrorKind {
|
||||||
StorePathExists,
|
StorePathExists,
|
||||||
StorePathCreate,
|
StorePathCreate,
|
||||||
LockPoisoned,
|
LockPoisoned,
|
||||||
|
EntryAlreadyBorrowed
|
||||||
// maybe more
|
// maybe more
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -33,6 +34,7 @@ fn store_error_type_as_str(e: &StoreErrorKind) -> &'static str {
|
||||||
&StoreErrorKind::StorePathCreate => "Store path create",
|
&StoreErrorKind::StorePathCreate => "Store path create",
|
||||||
&StoreErrorKind::LockPoisoned
|
&StoreErrorKind::LockPoisoned
|
||||||
=> "The internal Store Lock has been poisoned",
|
=> "The internal Store Lock has been poisoned",
|
||||||
|
&StoreErrorKind::EntryAlreadyBorrowed => "Entry is already borrowed",
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
use std::collections::BTreeMap;
|
use std::collections::BTreeMap;
|
||||||
use std::error::Error;
|
use std::error::Error;
|
||||||
use std::result::Result as RResult;
|
use std::result::Result as RResult;
|
||||||
|
use std::collections::BTreeMap;
|
||||||
|
|
||||||
use toml::{Array, Table, Value};
|
use toml::{Array, Table, Value};
|
||||||
use version;
|
use version;
|
||||||
|
@ -102,6 +103,23 @@ impl EntryHeader {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn new_current() -> EntryHeader {
|
||||||
|
EntryHeader {
|
||||||
|
toml: {
|
||||||
|
let mut header = BTreeMap::new();
|
||||||
|
let sub = {
|
||||||
|
let mut sub = BTreeMap::new();
|
||||||
|
sub.insert("version".into(), Value::String(version!()));
|
||||||
|
|
||||||
|
Value::Table(sub)
|
||||||
|
};
|
||||||
|
|
||||||
|
header.insert("imag".into(), sub);
|
||||||
|
header
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the table which lives in the background
|
* Get the table which lives in the background
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -11,21 +11,29 @@ use fs2::FileExt;
|
||||||
use entry::Entry;
|
use entry::Entry;
|
||||||
use error::{StoreError, StoreErrorKind};
|
use error::{StoreError, StoreErrorKind};
|
||||||
use storeid::StoreId;
|
use storeid::StoreId;
|
||||||
|
use lazyfile::LazyFile;
|
||||||
|
|
||||||
/// The Result Type returned by any interaction with the store that could fail
|
/// The Result Type returned by any interaction with the store that could fail
|
||||||
pub type Result<T> = RResult<T, StoreError>;
|
pub type Result<T> = RResult<T, StoreError>;
|
||||||
|
|
||||||
#[derive(PartialEq)]
|
|
||||||
enum StoreEntryPresence {
|
|
||||||
Present,
|
|
||||||
Borrowed
|
|
||||||
}
|
|
||||||
|
|
||||||
/// A store entry, depending on the option type it is either borrowed currently
|
/// A store entry, depending on the option type it is either borrowed currently
|
||||||
/// or not.
|
/// or not.
|
||||||
struct StoreEntry {
|
enum StoreEntry {
|
||||||
file: File,
|
Present(StoreId, LazyFile),
|
||||||
entry: StoreEntryPresence
|
Borrowed
|
||||||
|
}
|
||||||
|
|
||||||
|
impl PartialEq for StoreEntry {
|
||||||
|
fn eq(&self, other: &StoreEntry) -> bool {
|
||||||
|
use store::StoreEntry::*;
|
||||||
|
match (*self, *other) {
|
||||||
|
(Borrowed, Borrowed) => true,
|
||||||
|
(Borrowed, Present(_,_)) => false,
|
||||||
|
(Present(_,_), Borrowed) => false,
|
||||||
|
(Present(ref a,_), Present(ref b, _)) => a == b
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -33,7 +41,20 @@ impl StoreEntry {
|
||||||
/// The entry is currently borrowed, meaning that some thread is currently
|
/// The entry is currently borrowed, meaning that some thread is currently
|
||||||
/// mutating it
|
/// mutating it
|
||||||
fn is_borrowed(&self) -> bool {
|
fn is_borrowed(&self) -> bool {
|
||||||
self.entry == StoreEntryPresence::Borrowed
|
*self == StoreEntry::Borrowed
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_entry(&self) -> Result<Entry> {
|
||||||
|
if let &StoreEntry::Present(ref id, ref file) = self {
|
||||||
|
let file = file.get_file();
|
||||||
|
if let Err(StoreError{err_type: StoreErrorKind::FileNotFound, ..}) = file {
|
||||||
|
Ok(Entry::new(id.clone()))
|
||||||
|
} else {
|
||||||
|
unimplemented!()
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return Err(StoreError::new(StoreErrorKind::EntryAlreadyBorrowed, None))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -134,11 +155,9 @@ impl Drop for Store {
|
||||||
/**
|
/**
|
||||||
* Unlock all files on drop
|
* Unlock all files on drop
|
||||||
*
|
*
|
||||||
* TODO: Error message when file cannot be unlocked?
|
* TODO: Unlock them
|
||||||
*/
|
*/
|
||||||
fn drop(&mut self) {
|
fn drop(&mut self) {
|
||||||
self.entries.write().unwrap()
|
|
||||||
.iter().map(|f| f.1.file.unlock());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue