Skip to main content

SqliteRefTable

Struct SqliteRefTable 

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

The sqlite row-CAS twin over the co-tenant git_refs rows (substrate.md §refs, ADR-019 §2) — the atomic realization as the one-transaction home: every GitRefs::apply_updates call runs all its CAS check-and-applies inside one BEGIN IMMEDIATE transaction on the co-tenant connection (the migration-checked schema from substrate/w6-migrations), so two clashing applies — from this process or a co-tenant connection of another — serialize on the row write lock and the loser sees the committed winner (stale info), while an atomic denial rolls its transaction back whole, leaving the rows exactly as they were (POC-O’s demonstrated shapes, DQ-2).

Blocking SQL bridges off the async executor (tokio::task::spawn_blocking) per the composition’s concurrency model; the co-tenant handle’s pinned busy timeout absorbs the cross-process write-lock waits. Construction takes the already-migrated handle (CoTenantSqlite::open runs the migrations) — no construction I/O here.

Implementations§

Source§

impl SqliteRefTable

Source

pub fn new(handle: CoTenantSqlite) -> Self

Mount the refs row CAS over a co-tenant handle (the same handle the sqlite registry twin consumes).

Trait Implementations§

Source§

impl GitRefs for SqliteRefTable

Source§

fn list_refs<'life0, 'life1, 'async_trait>( &'life0 self, repo: &'life1 RepoRecord, ) -> Pin<Box<dyn Future<Output = Result<Vec<RefLine>, StorageError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Ref listing — advertisement + ls-refs response data (the full set; ref-prefix filtering is wire-side, client-driven).
Source§

fn apply_updates<'life0, 'life1, 'async_trait>( &'life0 self, repo: &'life1 RepoRecord, updates: Vec<RefUpdate>, atomic: bool, ) -> Pin<Box<dyn Future<Output = Result<Vec<RefOutcome>, StorageError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

One CAS transaction per call — the atomic-correctness home (ADR-013 §7; the substrate row transaction — ADR-019 §2). Runs the per-ref CAS; per-ref denials are outcomes (RefOutcome), not errors (a stale ref is a business result of receive-pack — ADR-013 §7–8). Read more
Source§

impl RefRows for SqliteRefTable

The liveness seam’s row read: one ordered query over the co-tenant rows (ORDER BY repo_id, name — the canonical order the fingerprint folds), bridged off the executor like every blocking-SQL leg.

Source§

fn snapshot<'life0, 'async_trait>( &'life0 self, ) -> Pin<Box<dyn Future<Output = Result<RefRowsSnapshot, StorageError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

The full canonical snapshot: all repos’ rows, name-sorted, with the fingerprint over the canonical form.

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<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

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

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> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

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

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

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

Source§

type Error = !

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

fn try_from(value: U) -> Result<T, !>

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