Commit graph

5704 commits

Author SHA1 Message Date
eeccd148f3 Transform backend code from compiletime-injection to dependency-injection
The title might be a bit inaccurate, but I cannot think of something
better.

Before the change
=================

Before this change, we had a compiletime backend for the store. This
means that the actual filesystem operations were compiled into the store
either as real filesystem operations (in a normal debug or release
build) but as a in-memory variant in the 'test' case.
So tests did not hit the filesystem when running.
This gave us us the possibility to run tests concurrently with multiple
stores that did not interfere with eachother.

Problem
=======

This approach worked perfectly well until we started to test not the
store itself but crates that depend on the store implementation.
When running tests in a crate A that depends on the store, the store
itself was compiled with the filesystem-hitting-backend.
This was problematic, as tests could not be implemented without hitting
the filesystem.

After the change
================

After this change, the backend code is injected into the store via
dependency injection (the `Store::new()` function automatically uses the
filesystem-backend).
The store can be created with a the in-memory backend when running tests
now.

Implementation
==============

The implementation of this is rather stupid, despite the big diff in
this commit.

Lets have a look at the `Store` code changes first and then we'll
discuss the `file_abstraction` changes this commit introduces.

libimagstore::fs_abstraction
----------------------------

The filesystem was abstracted via a trait `FileAbstraction` which
contains the essential functions for working with the filesystem.

Two implementations are provided in the code:

    * FSFileAbstraction
    * InMemoryFileAbstraction

whereas the first actually works with the filesystem and the latter
works with an in-memory HashMap that is used as filesystem.

Further, the trait `FileAbstractionInstance` was introduced for
functions which are executed on actual instances of content from the
filesystem, which was previousely tied into the general abstraction
mechanism.

So, the `FileAbstraction` trait is for working with the filesystem, the
`FileAbstractionInstance` trait is for working with instances of content
from the filesystem (speak: actual Files).

The `FileAbstraction` trait requires a function to be implemented that
can be used to create a `FileAbstractionInstance` object from it.

In case of the `FSFileAbstractionInstance`, which is the implementation
of the `FileAbstractionInstance` for the actual filesystem-hitting code,
the underlying resource is managed like with the old code before.
The `InMemoryFileAbstractionInstance` implementation is corrosponding to
the `InMemoryFileAbstraction` implementation - for the in-memory
"filesystem".

The implementation of the `get_file_content()` function had to be
changed to return a `String` rather than a `&mut Read` because of
lifetime issues.
This change is store-internally and the API of the store itself was not
affected.

libimagstore::store::Store changes
----------------------------------

So, first we need to make sure that the store knows the actual backend.
Therefor, the `new()` method was renamed to `new_with_backend()` and got
another parameter: the backend implementation.
A new `new()` function was created for convenience and
backwards-compatibility with the rest of the imag codebase (and also
because nobody wants to pass the backend manually all the time).

As the backend is abstracted via a trait, and the store should not
change its interface, the new `Store` member was introduced inside a
`Box`.

All calls (`remove_file()`, `copy()`, `rename()` and `create_dir_all()`)
were refactored from `FileAbstraction::*` calls into `self.backend.*`
calls.

libimagstore::store::StoreEntry changes
---------------------------------------

The `StoreEntry` type is constructed in the store internally for holding
a `StoreId` object as well as some status and the file abstraction code.

This object is constructed via a `new()` function that got a new
parameter: a `&Box<FileAbstraction>` to the backend abstraction the
store uses.
This backend is now used to create a new `FileAbstractionInstance`
object for the `StoreEntry`.

Also the `StoreEntry::get_entry()` code had to be adapted to the new
`Entry::from_str()` function interface.

This commit message is partially added as comment in the code.

Signed-off-by: Matthias Beyer <mail@beyermatthias.de>
2017-06-09 11:15:55 +02:00
ef82b2ab41 Merge pull request #961 from matthiasbeyer/add-missing-license-header
Add missing license headers
2017-06-07 21:13:14 +02:00
795df63679 Add missing license headers 2017-06-07 20:45:38 +02:00
4fff92e7c0 Merge pull request #960 from matthiasbeyer/libimagmail/use-email-crate
Libimagmail/use email crate
2017-06-07 17:52:40 +02:00
1b15d45e7c Merge pull request #959 from matthiasbeyer/libimagentrydate/fix-header-location
Fix header location for datetime values
2017-06-07 17:40:57 +02:00
a106b8c1f4 Add missing license headers 2017-06-07 17:40:45 +02:00
226c939ab8 Remove unused imports 2017-06-07 17:39:49 +02:00
0219f00ec9 Make MailIter pub 2017-06-07 17:39:23 +02:00
41a12db528 Use "email" instead of "mailparse" 2017-06-07 17:38:50 +02:00
ceda2643c0 Fix header location for datetime values 2017-06-07 17:25:58 +02:00
16a12af873 Merge pull request #941 from matthiasbeyer/libimagentrydate/init
libimagentrydate/init
2017-06-07 17:00:52 +02:00
9982195714 Add more tests 2017-06-07 16:47:52 +02:00
c7bbc83572 Update toml-query: 0.1 -> 0.2 2017-06-07 16:47:50 +02:00
33f700dd1c Add test for testing Entry::set_date() 2017-06-07 16:47:17 +02:00
08f43c8811 Merge pull request #957 from matthiasbeyer/update-toml-query
dependency: toml-query: 0.1.0 -> 0.2.0
2017-06-07 13:37:02 +02:00
820037bba6 dependency: toml-query: 0.1.0 -> 0.2.0 2017-06-07 12:29:57 +02:00
bb9ff5bfd8 Merge pull request #951 from matthiasbeyer/remove-hooks
libimagstore: Remove hook support
2017-06-07 11:45:02 +02:00
72f0664976 Merge pull request #952 from matthiasbeyer/remove-hooks-impl-link-consistency-check-in-libimagentrylink
Remove hooks impl link consistency check in libimagentrylink
2017-06-06 22:30:00 +02:00
2b3eab31bd Add tests for range type 2017-06-06 19:37:30 +02:00
fb228c65b1 Move range type to own module 2017-06-06 19:37:30 +02:00
ac36e7aee8 Rename module: entrydate -> datetime 2017-06-06 19:37:30 +02:00
fca8767f7f Rename: libimagentrydate -> libimagentrydatetime 2017-06-06 19:37:30 +02:00
0840739eca Merge pull request #954 from matthiasbeyer/remove-hooks-more-store-debugging
Remove hooks more store debugging
2017-06-06 19:07:19 +02:00
0155fea4c1 Impl Display for StoreLinkConsistencyErrorCustomData 2017-06-06 19:04:53 +02:00
13b24cb397 Impl StoreLinkConsistentExt::check_link_consistency() 2017-06-06 19:04:53 +02:00
83647e52a0 Add trait to extend store for link consistency check
This commit adds the error infrastructure as well as the trait for
extensing the `Store` type with a function to do a link consistency
check over _all_ entries in the store.

The functionality is not implemented yet.
2017-06-06 19:04:53 +02:00
33390acf23 Allow custom data in errors to be displayed 2017-06-06 19:04:53 +02:00
fa0e8130b6 Add debug output to Store::move_by_id 2017-06-06 13:16:09 +02:00
1c18db56e6 Add debug output to Store::save_to_other_location 2017-06-06 13:16:09 +02:00
c06d8c319f Add debug output to Store::save_as 2017-06-06 13:16:09 +02:00
e157a906bd Add debug output to Store::save_to 2017-06-06 13:16:09 +02:00
fc854f3647 Add debug output to Store::delete 2017-06-06 13:16:09 +02:00
79623e1db2 Add debug output to Store::retrieve_copy 2017-06-06 13:16:09 +02:00
ef0a76a02f Add debug output to Store::update 2017-06-06 13:16:09 +02:00
bc80a3b7d5 Add debug output to Store::walk 2017-06-06 13:15:56 +02:00
3f97af4e7a Merge pull request #953 from matthiasbeyer/remove-hooks-flock
Add file-system file locking functionality in the store
2017-06-06 11:34:53 +02:00
a3466ae548 Add debug output to Store::retrieve_for_module 2017-06-06 11:13:09 +02:00
13e80445ae Add debug output to Store::get 2017-06-06 11:13:09 +02:00
6cb5300cd9 Add debug output to Store::retrieve 2017-06-06 11:13:09 +02:00
c4584bf1ca Add debug output in Store::create() 2017-06-06 11:13:09 +02:00
a70d7d347a Add file-system file locking functionality in the store 2017-06-06 11:12:49 +02:00
e88c5011ab Remove libimagstorestdhook entry 2017-06-06 11:12:37 +02:00
25ff89f5fc Remove hook support from libimagrt 2017-06-06 11:12:37 +02:00
9254851724 doc: Remove hook stuff 2017-06-06 11:12:37 +02:00
91dce6858f Remove hook config from example config file 2017-06-06 11:12:37 +02:00
204ef24703 Remove hook support from store 2017-06-06 11:12:37 +02:00
1b8ccb42a7 libimagstorestdhook: Remove 2017-06-06 11:12:36 +02:00
469511918a Fix compiler to have padding zeros in output 2017-05-31 19:37:56 +02:00
fc8fd9fecc Modify tests: Padding zeros 2017-05-31 19:37:56 +02:00
87afacd482 Add more tests 2017-05-31 19:37:56 +02:00