Struct tor_dirmgr::storage::sqlite::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
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.
sourcepub(crate) fn from_conn(conn: Connection, blob_dir: CheckedDir) -> Result<Self>
pub(crate) fn from_conn(conn: Connection, blob_dir: CheckedDir) -> Result<Self>
Construct a new SqliteStore from a database connection and a location for blob files.
Used for testing with a memory-backed database.
sourcefn check_schema(&mut self) -> Result<()>
fn check_schema(&mut self) -> Result<()>
Check whether this database has a schema format we can read, and install or upgrade the schema if necessary.
sourcefn read_blob<P>(&self, path: P) -> Result<InputString>
fn read_blob<P>(&self, path: P) -> Result<InputString>
Read a blob from disk, mapping it if possible.
sourcefn save_blob_internal(
&mut self,
contents: &[u8],
doctype: &str,
dtype: &str,
digest: &[u8],
expires: OffsetDateTime
) -> Result<SavedBlobHandle<'_>>
fn save_blob_internal( &mut self, contents: &[u8], doctype: &str, dtype: &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.
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>>
routerdesc
only.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<()>
routerdesc
only.input
into the cache.source§fn lookup_bridgedesc(
&self,
bridge: &BridgeConfig
) -> Result<Option<CachedBridgeDescriptor>>
fn lookup_bridgedesc( &self, bridge: &BridgeConfig ) -> Result<Option<CachedBridgeDescriptor>>
bridge-client
only.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<()>
bridge-client
only.source§fn delete_bridgedesc(&mut self, bridge: &BridgeConfig) -> Result<()>
fn delete_bridgedesc(&mut self, bridge: &BridgeConfig) -> Result<()>
bridge-client
only.Auto Trait Implementations§
impl !Freeze for SqliteStore
impl !RefUnwindSafe for SqliteStore
impl Send for SqliteStore
impl !Sync for SqliteStore
impl Unpin for SqliteStore
impl !UnwindSafe for SqliteStore
Blanket Implementations§
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
§impl<T> Conv for T
impl<T> Conv for T
§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
§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>
. Box<dyn Any>
can
then be further downcast
into Box<ConcreteType>
where ConcreteType
implements Trait
.§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>
. Rc<Any>
can then be
further downcast
into Rc<ConcreteType>
where ConcreteType
implements Trait
.§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.§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.§impl<T> FmtForward for T
impl<T> FmtForward for T
§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.§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.§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.§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.§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.§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.§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.§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.§fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§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 more§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
§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 more§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 more§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
§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
§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.§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.§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.§impl<T> Tap for T
impl<T> Tap for T
§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 more§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 more§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 more§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 more§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 more§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 more§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.§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.§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.§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.§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.§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.§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.