Merge pull request #489 from matthiasbeyer/libimagstore/storify-id
Libimagstore/storify
This commit is contained in:
commit
d7f22020e6
3 changed files with 26 additions and 16 deletions
|
@ -34,6 +34,7 @@ generate_custom_error_types!(StoreError, StoreErrorKind, CustomErrorData,
|
||||||
EncodingError => "Encoding error",
|
EncodingError => "Encoding error",
|
||||||
StorePathError => "Store Path error",
|
StorePathError => "Store Path error",
|
||||||
EntryRenameError => "Entry rename error",
|
EntryRenameError => "Entry rename error",
|
||||||
|
StoreIdHandlingError => "StoreId handling error",
|
||||||
|
|
||||||
CreateCallError => "Error when calling create()",
|
CreateCallError => "Error when calling create()",
|
||||||
RetrieveCallError => "Error when calling retrieve()",
|
RetrieveCallError => "Error when calling retrieve()",
|
||||||
|
|
|
@ -317,17 +317,9 @@ impl Store {
|
||||||
self.configuration.as_ref()
|
self.configuration.as_ref()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn storify_id(&self, id: StoreId) -> StoreId {
|
|
||||||
debug!("Create new store id out of: {:?} and {:?}", self.location, id);
|
|
||||||
let mut new_id = self.location.clone();
|
|
||||||
new_id.push(id);
|
|
||||||
debug!("Created: '{:?}'", new_id);
|
|
||||||
StoreId::from(new_id)
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Creates the Entry at the given location (inside the entry)
|
/// Creates the Entry at the given location (inside the entry)
|
||||||
pub fn create<'a, S: IntoStoreId>(&'a self, id: S) -> Result<FileLockEntry<'a>> {
|
pub fn create<'a, S: IntoStoreId>(&'a self, id: S) -> Result<FileLockEntry<'a>> {
|
||||||
let id = self.storify_id(id.into_storeid());
|
let id = id.into_storeid().storified(self);
|
||||||
if let Err(e) = self.execute_hooks_for_id(self.pre_create_aspects.clone(), &id) {
|
if let Err(e) = self.execute_hooks_for_id(self.pre_create_aspects.clone(), &id) {
|
||||||
if e.is_aborting() {
|
if e.is_aborting() {
|
||||||
return Err(e)
|
return Err(e)
|
||||||
|
@ -365,7 +357,7 @@ impl Store {
|
||||||
/// Implicitely creates a entry in the store if there is no entry with the id `id`. For a
|
/// Implicitely creates a entry in the store if there is no entry with the id `id`. For a
|
||||||
/// non-implicitely-create look at `Store::get`.
|
/// non-implicitely-create look at `Store::get`.
|
||||||
pub fn retrieve<'a, S: IntoStoreId>(&'a self, id: S) -> Result<FileLockEntry<'a>> {
|
pub fn retrieve<'a, S: IntoStoreId>(&'a self, id: S) -> Result<FileLockEntry<'a>> {
|
||||||
let id = self.storify_id(id.into_storeid());
|
let id = id.into_storeid().storified(self);
|
||||||
if let Err(e) = self.execute_hooks_for_id(self.pre_retrieve_aspects.clone(), &id) {
|
if let Err(e) = self.execute_hooks_for_id(self.pre_retrieve_aspects.clone(), &id) {
|
||||||
if e.is_aborting() {
|
if e.is_aborting() {
|
||||||
return Err(e)
|
return Err(e)
|
||||||
|
@ -398,7 +390,7 @@ impl Store {
|
||||||
///
|
///
|
||||||
/// This executes the {pre,post}_retrieve_aspects hooks.
|
/// This executes the {pre,post}_retrieve_aspects hooks.
|
||||||
pub fn get<'a, S: IntoStoreId + Clone>(&'a self, id: S) -> Result<Option<FileLockEntry<'a>>> {
|
pub fn get<'a, S: IntoStoreId + Clone>(&'a self, id: S) -> Result<Option<FileLockEntry<'a>>> {
|
||||||
if !self.storify_id(id.clone().into_storeid()).exists() {
|
if !id.clone().into_storeid().storified(self).exists() {
|
||||||
debug!("Does not exist: {:?}", id.clone().into_storeid());
|
debug!("Does not exist: {:?}", id.clone().into_storeid());
|
||||||
return Ok(None);
|
return Ok(None);
|
||||||
}
|
}
|
||||||
|
@ -520,7 +512,7 @@ impl Store {
|
||||||
/// Retrieve a copy of a given entry, this cannot be used to mutate
|
/// Retrieve a copy of a given entry, this cannot be used to mutate
|
||||||
/// the one on disk
|
/// the one on disk
|
||||||
pub fn retrieve_copy<S: IntoStoreId>(&self, id: S) -> Result<Entry> {
|
pub fn retrieve_copy<S: IntoStoreId>(&self, id: S) -> Result<Entry> {
|
||||||
let id = self.storify_id(id.into_storeid());
|
let id = id.into_storeid().storified(self);
|
||||||
let entries = match self.entries.write() {
|
let entries = match self.entries.write() {
|
||||||
Err(_) => {
|
Err(_) => {
|
||||||
return Err(SE::new(SEK::LockPoisoned, None))
|
return Err(SE::new(SEK::LockPoisoned, None))
|
||||||
|
@ -539,7 +531,7 @@ impl Store {
|
||||||
|
|
||||||
/// Delete an entry
|
/// Delete an entry
|
||||||
pub fn delete<S: IntoStoreId>(&self, id: S) -> Result<()> {
|
pub fn delete<S: IntoStoreId>(&self, id: S) -> Result<()> {
|
||||||
let id = self.storify_id(id.into_storeid());
|
let id = id.into_storeid().storified(self);
|
||||||
if let Err(e) = self.execute_hooks_for_id(self.pre_delete_aspects.clone(), &id) {
|
if let Err(e) = self.execute_hooks_for_id(self.pre_delete_aspects.clone(), &id) {
|
||||||
if e.is_aborting() {
|
if e.is_aborting() {
|
||||||
return Err(e)
|
return Err(e)
|
||||||
|
@ -593,7 +585,7 @@ impl Store {
|
||||||
use std::fs::copy;
|
use std::fs::copy;
|
||||||
use std::fs::remove_file;
|
use std::fs::remove_file;
|
||||||
|
|
||||||
let new_id = self.storify_id(new_id);
|
let new_id = new_id.storified(self);
|
||||||
let hsmap = self.entries.write();
|
let hsmap = self.entries.write();
|
||||||
if hsmap.is_err() {
|
if hsmap.is_err() {
|
||||||
return Err(SE::new(SEK::LockPoisoned, None)).map_err_into(SEK::MoveCallError)
|
return Err(SE::new(SEK::LockPoisoned, None)).map_err_into(SEK::MoveCallError)
|
||||||
|
@ -622,8 +614,8 @@ impl Store {
|
||||||
pub fn move_by_id(&self, old_id: StoreId, new_id: StoreId) -> Result<()> {
|
pub fn move_by_id(&self, old_id: StoreId, new_id: StoreId) -> Result<()> {
|
||||||
use std::fs::rename;
|
use std::fs::rename;
|
||||||
|
|
||||||
let new_id = self.storify_id(new_id);
|
let new_id = new_id.storified(self);
|
||||||
let old_id = self.storify_id(old_id);
|
let old_id = old_id.storified(self);
|
||||||
|
|
||||||
if let Err(e) = self.execute_hooks_for_id(self.pre_move_aspects.clone(), &old_id) {
|
if let Err(e) = self.execute_hooks_for_id(self.pre_move_aspects.clone(), &old_id) {
|
||||||
if e.is_aborting() {
|
if e.is_aborting() {
|
||||||
|
|
|
@ -16,6 +16,23 @@ use store::Store;
|
||||||
#[derive(Debug, Clone, PartialEq, Hash, Eq, PartialOrd, Ord)]
|
#[derive(Debug, Clone, PartialEq, Hash, Eq, PartialOrd, Ord)]
|
||||||
pub struct StoreId(PathBuf);
|
pub struct StoreId(PathBuf);
|
||||||
|
|
||||||
|
impl StoreId {
|
||||||
|
|
||||||
|
pub fn storified(self, store: &Store) -> StoreId {
|
||||||
|
if self.starts_with(store.path()) {
|
||||||
|
debug!("Not storifying {:?}, because it is already.", self);
|
||||||
|
self
|
||||||
|
} else {
|
||||||
|
debug!("Create new store id out of: {:?} and {:?}", store.path(), self);
|
||||||
|
let mut new_id = store.path().clone();
|
||||||
|
new_id.push(self);
|
||||||
|
debug!("Created: '{:?}'", new_id);
|
||||||
|
StoreId::from(new_id)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
impl Into<PathBuf> for StoreId {
|
impl Into<PathBuf> for StoreId {
|
||||||
|
|
||||||
fn into(self) -> PathBuf {
|
fn into(self) -> PathBuf {
|
||||||
|
|
Loading…
Reference in a new issue