Skip to main content

SqliteStore

Struct SqliteStore 

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

SQLite-backed persistence store using sqlx connection pool.

Implementations§

Source§

impl SqliteStore

Source

pub async fn open(path: impl AsRef<Path>) -> KanbanResult<Self>

Source

pub fn pool(&self) -> &Pool<Sqlite>

Source

pub async fn checkpoint(&self) -> KanbanResult<()>

Trait Implementations§

Source§

impl CommandStore for SqliteStore

Source§

fn append_commands(&self, cmds: &[Command]) -> KanbanResult<u64>

Appends a batch of commands as one undo unit. Returns the new logical batch count (which equals the new cursor position after execute).
Source§

fn command_count(&self) -> KanbanResult<u64>

Returns the number of batches currently stored (logical count).
Source§

fn load_commands(&self, from: u64, to: u64) -> KanbanResult<Vec<Vec<Command>>>

Returns batches in the half-open logical range [from, to). from is 0-indexed; to is exclusive.
Source§

fn load_all_commands(&self) -> KanbanResult<(Vec<Vec<Command>>, u64)>

Atomically loads all command batches and the count. Default implementation calls command_count() then load_commands(), which is not atomic. Backends with interior locks should override.
Source§

fn truncate_commands_after(&self, after: u64) -> KanbanResult<()>

Removes all batches with index >= after (i.e. retains batches 0..after).
Source§

fn supports_indexed_snapshots(&self) -> bool

Whether this store supports O(1) snapshot lookup at a given command index. When true, undo()/redo() load a stored snapshot instead of replaying.
Source§

fn store_snapshot_at(&self, idx: u64, snapshot: &Snapshot) -> KanbanResult<()>

Stores a snapshot associated with command index idx.
Source§

fn shift_commands(&self, drop_count: u64) -> KanbanResult<()>

Removes the oldest drop_count batches and renumbers the remaining batches so they start from index 0. Also removes any indexed snapshots for dropped batches and renumbers surviving ones.
Source§

fn load_snapshot_at(&self, idx: u64) -> KanbanResult<Option<Snapshot>>

Loads the snapshot stored at command index idx, if any.
Source§

impl DataStore for SqliteStore

Source§

fn get_board(&self, id: Uuid) -> KanbanResult<Option<Board>>

Source§

fn list_boards(&self) -> KanbanResult<Vec<Board>>

Source§

fn upsert_board(&self, board: Board) -> KanbanResult<()>

Source§

fn delete_board(&self, id: Uuid) -> KanbanResult<()>

Source§

fn get_column(&self, id: Uuid) -> KanbanResult<Option<Column>>

Source§

fn list_columns_by_board(&self, board_id: Uuid) -> KanbanResult<Vec<Column>>

Source§

fn list_all_columns(&self) -> KanbanResult<Vec<Column>>

Source§

fn upsert_column(&self, column: Column) -> KanbanResult<()>

Source§

fn delete_column(&self, id: Uuid) -> KanbanResult<()>

Source§

fn delete_columns_by_board(&self, board_id: Uuid) -> KanbanResult<()>

Source§

fn get_card(&self, id: Uuid) -> KanbanResult<Option<Card>>

Source§

fn list_all_cards(&self) -> KanbanResult<Vec<Card>>

Source§

fn list_cards_by_column(&self, column_id: Uuid) -> KanbanResult<Vec<Card>>

Source§

fn list_cards_by_sprint(&self, sprint_id: Uuid) -> KanbanResult<Vec<Card>>

Source§

fn count_cards_in_column(&self, column_id: Uuid) -> KanbanResult<usize>

Source§

fn count_cards_in_column_excluding( &self, column_id: Uuid, exclude: &[Uuid], ) -> KanbanResult<usize>

Source§

fn upsert_card(&self, card: Card) -> KanbanResult<()>

Source§

fn delete_card(&self, id: Uuid) -> KanbanResult<()>

Source§

fn delete_cards_by_columns(&self, column_ids: &[Uuid]) -> KanbanResult<()>

Source§

fn clear_sprint_from_cards( &self, sprint_id: Uuid, timestamp: DateTime<Utc>, ) -> KanbanResult<()>

Source§

fn get_archived_card(&self, card_id: Uuid) -> KanbanResult<Option<ArchivedCard>>

Source§

fn list_archived_cards(&self) -> KanbanResult<Vec<ArchivedCard>>

Source§

fn insert_archived_card(&self, ac: ArchivedCard) -> KanbanResult<()>

Source§

fn delete_archived_card(&self, card_id: Uuid) -> KanbanResult<()>

Source§

fn list_archived_cards_by_columns( &self, column_ids: &[Uuid], ) -> KanbanResult<Vec<ArchivedCard>>

Source§

fn clear_sprint_from_archived_cards( &self, sprint_id: Uuid, timestamp: DateTime<Utc>, ) -> KanbanResult<()>

Source§

fn get_sprint(&self, id: Uuid) -> KanbanResult<Option<Sprint>>

Source§

fn list_sprints_by_board(&self, board_id: Uuid) -> KanbanResult<Vec<Sprint>>

Source§

fn list_all_sprints(&self) -> KanbanResult<Vec<Sprint>>

Source§

fn upsert_sprint(&self, sprint: Sprint) -> KanbanResult<()>

Source§

fn delete_sprint(&self, id: Uuid) -> KanbanResult<()>

Source§

fn delete_sprints_by_board(&self, board_id: Uuid) -> KanbanResult<()>

Source§

fn get_graph(&self) -> KanbanResult<DependencyGraph>

Source§

fn set_graph(&self, graph: DependencyGraph) -> KanbanResult<()>

Source§

fn modify_graph(&self, f: GraphMutFn) -> KanbanResult<()>

Atomically read-modify-write the dependency graph. Read more
Source§

fn snapshot(&self) -> KanbanResult<Snapshot>

Source§

fn apply_snapshot(&self, snapshot: Snapshot) -> KanbanResult<()>

Source§

impl PersistenceStore for SqliteStore

Source§

fn save<'life0, 'async_trait>( &'life0 self, snapshot: StoreSnapshot, ) -> Pin<Box<dyn Future<Output = PersistenceResult<PersistenceMetadata>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Save a snapshot to the store
Source§

fn load<'life0, 'async_trait>( &'life0 self, ) -> Pin<Box<dyn Future<Output = PersistenceResult<(StoreSnapshot, PersistenceMetadata)>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Load the current snapshot from the store
Source§

fn exists<'life0, 'async_trait>( &'life0 self, ) -> Pin<Box<dyn Future<Output = bool> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Check if the store file exists
Source§

fn path(&self) -> &Path

Get the path to the store file
Source§

fn instance_id(&self) -> Uuid

Get the unique instance ID for this store
Source§

fn sync_command_log<'life0, 'life1, 'life2, 'async_trait>( &'life0 self, _batches: &'life1 [Vec<Command>], _cursor: u64, _baseline: Option<&'life2 [u8]>, ) -> Pin<Box<dyn Future<Output = Result<(), PersistenceError>> + Send + 'async_trait>>
where 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait, Self: 'async_trait,

Sync the command log from the in-memory backend to persistent storage. Default implementation is a no-op (SQLite backend writes directly).
Source§

fn get_command_log( &self, ) -> Result<(Vec<Vec<Command>>, u64, Option<Vec<u8>>), PersistenceError>

Retrieve the command log, undo cursor, and optional baseline snapshot. Returns (batches, cursor, baseline_bytes). Default returns empty.
Source§

fn load_sync( &self, ) -> Result<Option<(StoreSnapshot, PersistenceMetadata)>, PersistenceError>

Load the store synchronously (no async runtime required). Returns Ok(None) when the backing file does not exist. 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> 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> 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
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 = 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.
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