pub struct SqlEntityStore { /* private fields */ }Expand description
An EntityStore backed by SQLite. Namespace is the caller’s responsibility.
UUID is globally unique — get/delete by ID alone. Query/count use the namespace parameter as passed. The store is just a pool + is_file_backed.
Implementations§
Source§impl SqlEntityStore
impl SqlEntityStore
Sourcepub fn new(pool: Arc<ConnectionPool>, is_file_backed: bool) -> Self
pub fn new(pool: Arc<ConnectionPool>, is_file_backed: bool) -> Self
Create a new store.
When KHIVE_WRITE_QUEUE=1 (PoolConfig::write_queue_enabled), every
write path on this store — the batch upsert_entities (its own
explicit flag check) AND every single-row write routed through the
shared with_writer helper (upsert_entity, delete_entity) —
routes through the pool-wide WriterTask
(ConnectionPool::writer_task_handle) instead of the legacy
pool-mutex path. The handle is a clone of the ONE writer task owned
by pool — constructing multiple stores (or multiple namespaces)
over the same pool never spawns more than one writer task; see
ConnectionPool::writer_task_handle’s doc comment for why that
matters. None (falling back to the legacy path for every write)
if the flag is off, or if the writer task failed to spawn (for
example, an in-memory pool, which has no standalone-connection
support) — the flag is a best-effort opt-in, not a hard requirement.
Trait Implementations§
Source§impl EntityStore for SqlEntityStore
impl EntityStore for SqlEntityStore
Source§fn upsert_entity<'life0, 'async_trait>(
&'life0 self,
entity: Entity,
) -> Pin<Box<dyn Future<Output = Result<(), StorageError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn upsert_entity<'life0, 'async_trait>(
&'life0 self,
entity: Entity,
) -> Pin<Box<dyn Future<Output = Result<(), StorageError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Source§fn upsert_entities<'life0, 'async_trait>(
&'life0 self,
entities: Vec<Entity>,
) -> Pin<Box<dyn Future<Output = Result<BatchWriteSummary, StorageError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn upsert_entities<'life0, 'async_trait>(
&'life0 self,
entities: Vec<Entity>,
) -> Pin<Box<dyn Future<Output = Result<BatchWriteSummary, StorageError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Source§fn get_entity<'life0, 'async_trait>(
&'life0 self,
id: Uuid,
) -> Pin<Box<dyn Future<Output = Result<Option<Entity>, StorageError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn get_entity<'life0, 'async_trait>(
&'life0 self,
id: Uuid,
) -> Pin<Box<dyn Future<Output = Result<Option<Entity>, StorageError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
None if absent.Source§fn delete_entity<'life0, 'async_trait>(
&'life0 self,
id: Uuid,
mode: DeleteMode,
) -> Pin<Box<dyn Future<Output = Result<bool, StorageError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn delete_entity<'life0, 'async_trait>(
&'life0 self,
id: Uuid,
mode: DeleteMode,
) -> Pin<Box<dyn Future<Output = Result<bool, StorageError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Source§fn query_entities<'life0, 'life1, 'async_trait>(
&'life0 self,
namespace: &'life1 str,
filter: EntityFilter,
page: PageRequest,
) -> Pin<Box<dyn Future<Output = Result<Page<Entity>, StorageError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn query_entities<'life0, 'life1, 'async_trait>(
&'life0 self,
namespace: &'life1 str,
filter: EntityFilter,
page: PageRequest,
) -> Pin<Box<dyn Future<Output = Result<Page<Entity>, StorageError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Source§fn get_entity_including_deleted<'life0, 'async_trait>(
&'life0 self,
id: Uuid,
) -> Pin<Box<dyn Future<Output = Result<Option<Entity>, StorageError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn get_entity_including_deleted<'life0, 'async_trait>(
&'life0 self,
id: Uuid,
) -> Pin<Box<dyn Future<Output = Result<Option<Entity>, StorageError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Source§fn count_entities<'life0, 'life1, 'async_trait>(
&'life0 self,
namespace: &'life1 str,
filter: EntityFilter,
) -> Pin<Box<dyn Future<Output = Result<u64, StorageError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn count_entities<'life0, 'life1, 'async_trait>(
&'life0 self,
namespace: &'life1 str,
filter: EntityFilter,
) -> Pin<Box<dyn Future<Output = Result<u64, StorageError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Auto Trait Implementations§
impl !RefUnwindSafe for SqlEntityStore
impl !UnwindSafe for SqlEntityStore
impl Freeze for SqlEntityStore
impl Send for SqlEntityStore
impl Sync for SqlEntityStore
impl Unpin for SqlEntityStore
impl UnsafeUnpin for SqlEntityStore
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 more