pub struct PgLoroStore { /* private fields */ }Expand description
PG analogue of LoroStore. Lives on the Postgres-backed runtime;
holds the per-row LoroDoc cache (mutated only behind the inner
per-row Mutex) and persists snapshots to the PG sidecar table.
Implementations§
Source§impl PgLoroStore
impl PgLoroStore
Source§impl PgLoroStore
impl PgLoroStore
Sourcepub fn apply_patch<C: PgConn>(
&self,
conn: &mut C,
entity: &str,
row_id: &str,
fields: &[CrdtField],
patch: &Value,
) -> Result<Value, LoroStoreError>
pub fn apply_patch<C: PgConn>( &self, conn: &mut C, entity: &str, row_id: &str, fields: &[CrdtField], patch: &Value, ) -> Result<Value, LoroStoreError>
Apply a JSON patch, persist the new snapshot, return the
projected JSON. Caller is responsible for materializing the
projected JSON into the entity row — typically done in the
same with_transaction_raw so both writes share BEGIN/COMMIT.
Multi-replica safe: hydrates with SELECT ... FOR UPDATE,
which serializes concurrent updates to the same row across
processes. Bypasses the in-memory cache on the write path —
the cache only updates after commit (see cache_after_commit),
so a stale cache from a different process can’t shadow the
row-locked snapshot we just read.
Sourcepub fn apply_remote_update<C: PgConn>(
&self,
conn: &mut C,
entity: &str,
row_id: &str,
fields: &[CrdtField],
update: &[u8],
) -> Result<Value, LoroStoreError>
pub fn apply_remote_update<C: PgConn>( &self, conn: &mut C, entity: &str, row_id: &str, fields: &[CrdtField], update: &[u8], ) -> Result<Value, LoroStoreError>
Apply a binary update from a peer. Returns the projected JSON
for re-materialization on the entity row. Same locking shape
as apply_patch.
Sourcepub fn snapshot<C: PgConn>(
&self,
conn: &mut C,
entity: &str,
row_id: &str,
) -> Result<Vec<u8>, LoroStoreError>
pub fn snapshot<C: PgConn>( &self, conn: &mut C, entity: &str, row_id: &str, ) -> Result<Vec<u8>, LoroStoreError>
Full snapshot for the row. Returns the encoded LoroDoc bytes (empty doc if the row hasn’t been written yet — same shape as the SQLite path). Read-only, no FOR UPDATE.
Sourcepub fn update_since<C: PgConn>(
&self,
conn: &mut C,
entity: &str,
row_id: &str,
since: &VersionVector,
) -> Result<Vec<u8>, LoroStoreError>
pub fn update_since<C: PgConn>( &self, conn: &mut C, entity: &str, row_id: &str, since: &VersionVector, ) -> Result<Vec<u8>, LoroStoreError>
Incremental update since since for catch-up. Same shape as
the SQLite path’s update_since.
Sourcepub fn read_snapshot_via_conn<C: PgConn>(
conn: &mut C,
entity: &str,
row_id: &str,
) -> Result<Vec<u8>, LoroStoreError>
pub fn read_snapshot_via_conn<C: PgConn>( conn: &mut C, entity: &str, row_id: &str, ) -> Result<Vec<u8>, LoroStoreError>
Read the snapshot bytes directly through the supplied connection, bypassing the in-memory cache. Used by the crdt_apply_update path: the cache may hold stale bytes from a prior read (snapshot() populates it), and we need the bytes that just committed to land in the broadcast.
Sourcepub fn cache_after_commit<C: PgConn>(
&self,
conn: &mut C,
entity: &str,
row_id: &str,
)
pub fn cache_after_commit<C: PgConn>( &self, conn: &mut C, entity: &str, row_id: &str, )
Refresh the in-memory cache entry for a row from the
just-committed sidecar bytes. Called by the runtime layer
after with_transaction_raw commits the CRDT write — this
way the cache only ever reflects what’s on disk, and a
rolled-back tx leaves no cache poison.
On any read error we evict instead of caching stale state.
Sourcepub fn evict(&self, entity: &str, row_id: &str)
pub fn evict(&self, entity: &str, row_id: &str)
Drop a row’s cached doc. Next access re-hydrates from the PG sidecar.
Sourcepub fn cached_rows(&self) -> usize
pub fn cached_rows(&self) -> usize
Diagnostic — number of rows cached in memory.
Trait Implementations§
Source§impl Default for PgLoroStore
impl Default for PgLoroStore
Source§fn default() -> PgLoroStore
fn default() -> PgLoroStore
Auto Trait Implementations§
impl !Freeze for PgLoroStore
impl RefUnwindSafe for PgLoroStore
impl Send for PgLoroStore
impl Sync for PgLoroStore
impl Unpin for PgLoroStore
impl UnsafeUnpin for PgLoroStore
impl UnwindSafe for PgLoroStore
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> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§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 moreSource§impl<T> Paint for Twhere
T: ?Sized,
impl<T> Paint for Twhere
T: ?Sized,
Source§fn fg(&self, value: Color) -> Painted<&T>
fn fg(&self, value: Color) -> Painted<&T>
Returns a styled value derived from self with the foreground set to
value.
This method should be used rarely. Instead, prefer to use color-specific
builder methods like red() and
green(), which have the same functionality but are
pithier.
§Example
Set foreground color to white using fg():
use yansi::{Paint, Color};
painted.fg(Color::White);Set foreground color to white using white().
use yansi::Paint;
painted.white();Source§fn bright_black(&self) -> Painted<&T>
fn bright_black(&self) -> Painted<&T>
Source§fn bright_red(&self) -> Painted<&T>
fn bright_red(&self) -> Painted<&T>
Source§fn bright_green(&self) -> Painted<&T>
fn bright_green(&self) -> Painted<&T>
Source§fn bright_yellow(&self) -> Painted<&T>
fn bright_yellow(&self) -> Painted<&T>
Source§fn bright_blue(&self) -> Painted<&T>
fn bright_blue(&self) -> Painted<&T>
Source§fn bright_magenta(&self) -> Painted<&T>
fn bright_magenta(&self) -> Painted<&T>
Source§fn bright_cyan(&self) -> Painted<&T>
fn bright_cyan(&self) -> Painted<&T>
Source§fn bright_white(&self) -> Painted<&T>
fn bright_white(&self) -> Painted<&T>
Source§fn bg(&self, value: Color) -> Painted<&T>
fn bg(&self, value: Color) -> Painted<&T>
Returns a styled value derived from self with the background set to
value.
This method should be used rarely. Instead, prefer to use color-specific
builder methods like on_red() and
on_green(), which have the same functionality but
are pithier.
§Example
Set background color to red using fg():
use yansi::{Paint, Color};
painted.bg(Color::Red);Set background color to red using on_red().
use yansi::Paint;
painted.on_red();Source§fn on_primary(&self) -> Painted<&T>
fn on_primary(&self) -> Painted<&T>
Source§fn on_magenta(&self) -> Painted<&T>
fn on_magenta(&self) -> Painted<&T>
Source§fn on_bright_black(&self) -> Painted<&T>
fn on_bright_black(&self) -> Painted<&T>
Source§fn on_bright_red(&self) -> Painted<&T>
fn on_bright_red(&self) -> Painted<&T>
Source§fn on_bright_green(&self) -> Painted<&T>
fn on_bright_green(&self) -> Painted<&T>
Source§fn on_bright_yellow(&self) -> Painted<&T>
fn on_bright_yellow(&self) -> Painted<&T>
Source§fn on_bright_blue(&self) -> Painted<&T>
fn on_bright_blue(&self) -> Painted<&T>
Source§fn on_bright_magenta(&self) -> Painted<&T>
fn on_bright_magenta(&self) -> Painted<&T>
Source§fn on_bright_cyan(&self) -> Painted<&T>
fn on_bright_cyan(&self) -> Painted<&T>
Source§fn on_bright_white(&self) -> Painted<&T>
fn on_bright_white(&self) -> Painted<&T>
Source§fn attr(&self, value: Attribute) -> Painted<&T>
fn attr(&self, value: Attribute) -> Painted<&T>
Enables the styling Attribute value.
This method should be used rarely. Instead, prefer to use
attribute-specific builder methods like bold() and
underline(), which have the same functionality
but are pithier.
§Example
Make text bold using attr():
use yansi::{Paint, Attribute};
painted.attr(Attribute::Bold);Make text bold using using bold().
use yansi::Paint;
painted.bold();Source§fn rapid_blink(&self) -> Painted<&T>
fn rapid_blink(&self) -> Painted<&T>
Source§fn quirk(&self, value: Quirk) -> Painted<&T>
fn quirk(&self, value: Quirk) -> Painted<&T>
Enables the yansi Quirk value.
This method should be used rarely. Instead, prefer to use quirk-specific
builder methods like mask() and
wrap(), which have the same functionality but are
pithier.
§Example
Enable wrapping using .quirk():
use yansi::{Paint, Quirk};
painted.quirk(Quirk::Wrap);Enable wrapping using wrap().
use yansi::Paint;
painted.wrap();Source§fn clear(&self) -> Painted<&T>
👎Deprecated since 1.0.1: renamed to resetting() due to conflicts with Vec::clear().
The clear() method will be removed in a future release.
fn clear(&self) -> Painted<&T>
renamed to resetting() due to conflicts with Vec::clear().
The clear() method will be removed in a future release.
Source§fn whenever(&self, value: Condition) -> Painted<&T>
fn whenever(&self, value: Condition) -> Painted<&T>
Conditionally enable styling based on whether the Condition value
applies. Replaces any previous condition.
See the crate level docs for more details.
§Example
Enable styling painted only when both stdout and stderr are TTYs:
use yansi::{Paint, Condition};
painted.red().on_yellow().whenever(Condition::STDOUTERR_ARE_TTY);