pub(crate) struct SqliteStore {
conn: Connection,
sql_path: Option<PathBuf>,
blob_dir: CheckedDir,
lockfile: Option<LockFile>,
}Expand description
Local directory cache using a Sqlite3 connection.
Fields§
§conn: ConnectionConnection to the sqlite3 database.
sql_path: Option<PathBuf>Location for the sqlite3 database; used to reopen it.
blob_dir: CheckedDirLocation to store blob files.
lockfile: Option<LockFile>Lockfile to prevent concurrent write attempts from different processes.
If this is None we aren’t using a lockfile. Watch out!
(sqlite supports that with connection locking, but we want to be a little more coarse-grained here)
Implementations§
Source§impl SqliteStore
impl SqliteStore
Sourcepub(crate) fn from_path_and_mistrust<P: AsRef<Path>>(
path: P,
mistrust: &Mistrust,
readonly: bool,
) -> Result<Self>
pub(crate) fn from_path_and_mistrust<P: AsRef<Path>>( path: P, mistrust: &Mistrust, readonly: bool, ) -> Result<Self>
Construct or open a new SqliteStore at some location on disk. The provided location must be a directory, or a possible location for a directory: the directory will be created if necessary.
If readonly is true, the result will be a read-only store. Otherwise, when readonly is false, the result may be read-only or read-write, depending on whether we can acquire the lock.
§Limitations:
The file locking that we use to ensure that only one dirmgr is writing to a given storage directory at a time is currently per process. Therefore, you might get unexpected results if two SqliteStores are created in the same process with the path.
Sourcefn from_conn_internal(
conn: Connection,
blob_dir: CheckedDir,
readonly: bool,
) -> Result<Self>
fn from_conn_internal( conn: Connection, blob_dir: CheckedDir, readonly: bool, ) -> Result<Self>
Construct a new SqliteStore from a database connection and a location for blob files.
The readonly argument specifies whether the database connection should be read-only.
Sourcefn check_schema(&mut self, readonly: bool) -> Result<()>
fn check_schema(&mut self, readonly: bool) -> Result<()>
Check whether this database has a schema format we can read, and install or upgrade the schema if necessary.
Sourcefn read_blob(&self, path: &str) -> Result<StdResult<InputString, AbsentBlob>>
fn read_blob(&self, path: &str) -> Result<StdResult<InputString, AbsentBlob>>
Read a blob from disk, mapping it if possible.
Return Ok(Err(.)) if the file for the blob was not found on disk;
returns an error in other cases.
(See blob_consistency for information on why the blob might be absent.)
Sourcefn save_blob_internal(
&mut self,
contents: &[u8],
doctype: &str,
digest_type: &str,
digest: &[u8],
expires: OffsetDateTime,
) -> Result<SavedBlobHandle<'_>>
fn save_blob_internal( &mut self, contents: &[u8], doctype: &str, digest_type: &str, digest: &[u8], expires: OffsetDateTime, ) -> Result<SavedBlobHandle<'_>>
Write a file to disk as a blob, and record it in the ExtDocs table.
Return a SavedBlobHandle that describes where the blob is, and which can be used either to commit the blob or delete it.
See blob_consistency for more information on guarantees.
Sourcefn latest_consensus_internal(
&self,
flavor: ConsensusFlavor,
pending: Option<bool>,
) -> Result<StdResult<InputString, AbsentBlob>>
fn latest_consensus_internal( &self, flavor: ConsensusFlavor, pending: Option<bool>, ) -> Result<StdResult<InputString, AbsentBlob>>
As latest_consensus, but do not retry.
Sourcefn remove_blob_or_warn<P: AsRef<Path>>(&self, fname: P)
fn remove_blob_or_warn<P: AsRef<Path>>(&self, fname: P)
Remove the blob with name fname, but do not give an error on failure.
See blob_consistency: we should call this only having first ensured
that the blob is removed from the ExtDocs table.
Sourcefn remove_unreferenced_blobs(
&self,
now: OffsetDateTime,
expiration: &ExpirationConfig,
) -> Result<()>
fn remove_unreferenced_blobs( &self, now: OffsetDateTime, expiration: &ExpirationConfig, ) -> Result<()>
Delete any blob files that are old enough, and not mentioned in the ExtDocs table.
There shouldn’t typically be any, but we don’t want to let our cache grow infinitely if we have a bug.
Sourcefn remove_entries_for_vanished_blobs<'a>(
blob_dir: &CheckedDir,
tx: &Transaction<'a>,
) -> Result<usize>
fn remove_entries_for_vanished_blobs<'a>( blob_dir: &CheckedDir, tx: &Transaction<'a>, ) -> Result<usize>
Remove any entry in the ExtDocs table for which a blob file is vanished.
This method is O(n) in the size of the ExtDocs table and the size of the directory.
It doesn’t take self, to avoid problems with the borrow checker.
Trait Implementations§
Source§impl Store for SqliteStore
impl Store for SqliteStore
Source§fn is_readonly(&self) -> bool
fn is_readonly(&self) -> bool
Store is opened in read-only mode.Source§fn upgrade_to_readwrite(&mut self) -> Result<bool>
fn upgrade_to_readwrite(&mut self) -> Result<bool>
Source§fn expire_all(&mut self, expiration: &ExpirationConfig) -> Result<()>
fn expire_all(&mut self, expiration: &ExpirationConfig) -> Result<()>
Source§fn latest_consensus(
&self,
flavor: ConsensusFlavor,
pending: Option<bool>,
) -> Result<Option<InputString>>
fn latest_consensus( &self, flavor: ConsensusFlavor, pending: Option<bool>, ) -> Result<Option<InputString>>
Source§fn latest_consensus_meta(
&self,
flavor: ConsensusFlavor,
) -> Result<Option<ConsensusMeta>>
fn latest_consensus_meta( &self, flavor: ConsensusFlavor, ) -> Result<Option<ConsensusMeta>>
Source§fn consensus_by_sha3_digest_of_signed_part(
&self,
d: &[u8; 32],
) -> Result<Option<(InputString, ConsensusMeta)>>
fn consensus_by_sha3_digest_of_signed_part( &self, d: &[u8; 32], ) -> Result<Option<(InputString, ConsensusMeta)>>
Source§fn store_consensus(
&mut self,
cmeta: &ConsensusMeta,
flavor: ConsensusFlavor,
pending: bool,
contents: &str,
) -> Result<()>
fn store_consensus( &mut self, cmeta: &ConsensusMeta, flavor: ConsensusFlavor, pending: bool, contents: &str, ) -> Result<()>
Source§fn mark_consensus_usable(&mut self, cmeta: &ConsensusMeta) -> Result<()>
fn mark_consensus_usable(&mut self, cmeta: &ConsensusMeta) -> Result<()>
cmeta as no longer pending.Source§fn delete_consensus(&mut self, cmeta: &ConsensusMeta) -> Result<()>
fn delete_consensus(&mut self, cmeta: &ConsensusMeta) -> Result<()>
cmeta.Source§fn authcerts(
&self,
certs: &[AuthCertKeyIds],
) -> Result<HashMap<AuthCertKeyIds, String>>
fn authcerts( &self, certs: &[AuthCertKeyIds], ) -> Result<HashMap<AuthCertKeyIds, String>>
Source§fn store_authcerts(&mut self, certs: &[(AuthCertMeta, &str)]) -> Result<()>
fn store_authcerts(&mut self, certs: &[(AuthCertMeta, &str)]) -> Result<()>
Source§fn microdescs(&self, digests: &[MdDigest]) -> Result<HashMap<MdDigest, String>>
fn microdescs(&self, digests: &[MdDigest]) -> Result<HashMap<MdDigest, String>>
input from the cache.Source§fn store_microdescs(
&mut self,
digests: &[(&str, &MdDigest)],
when: SystemTime,
) -> Result<()>
fn store_microdescs( &mut self, digests: &[(&str, &MdDigest)], when: SystemTime, ) -> Result<()>
input into the cache, and say that
it was last listed at when.Source§fn update_microdescs_listed(
&mut self,
digests: &[MdDigest],
when: SystemTime,
) -> Result<()>
fn update_microdescs_listed( &mut self, digests: &[MdDigest], when: SystemTime, ) -> Result<()>
last-listed time of every microdescriptor in
input to when or later.Source§fn routerdescs(&self, digests: &[RdDigest]) -> Result<HashMap<RdDigest, String>>
fn routerdescs(&self, digests: &[RdDigest]) -> Result<HashMap<RdDigest, String>>
input from the cache. Read moreSource§fn store_routerdescs(
&mut self,
digests: &[(&str, SystemTime, &RdDigest)],
) -> Result<()>
fn store_routerdescs( &mut self, digests: &[(&str, SystemTime, &RdDigest)], ) -> Result<()>
input into the cache.Source§fn lookup_bridgedesc(
&self,
bridge: &BridgeConfig,
) -> Result<Option<CachedBridgeDescriptor>>
fn lookup_bridgedesc( &self, bridge: &BridgeConfig, ) -> Result<Option<CachedBridgeDescriptor>>
Source§fn store_bridgedesc(
&mut self,
bridge: &BridgeConfig,
entry: CachedBridgeDescriptor,
until: SystemTime,
) -> Result<()>
fn store_bridgedesc( &mut self, bridge: &BridgeConfig, entry: CachedBridgeDescriptor, until: SystemTime, ) -> Result<()>
Source§fn delete_bridgedesc(&mut self, bridge: &BridgeConfig) -> Result<()>
fn delete_bridgedesc(&mut self, bridge: &BridgeConfig) -> Result<()>
Source§fn update_protocol_recommendations(
&mut self,
valid_after: SystemTime,
protocols: &ProtoStatuses,
) -> Result<()>
fn update_protocol_recommendations( &mut self, valid_after: SystemTime, protocols: &ProtoStatuses, ) -> Result<()>
protocols.Source§fn cached_protocol_recommendations(
&self,
) -> Result<Option<(SystemTime, ProtoStatuses)>>
fn cached_protocol_recommendations( &self, ) -> Result<Option<(SystemTime, ProtoStatuses)>>
Auto Trait Implementations§
impl !Freeze for SqliteStore
impl !RefUnwindSafe for SqliteStore
impl Send for SqliteStore
impl !Sync for SqliteStore
impl Unpin for SqliteStore
impl UnsafeUnpin for SqliteStore
impl !UnwindSafe for SqliteStore
Blanket Implementations§
Source§impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
Source§impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be
downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>, which can then be further
downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.Source§impl<T> DowncastSend for T
impl<T> DowncastSend for T
Source§impl<T> FmtForward for T
impl<T> FmtForward for T
Source§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self to use its Binary implementation when Debug-formatted.Source§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self to use its Display implementation when
Debug-formatted.Source§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self to use its LowerExp implementation when
Debug-formatted.Source§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self to use its LowerHex implementation when
Debug-formatted.Source§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self to use its Octal implementation when Debug-formatted.Source§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self to use its Pointer implementation when
Debug-formatted.Source§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self to use its UpperExp implementation when
Debug-formatted.Source§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self to use its UpperHex implementation when
Debug-formatted.Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
Source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Source§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
Source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
Source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self, then passes self.as_ref() into the pipe function.Source§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self, then passes self.as_mut() into the pipe
function.Source§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.Source§impl<T> PossiblyOption<T> for T
impl<T> PossiblyOption<T> for T
Source§impl<T> Tap for T
impl<T> Tap for T
Source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read moreSource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read moreSource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read moreSource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read moreSource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.Source§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut() only in debug builds, and is erased in release
builds.Source§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref() only in debug builds, and is erased in release
builds.Source§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut() only in debug builds, and is erased in release
builds.Source§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.