pub struct SyncedTable { /* private fields */ }Expand description
A table that participates in changeset sync, declared at startup by the host
and passed to [crate::CovenBuilder::synced_tables].
A plain SyncedTable::new table syncs unconditionally — every row goes to
peers. SyncedTable::remote_root keeps that whole-table row sync and also
makes the row a blob-locality root whose blobs are always Remote.
SyncedTable::gated_by makes it a gated root: a boolean column whose
truth decides, per row, whether that row (and its declared FK-descendants) is
shared. A gated-false root and its subtree stay local; flipping the gate true
re-emits the whole now-visible subtree to peers, and flipping it false again
retracts that subtree from peers (emitting deletes for the rows leaving the
shared set) while the rows stay local.
SyncedTable::gated_by_descendants is the upward complement: an
always-shared ancestor that should sync only while at least one gated
descendant survives. Without it, an album whose only releases are gated out
would still sync its own row and land on peers as an orphan with zero
children. A gated-by-descendants ancestor is cut exactly when its gated
subtree is empty, and the keep composes recursively up the foreign-key chain
(an artist syncs iff a surviving album references it, which syncs iff a
surviving release does). The keep-children are inferred from the
foreign-key graph, not declared — listing them by hand would restate the
schema and drift the moment a new foreign key is added.
A table is either a remote root, a gated root, a gated-by-descendants
ancestor, or plain — never two of these. See [super::gate] for the gating
mechanics.
Orthogonally, any table may carry a blob (SyncedTable::carries_blob):
blob-bearing-ness is a property of the row’s columns, not of its gate role.
A table may also be marked an asset (SyncedTable::asset): a decoration
(a cover, an artist image) that rides its foreign-key subject’s gate but never
keeps that subject alive. Asset-ness is likewise independent of the gate role.
Each table must have an id text primary key at column 0 and an
_updated_at TEXT NOT NULL column (the HLC/LWW timestamp). Tables not in the
set the host declares on the builder are local-only and never synced — that is
also the mechanism for keeping device-local state (per-device pin/cache
columns, local paths) out of sync: put it in a table you don’t declare. An
empty set is rejected by [super::cycle::init_sync].
The required RowIdentity defines which ids may name rows. Use
RowIdentity::IndependentUuid for independently created rows and
RowIdentity::SharedKey only when equal application keys intentionally
name and merge as the same row.
Implementations§
Source§impl SyncedTable
impl SyncedTable
Sourcepub fn new(name: impl Into<String>, row_identity: RowIdentity) -> SyncedTable
pub fn new(name: impl Into<String>, row_identity: RowIdentity) -> SyncedTable
An ungated synced table: every row syncs under the required identity mode.
Sourcepub fn gated_by(self, column: impl Into<String>) -> SyncedTable
pub fn gated_by(self, column: impl Into<String>) -> SyncedTable
Make this a gated root: rows sync iff the boolean column is true.
Sourcepub fn scoped_by(self, column: impl Into<String>) -> SyncedTable
pub fn scoped_by(self, column: impl Into<String>) -> SyncedTable
Make this an audience root whose TEXT column selects Store, Local, or
one committed circle for the row and its foreign-key descendants. A
store with an audience root requires crate::HomeStorage::Opaque.
Sourcepub fn remote_root(self) -> SyncedTable
pub fn remote_root(self) -> SyncedTable
Make this a remote root: every row syncs, and blobs on the row or its
foreign-key descendants are always Remote. There is no Local state for
[crate::blob::transition::make_remote] or
[crate::blob::transition::make_local] to transition.
Sourcepub fn gated_by_descendants(self) -> SyncedTable
pub fn gated_by_descendants(self) -> SyncedTable
Make this an always-shared ancestor kept alive by its gated subtree: a row syncs iff a surviving (kept) descendant row references it. The keep-children are inferred from the foreign-key graph at gate-build time, so there is nothing to pass here.
Sourcepub fn carries_blob(self, decl: BlobDecl) -> SyncedTable
pub fn carries_blob(self, decl: BlobDecl) -> SyncedTable
Declare that rows of this table carry a blob, located by the columns in
decl. coven derives the blob set itself from these columns + the live
schema (see [crate::blob::decl::BlobDecls]); it never calls back to the
host to discover blobs. Independent of the gate role.
Sourcepub fn asset(self) -> SyncedTable
pub fn asset(self) -> SyncedTable
Mark this table an asset of its FK subject: a host-provided decoration
(a cover, an artist image) that rides its subject’s gate but never grants
keep. The asset still inherits the gate as a child of its subject — it
syncs exactly when the subject is kept — but the gate excludes it from the
subject’s gated_by_descendants keep computation, so an asset row alone
never keeps an otherwise-empty ancestor alive (and the asset-rides-subject
vs. subject-kept-by-children relation can never form a cycle). Independent
of the gate role; declare it on an FK child of the subject.
Sourcepub fn row_identity(&self) -> RowIdentity
pub fn row_identity(&self) -> RowIdentity
How this table’s ids name logical rows across devices.
Sourcepub fn gate_column(&self) -> Option<&str>
pub fn gate_column(&self) -> Option<&str>
The gate column name, if this table is a gated root.
Sourcepub fn audience_column(&self) -> Option<&str>
pub fn audience_column(&self) -> Option<&str>
The audience column name, if this table is a scoped root.
Sourcepub fn gate_role(&self) -> &GateRole
pub fn gate_role(&self) -> &GateRole
The complete sync role included in the signed routing contract.
Sourcepub fn is_remote_root(&self) -> bool
pub fn is_remote_root(&self) -> bool
Whether this is a remote root: rows sync unconditionally, and blob locality for the row and descendants is always Remote.
Sourcepub fn is_gated_by_descendants(&self) -> bool
pub fn is_gated_by_descendants(&self) -> bool
Whether this is a gated-by-descendants ancestor (kept alive by its gated subtree rather than by a column of its own).
Sourcepub fn is_asset(&self) -> bool
pub fn is_asset(&self) -> bool
Whether this table is an asset of its FK subject (rides the subject’s gate
but never grants keep). See SyncedTable::asset.
Trait Implementations§
Source§impl Clone for SyncedTable
impl Clone for SyncedTable
Source§fn clone(&self) -> SyncedTable
fn clone(&self) -> SyncedTable
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for SyncedTable
impl Debug for SyncedTable
Source§impl PartialEq for SyncedTable
impl PartialEq for SyncedTable
impl Eq for SyncedTable
impl StructuralPartialEq for SyncedTable
Auto Trait Implementations§
impl Freeze for SyncedTable
impl RefUnwindSafe for SyncedTable
impl Send for SyncedTable
impl Sync for SyncedTable
impl Unpin for SyncedTable
impl UnsafeUnpin for SyncedTable
impl UnwindSafe for SyncedTable
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
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.§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