Skip to main content

SqliteStore

Struct SqliteStore 

Source
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: Connection

Connection to the sqlite3 database.

§sql_path: Option<PathBuf>

Location for the sqlite3 database; used to reopen it.

§blob_dir: CheckedDir

Location 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

Source

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.

Source

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.

Source

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.

Source

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.)

Source

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.

Source

fn latest_consensus_internal( &self, flavor: ConsensusFlavor, pending: Option<bool>, ) -> Result<StdResult<InputString, AbsentBlob>>

As latest_consensus, but do not retry.

Source

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.

Source

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.

Source

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

Source§

fn is_readonly(&self) -> bool

Return true if this Store is opened in read-only mode.
Source§

fn upgrade_to_readwrite(&mut self) -> Result<bool>

Try to upgrade from a read-only connection to a read-write connection. Read more
Source§

fn expire_all(&mut self, expiration: &ExpirationConfig) -> Result<()>

Delete all completely-expired objects from the database. Read more
Source§

fn latest_consensus( &self, flavor: ConsensusFlavor, pending: Option<bool>, ) -> Result<Option<InputString>>

Load the latest consensus from disk. Read more
Source§

fn latest_consensus_meta( &self, flavor: ConsensusFlavor, ) -> Result<Option<ConsensusMeta>>

Return the information about the latest non-pending consensus, including its valid-after time and digest.
Source§

fn consensus_by_sha3_digest_of_signed_part( &self, d: &[u8; 32], ) -> Result<Option<(InputString, ConsensusMeta)>>

Try to read the consensus whose SHA3-256 digests is the provided value, and its metadata.
Source§

fn store_consensus( &mut self, cmeta: &ConsensusMeta, flavor: ConsensusFlavor, pending: bool, contents: &str, ) -> Result<()>

Write a consensus to disk.
Source§

fn mark_consensus_usable(&mut self, cmeta: &ConsensusMeta) -> Result<()>

Mark the consensus generated from cmeta as no longer pending.
Source§

fn delete_consensus(&mut self, cmeta: &ConsensusMeta) -> Result<()>

Remove the consensus generated from cmeta.
Source§

fn authcerts( &self, certs: &[AuthCertKeyIds], ) -> Result<HashMap<AuthCertKeyIds, String>>

Read all of the specified authority certs from the cache.
Source§

fn store_authcerts(&mut self, certs: &[(AuthCertMeta, &str)]) -> Result<()>

Save a list of authority certificates to the cache.
Source§

fn microdescs(&self, digests: &[MdDigest]) -> Result<HashMap<MdDigest, String>>

Read all the microdescriptors listed in input from the cache.
Source§

fn store_microdescs( &mut self, digests: &[(&str, &MdDigest)], when: SystemTime, ) -> Result<()>

Store every microdescriptor in 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<()>

Update the last-listed time of every microdescriptor in input to when or later.
Source§

fn routerdescs(&self, digests: &[RdDigest]) -> Result<HashMap<RdDigest, String>>

Read all the microdescriptors listed in input from the cache. Read more
Source§

fn store_routerdescs( &mut self, digests: &[(&str, SystemTime, &RdDigest)], ) -> Result<()>

Store every router descriptors in input into the cache.
Source§

fn lookup_bridgedesc( &self, bridge: &BridgeConfig, ) -> Result<Option<CachedBridgeDescriptor>>

Look up a cached bridge descriptor.
Source§

fn store_bridgedesc( &mut self, bridge: &BridgeConfig, entry: CachedBridgeDescriptor, until: SystemTime, ) -> Result<()>

Store a cached bridge descriptor. Read more
Source§

fn delete_bridgedesc(&mut self, bridge: &BridgeConfig) -> Result<()>

Delete a cached bridge descriptor for this bridge. Read more
Source§

fn update_protocol_recommendations( &mut self, valid_after: SystemTime, protocols: &ProtoStatuses, ) -> Result<()>

Try to update our cached protocol recommendations to those listed in protocols.
Source§

fn cached_protocol_recommendations( &self, ) -> Result<Option<(SystemTime, ProtoStatuses)>>

Return our most recent cached protocol recommendations.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<'a, T, E> AsTaggedExplicit<'a, E> for T
where T: 'a,

Source§

fn explicit(self, class: Class, tag: u32) -> TaggedParser<'a, Explicit, Self, E>

Source§

impl<'a, T, E> AsTaggedImplicit<'a, E> for T
where T: 'a,

Source§

fn implicit( self, class: Class, constructed: bool, tag: u32, ) -> TaggedParser<'a, Implicit, Self, E>

Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> Conv for T

Source§

fn conv<T>(self) -> T
where Self: Into<T>,

Converts self into T using Into<T>. Read more
Source§

impl<T> Downcast for T
where T: Any,

Source§

fn into_any(self: Box<T>) -> Box<dyn Any>

Converts 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>

Converts 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)

Converts &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)

Converts &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
where T: Any + Send,

Source§

fn into_any_send(self: Box<T>) -> Box<dyn Any + Send>

Converts Box<Trait> (where Trait: DowncastSend) to Box<dyn Any + Send>, which can then be downcast into Box<ConcreteType> where ConcreteType implements Trait.
Source§

impl<T> FmtForward for T

Source§

fn fmt_binary(self) -> FmtBinary<Self>
where Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
Source§

fn fmt_display(self) -> FmtDisplay<Self>
where Self: Display,

Causes self to use its Display implementation when Debug-formatted.
Source§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where Self: LowerExp,

Causes self to use its LowerExp implementation when Debug-formatted.
Source§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where Self: LowerHex,

Causes self to use its LowerHex implementation when Debug-formatted.
Source§

fn fmt_octal(self) -> FmtOctal<Self>
where Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
Source§

fn fmt_pointer(self) -> FmtPointer<Self>
where Self: Pointer,

Causes self to use its Pointer implementation when Debug-formatted.
Source§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where Self: UpperExp,

Causes self to use its UpperExp implementation when Debug-formatted.
Source§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where Self: UpperHex,

Causes self to use its UpperHex implementation when Debug-formatted.
Source§

fn fmt_list(self) -> FmtList<Self>
where &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts 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 more
Source§

impl<T> Pipe for T
where T: ?Sized,

Source§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
Source§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where Self: Borrow<B>, B: 'a + ?Sized, R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
Source§

fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
where Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
Source§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where Self: AsRef<U>, U: 'a + ?Sized, R: 'a,

Borrows 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
where Self: AsMut<U>, U: 'a + ?Sized, R: 'a,

Mutably borrows 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
where Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
Source§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R, ) -> R
where Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
Source§

impl<T> PossiblyOption<T> for T

Source§

fn to_option(self) -> Option<T>

Convert this object into an Option<T>
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> Tap for T

Source§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
Source§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
Source§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
Source§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
Source§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
Source§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
Source§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
Source§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
Source§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
Source§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Calls .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
where Self: BorrowMut<B>, B: ?Sized,

Calls .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
where Self: AsRef<R>, R: ?Sized,

Calls .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
where Self: AsMut<R>, R: ?Sized,

Calls .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
where Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
Source§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
Source§

impl<T> TryConv for T

Source§

fn try_conv<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more