1use crate::{KevyError, KevyResult};
10
11use kevy_store::ScoreBound;
12
13use crate::store::ensure_writable;
14use crate::store::{Store, commit_write, store_err};
15
16impl Store {
17 pub fn sismember(&self, key: &[u8], member: &[u8]) -> KevyResult<bool> {
21 self.wshard(key).store.sismember(key, member).map_err(store_err)
22 }
23
24 pub fn spop(&self, key: &[u8], count: usize) -> KevyResult<Vec<Vec<u8>>> {
33 ensure_writable(self)?;
34 let mut g = self.wshard(key);
35 let popped = g.store.spop(key, count).map_err(store_err)?;
36 if !popped.is_empty() {
37 commit_write(&mut g, &kevy_verbs::aof::spop_effect(key, &popped))?;
38 }
39 Ok(popped)
40 }
41
42 pub fn srandmember(&self, key: &[u8], count: usize) -> KevyResult<Vec<Vec<u8>>> {
45 self.wshard(key).store.srandmember(key, count).map_err(store_err)
46 }
47
48 pub fn zrank(&self, key: &[u8], member: &[u8]) -> KevyResult<Option<usize>> {
53 self.wshard(key).store.zrank(key, member).map_err(store_err)
54 }
55
56 pub fn zcount(&self, key: &[u8], min: f64, max: f64) -> KevyResult<usize> {
59 self.wshard(key)
60 .store
61 .zcount(key, ScoreBound::inclusive(min), ScoreBound::inclusive(max))
62 .map_err(store_err)
63 }
64
65 pub fn zpopmin(&self, key: &[u8], count: usize) -> KevyResult<Vec<(Vec<u8>, f64)>> {
68 ensure_writable(self)?;
69 let mut g = self.wshard(key);
70 let popped = g.store.zpopmin(key, count).map_err(store_err)?;
71 if !popped.is_empty() {
72 let count_str = format!("{count}");
73 commit_write(&mut g, &[b"ZPOPMIN", key, count_str.as_bytes()])?;
74 }
75 Ok(popped)
76 }
77
78 pub fn zremrangebyrank(&self, key: &[u8], start: i64, stop: i64) -> KevyResult<usize> {
82 ensure_writable(self)?;
83 let mut g = self.wshard(key);
84 let removed = g.store.zrem_range_by_rank(key, start, stop).map_err(store_err)?;
85 if removed > 0 {
86 let s = format!("{start}");
87 let e = format!("{stop}");
88 commit_write(&mut g, &[b"ZREMRANGEBYRANK", key, s.as_bytes(), e.as_bytes()])?;
89 }
90 Ok(removed)
91 }
92
93 pub fn zremrangebyscore(&self, key: &[u8], min: f64, max: f64) -> KevyResult<usize> {
96 ensure_writable(self)?;
97 let mut g = self.wshard(key);
98 let removed = g
99 .store
100 .zrem_range_by_score(key, ScoreBound::inclusive(min), ScoreBound::inclusive(max))
101 .map_err(store_err)?;
102 if removed > 0 {
103 let s = format!("{min}");
104 let e = format!("{max}");
105 commit_write(&mut g, &[b"ZREMRANGEBYSCORE", key, s.as_bytes(), e.as_bytes()])?;
106 }
107 Ok(removed)
108 }
109
110 pub fn zrev_range_by_score(
113 &self,
114 key: &[u8],
115 max: f64,
116 min: f64,
117 ) -> KevyResult<Vec<(Vec<u8>, f64)>> {
118 self.wshard(key)
119 .store
120 .zrev_range_by_score(key, ScoreBound::inclusive(min), ScoreBound::inclusive(max))
121 .map_err(store_err)
122 }
123
124 pub fn lset(&self, key: &[u8], idx: i64, value: &[u8]) -> KevyResult<()> {
130 ensure_writable(self)?;
131 let mut g = self.wshard(key);
132 g.store.lset(key, idx, value).map_err(store_err)?;
133 let i = format!("{idx}");
134 commit_write(&mut g, &[b"LSET", key, i.as_bytes(), value])?;
135 Ok(())
136 }
137
138 pub fn ltrim(&self, key: &[u8], start: i64, stop: i64) -> KevyResult<()> {
141 ensure_writable(self)?;
142 let mut g = self.wshard(key);
143 g.store.ltrim(key, start, stop).map_err(store_err)?;
144 let s = format!("{start}");
145 let e = format!("{stop}");
146 commit_write(&mut g, &[b"LTRIM", key, s.as_bytes(), e.as_bytes()])?;
147 Ok(())
148 }
149
150 pub fn rename(&self, src: &[u8], dst: &[u8]) -> KevyResult<bool> {
156 ensure_writable(self)?;
157 let mut g = self.wshard(src);
160 let outcome = g.store.rename(src, dst);
161 match outcome {
162 kevy_store::RenameOutcome::Renamed => {
163 commit_write(&mut g, &[b"RENAME", src, dst])?;
164 Ok(true)
165 }
166 kevy_store::RenameOutcome::NoSuchSrc => {
167 Err(KevyError::Store(kevy_store::StoreError::NoSuchKey))
168 }
169 kevy_store::RenameOutcome::DstExists => Ok(false),
170 }
171 }
172
173 pub fn renamenx(&self, src: &[u8], dst: &[u8]) -> KevyResult<bool> {
176 ensure_writable(self)?;
177 let mut g = self.wshard(src);
178 let outcome = g.store.rename_nx(src, dst);
179 match outcome {
180 kevy_store::RenameOutcome::Renamed => {
181 commit_write(&mut g, &[b"RENAMENX", src, dst])?;
182 Ok(true)
183 }
184 kevy_store::RenameOutcome::DstExists => Ok(false),
185 kevy_store::RenameOutcome::NoSuchSrc => {
186 Err(KevyError::Store(kevy_store::StoreError::NoSuchKey))
187 }
188 }
189 }
190}