1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
|
//! The standard object store which should fit all needs.
use std::{cell::RefCell, ops::Deref};
use crate::Store;
/// This effectively acts like a handle but exists to be usable from the actual `crate::Handle` implementation which adds caches on top.
/// Each store is quickly cloned and contains thread-local state for shared packs.
pub struct Handle<S>
where
S: Deref<Target = Store> + Clone,
{
pub(crate) store: S,
/// Defines what happens when there is no more indices to load.
pub refresh: RefreshMode,
/// The maximum recursion depth for resolving ref-delta base objects, that is objects referring to other objects within
/// a pack.
/// Recursive loops are possible only in purposefully crafted packs.
/// This value doesn't have to be huge as in typical scenarios, these kind of objects are rare and chains supposedly are
/// even more rare.
pub max_recursion_depth: usize,
/// If true, replacements will not be performed even if these are available.
pub ignore_replacements: bool,
pub(crate) token: Option<handle::Mode>,
snapshot: RefCell<load_index::Snapshot>,
packed_object_count: RefCell<Option<u64>>,
}
/// Decide what happens when all indices are loaded.
#[derive(Default, Clone, Copy)]
pub enum RefreshMode {
/// Check for new or changed pack indices (and pack data files) when the last known index is loaded.
/// During runtime we will keep pack indices stable by never reusing them, however, there is the option for
/// clearing internal caches which is likely to change pack ids and it will trigger unloading of packs as they are missing on disk.
#[default]
AfterAllIndicesLoaded,
/// Use this if you expect a lot of missing objects that shouldn't trigger refreshes even after all packs are loaded.
/// This comes at the risk of not learning that the packs have changed in the mean time.
Never,
}
impl RefreshMode {
/// Set this refresh mode to never refresh.
pub fn never(&mut self) {
*self = RefreshMode::Never;
}
}
///
pub mod find;
///
pub mod prefix;
mod header;
///
pub mod iter;
///
pub mod write;
///
pub mod init;
pub(crate) mod types;
pub use types::Metrics;
pub(crate) mod handle;
///
pub mod load_index;
///
pub mod verify;
mod load_one;
mod metrics;
mod access;
///
pub mod structure;
|