diff options
Diffstat (limited to 'bin/core/imag-store/src/verify.rs')
-rw-r--r-- | bin/core/imag-store/src/verify.rs | 47 |
1 files changed, 46 insertions, 1 deletions
diff --git a/bin/core/imag-store/src/verify.rs b/bin/core/imag-store/src/verify.rs index 6c9cb70..b806eac 100644 --- a/bin/core/imag-store/src/verify.rs +++ b/bin/core/imag-store/src/verify.rs @@ -17,11 +17,56 @@ // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA // +use std::ops::Deref; + use libimagrt::runtime::Runtime; use libimagutil::warn_exit::warn_exit; +use libimagstore::store::Header; +use libimagstore::store::StoreObject; +/// Verify the store. +/// +/// This function is not intended to be called by normal programs but only by `imag-store`. pub fn verify(rt: &Runtime) { - if rt.store().verify() { + use libimagerror::trace::trace_error_dbg; + + info!("Header | Content length | Path"); + info!("-------+----------------+-----"); + let result = rt + .store() + .walk("") + .into_iter() + .all(|res| match res { + StoreObject::Collection(_) => true, + StoreObject::Id(id) => { + match rt.store().get(id.clone()) { + Ok(Some(fle)) => { + let p = fle.get_location(); + let content_len = fle.get_content().len(); + let header = if fle.get_header().verify().is_ok() { + "ok" + } else { + "broken" + }; + + info!("{: >6} | {: >14} | {:?}", header, content_len, p.deref()); + true + }, + + Ok(None) => { + info!("{: >6} | {: >14} | {:?}", "?", "couldn't load", id.local()); + true + }, + + Err(e) => { + trace_error_dbg(&e); + false + }, + } + }, + }); + + if result { info!("Store seems to be fine"); } else { warn_exit("Store seems to be broken somehow", 1); |