Skip to main content

kevy_embedded/
ops_atomic_all_reads.rs

1//! Collection reads for [`AtomicAllShards`]. Split from
2//! `ops_atomic_all.rs` for the 500-LOC house rule; the single-shard
3//! twins live on `AtomicCtx` in `ops_atomic.rs`.
4//!
5//! A consumer reshaped an entire keyspace from sets to hashes because a
6//! set could be written inside a transaction but never read back inside
7//! one. These hold the shard write lock already, so there was never a
8//! consistency reason to withhold them.
9
10use super::AtomicAllShards;
11use crate::KevyResult;
12use crate::store_glue::store_err;
13
14impl AtomicAllShards<'_> {
15    // ---- collection reads --------------------------------------------
16    // Mirror of `AtomicCtx`'s — see the note there. The parity manifests
17    // below are checked by a test because these two ctxs drifted before.
18
19    /// `SMEMBERS key`.
20    pub fn smembers(&mut self, key: &[u8]) -> KevyResult<Vec<Vec<u8>>> {
21        let i = self.idx(key);
22        self.guards[i].store.smembers(key).map_err(store_err)
23    }
24
25    /// `SISMEMBER key member`.
26    pub fn sismember(&mut self, key: &[u8], member: &[u8]) -> KevyResult<bool> {
27        let i = self.idx(key);
28        self.guards[i].store.sismember(key, member).map_err(store_err)
29    }
30
31    /// `LRANGE key start stop`.
32    pub fn lrange(&mut self, key: &[u8], start: i64, stop: i64) -> KevyResult<Vec<Vec<u8>>> {
33        let i = self.idx(key);
34        self.guards[i].store.lrange(key, start, stop).map_err(store_err)
35    }
36
37    /// `LLEN key`.
38    pub fn llen(&mut self, key: &[u8]) -> KevyResult<usize> {
39        let i = self.idx(key);
40        self.guards[i].store.llen(key).map_err(store_err)
41    }
42
43    /// `SCARD key`.
44    pub fn scard(&mut self, key: &[u8]) -> KevyResult<usize> {
45        let i = self.idx(key);
46        self.guards[i].store.scard(key).map_err(store_err)
47    }
48
49    /// `ZRANGEBYSCORE key min max`.
50    pub fn zrangebyscore(
51        &mut self,
52        key: &[u8],
53        min: kevy_store::ScoreBound,
54        max: kevy_store::ScoreBound,
55    ) -> KevyResult<Vec<(Vec<u8>, f64)>> {
56        let i = self.idx(key);
57        self.guards[i].store.zrange_by_score(key, min, max).map_err(store_err)
58    }
59
60}