Skip to main content

CovenReadHandle

Struct CovenReadHandle 

Source
pub struct CovenReadHandle { /* private fields */ }
Expand description

A read-only handle over one coven store, for a same-store secondary reader.

Open it with Coven::builder(cfg).open_read_only(). Cheap to clone — every field is shared (an Arc or a Clone handle), so a clone reads the same database and storage as the original.

§What it can do

  • Rows — read via sql_read. The closure receives the &Connection coven owns; because the connection is read-only, any write statement fails at the SQLite layer.
  • Blobsread_blob and open_blob_stream resolve a blob’s locality and serve it from the local store, the cache, or a cloud fetch into the per-device cache. is_pinned reports whether a set is kept offline.

It builds read storage from the current Config on a cloud miss, exactly as a home-less full handle does — there is no sync loop to reuse.

Implementations§

Source§

impl CovenReadHandle

Source

pub async fn sql_read<F, R>(&self, f: F) -> CovenResult<R>
where F: FnOnce(&Connection) -> CovenResult<R> + Send + 'static, R: Send + 'static,

Run a pure read against the connection coven owns and await the result.

This is the read handle’s form of CovenHandle::sql_read: the closure receives the &Connection directly (coven serializes access on its connection thread, so this never races the writer’s process), and a host closure written against CovenHandle::sql_read ports unchanged here. The connection is SQLITE_OPEN_READONLY: a SELECT/PRAGMA reads normally, and any INSERT/UPDATE/DELETE/DDL is refused by SQLite — the read-only guarantee is enforced at the connection, not left to the caller.

Source

pub async fn row_blob_ref( &self, table: &str, row_id: &str, ) -> Result<RowBlobRef, DbError>

Capture the exact current blob-bearing row version from this reader’s database snapshot.

Source

pub async fn read_blob( &self, blob: &RowBlobRef, ) -> Result<Vec<u8>, BlobCacheError>

Read a blob’s whole plaintext through coven’s locality-aware read: served from the user’s file (Local user-provided), coven’s local store (Local host-provided), the pinned/evictable cache on a Remote hit, or fetched from the cloud into the cache on a Remote miss. The read counterpart of CovenHandle::read_blob.

A cloud fetch writes the fetched bytes into the per-device cache (storage/cache/) with an atomic temp-then-rename — device scratch, no synced state touched — so a File Provider materializing remote content works through a read-only handle. The supplied RowBlobRef already carries the exact stored object and authority, so the read performs no database write or cloud listing.

Source

pub async fn open_blob_stream( &self, blob: &RowBlobRef, offset: u64, len: u64, ) -> Result<Vec<u8>, BlobCacheError>

Serve len plaintext bytes of an exact row blob starting at offset, for streaming or seeking without loading the whole file. The RowBlobRef carries the plaintext length used to bound the range. The ranged sibling of read_blob; a Remote-miss range read fetches from the cloud but writes no cache file (only a whole-file read populates).

Source

pub fn open_app_data( &self, sealed: &[u8], aad: &[u8], ) -> Result<Vec<u8>, SealError>

Open a payload CovenHandle::seal_app_data produced, resolving the store’s master keyring through this handle’s custody. The read side of app-data sealing: a secondary reader opens what the writer sealed, under whichever generation the payload names.

There is no seal counterpart here — sealing writes new ciphertext, which is the writer’s job; this handle only reads.

SealError::Locked if the store is locked; a wrong aad, a tampered payload, an unreadable version, or a generation this store’s keyring lacks each surface their own typed error.

Source

pub async fn is_pinned(&self, blobs: &[BlobRef]) -> Result<bool, BlobCacheError>

Whether every blob in blobs is pinned for offline — present in coven’s kept cache folder (storage/pinned/). An empty set is vacuously pinned. A read; it stats the folder, never writes.

Trait Implementations§

Source§

impl Clone for CovenReadHandle

Source§

fn clone(&self) -> CovenReadHandle

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more

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<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> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> FromRef<T> for T
where T: Clone,

§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
§

impl<T> Instrument for T

§

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

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

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
§

impl<Unshared, Shared> IntoShared<Shared> for Unshared
where Shared: FromUnshared<Unshared>,

§

fn into_shared(self) -> Shared

Creates a shared type from an unshared type.
§

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

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. 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.
§

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

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

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
§

fn with_current_subscriber(self) -> WithDispatch<Self>

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

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,