SqliteAtKeyValueStore class
SQLite-backed AtKeyValueStore — the main keystore (at_data table).
Mirrors the Hive keystore's semantics (metadata-builder-on-write,
commit-op selection, TTL/TTB visibility, skipCommit purge) while
answering expiry / availability from indexed columns rather than an
in-memory cache, and lighting up the SQL-only capabilities
(supportsSnapshots / supportsPathQueries / true transactions).
- Implemented types
Constructors
- SqliteAtKeyValueStore(SqliteDatabase _db, String atSign)
Properties
- atSign → String
-
The atSign owning this store — the
createdBy/updatedByaudit value the metadata builder stamps.final -
changes
→ Stream<
KeyStoreChange> -
Broadcast stream of
KeyStoreChangeevents — one per successful mutation that affects the key set or stored value. Late subscribers do not receive earlier events.no setteroverride - commitLog ↔ AtCommitLog?
-
The commit log for this keystore, or
nullif this is an un-synced (client-side) keystore.getter/setter pairoverride - hashCode → int
-
The hash code for this object.
no setterinherited
-
postRemoveHooks
→ List<
Future< void> Function(String key, {required bool skipCommit})> -
Hooks invoked synchronously after a single-key remove. Each
hook is awaited in order. Hook exceptions are propagated to
the caller after the remove has already happened.
final
-
preRemoveHooks
→ List<
Future< void> Function(String key, {required bool skipCommit})> -
Hooks invoked synchronously before a single-key remove. Each
hook is awaited in order; if a hook throws, the remove is
aborted and the exception propagates.
final
- runtimeType → Type
-
A representation of the runtime type of the object.
no setterinherited
- supportsPathQueries → bool
-
truewhen this keystore can push value-field predicates down to its native query plan (queryByPath is then a real indexed query).falsewhen queryByPath is unsupported and consumers must fall back to ascanKeys+ in-memory filter.no setteroverride - supportsSnapshots → bool
-
truewhen this keystore can produce real isolated snapshots (snapshot returns a handle whose reads observe the keystore's state at snapshot-creation time, ignoring concurrent writes).falsewhen the handle delegates to live state (Hive backends).no setteroverride
Methods
-
clear(
) → Future< void> - Drops all rows (keeping the connection open) for test isolation.
-
close(
) → Future< void> - No-op: the shared connection is closed by the bundle.
-
compact(
bool dryRun) → Stream< Object> -
Compact the keystore. The Hive impl delegates to its internal
commit log's compaction; a client-side bundle (no commit log)
is a no-op and yields nothing.
override
-
create(
String key, AtData value, {bool skipCommit = false}) → Future< int?> -
If no mapping exists for
key, associates it withvalueand returns the commit-log sequence number; otherwise behaviour is implementation-defined (typically throws).override -
deleteExpiredKeys(
) → Future< bool> -
Removes all expired keys. Deletes are local-only — they are
NOT appended to the commit log, so an expiry sweep never
advances the local
commitIdand never propagates to other secondaries via sync. Expiry is treated as backend maintenance, not a sync-worthy mutation; clients drop expired keys independently using their own TTL bookkeeping.override -
exists(
String key) → Future< bool> -
Returns
trueif the keystore currently containskey, elsefalse. The backend-agnostic existence check — the same call site works against every backend.override -
get(
String key) → Future< AtData?> -
Retrieves the value mapped to
key, ornullif no mapping exists. Implementations may also throw a backend-specific not-found exception (e.g.KeyNotFoundException) instead of returningnull— consult the concrete impl.override -
getExpiredKeys(
) → Future< Stream< String> > -
Streams all keys that have expired. The returned
Futurecompletes once the backend has accepted the request (surfacing any setup failure eagerly); theStreamthen yields the keys.override -
getKeys(
{String? regex}) → Future< Stream< String> > -
Streams the keys, optionally filtered by
regex. The returnedFuturecompletes once the backend has accepted the request — setup failures (store not open, invalidregex) reject theFutureeagerly rather than surfacing mid-stream; theStreamthen yields the matching keys.override -
getMany(
List< String> keys) → Future<Map< String, AtData> > -
Bulk fetch — returns the values for every key in
keysthat is currently present. Keys that are absent are NOT included in the returned map.override -
getMeta(
String key) → Future< AtMetaData?> -
Returns the metadata associated with
key.override -
initialize(
) → Future< void> -
Subclasses should put any necessary post-construction async
initialization in this method.
override
-
nextAvailableAt(
{DateTime? asOf}) → Future< DateTime?> -
Smallest non-null
availableAtamong entries that have not yet become available (availableAt > asOf,asOfdefaulting to now), ornullif there are none. Drives a TTB-sweep wake-up timer.override -
nextExpiresAt(
) → Future< DateTime?> -
Smallest non-null expiry instant across all entries, or
nullif no entry has one set. Drives expiry-cron wake-up: a caller can sleep until the returned time, then call peekExpired or deleteExpiredKeys to drain.override -
noSuchMethod(
Invocation invocation) → dynamic -
Invoked when a nonexistent method or property is accessed.
inherited
-
peekExpired(
{DateTime? asOf, int? limit}) → Future< Stream< String> > -
Up to
limitkeys whose expiry instant is at-or-beforeasOf(default: now), in ascending-expiry order.limit: 1answers "which key is next to expire".limit: nullmeans no limit — the same set as getExpiredKeys, but with guaranteed ascending-expiry ordering. Ties (same expiry instant) are yielded in implementation-defined order.override -
peekNewlyAvailable(
{required DateTime since, DateTime? asOf, int? limit}) → Future< Stream< String> > -
Up to
limitkeys whoseavailableAtis in(since, asOf]— keys that crossed the born threshold since the caller's last sweep watermark. Ascending-availableAtorder;asOfdefaults to now.override -
put(
String key, AtData value, {bool skipCommit = false}) → Future< int?> -
Associates
valuewithkey. If a mapping already exists, the old value is replaced.override -
putAll(
String key, AtData value, AtMetaData? metadata) → Future< int?> -
Writes
valueandmetadataforkeyatomically. Returns the commit-log sequence number assigned to this write, ornullif no sequence number was produced.override -
putMeta(
String key, AtMetaData? metadata) → Future< int?> -
Updates the metadata for
keywithout touching its value. Returns the commit-log sequence number assigned to this write, ornullif no sequence number was produced.override -
queryByPath(
{required KeyPattern keyPattern, required Predicate predicate, OrderByKey? orderBy, int? limit, int? skip}) → Stream< KeyEntry< String, AtData, AtMetaData?> > -
Stream every (key, value, metadata) entry matching
keyPatternANDpredicate. The predicate is evaluated against the value's JSON-shaped fields.override -
remove(
String key, {bool skipCommit = false}) → Future< int?> -
Removes the mapping for
keyif present.override -
removeMany(
List< String> keys, {bool skipCommit = false}) → Future<int> -
Bulk delete — removes every key in
keys. Returns the count of keys actually removed (race-tolerant: input keys may already have been deleted).override -
restore(
String key, AtData value) → Future< void> -
Write
valueforkeyverbatim — no AtMetadataBuilder pass, noversion/updatedAtmutation, no commit-log append, no change-event. The stored record is byte-for-byte whatvaluecarries (its data and its metadata).override -
scanKeys(
KeyPattern pattern, {bool includeExpired = false, OrderByKey? orderBy, int? limit, int? skip}) → Future< Stream< String> > -
Stream the keystore keys that match
pattern. Backend- portable successor to KeyValueStore.getKeys for callers that want structured filtering rather than building regular expressions.override -
snapshot(
) → Future< AtKeyValueStoreSnapshot< String, AtData, AtMetaData?> > -
Take a snapshot of the keystore's current state. Overrides
KeyValueStore.snapshot with the atKey-aware snapshot type
that surfaces AtKeyValueStoreSnapshot.scanKeys.
override
-
stats(
) → Future< KeyStoreStats> -
Diagnostic snapshot of the keystore's state — total counts,
TTL/TTB key counts, approximate size, oldest/newest
timestamps. Intended for operator dashboards, not for
runtime decisions on a hot path.
override
-
toString(
) → String -
A string representation of this object.
inherited
-
transaction<
R> (Future< R> body(KeyStoreTxn<String, AtData, dynamic> txn)) → Future<R> -
Run
bodyas a transaction. Mutations performed via the supplied handle are buffered in memory and applied in body order on successful completion; if the body throws, the buffer is dropped and the exception propagates.override
Operators
-
operator ==(
Object other) → bool -
The equality operator.
inherited
Constants
- maxKeyLength → const int
- maxKeyLengthWithoutCached → const int