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 let mut argv: Vec<&[u8]> = Vec::with_capacity(2 + popped.len());
38 argv.push(b"SREM");
39 argv.push(key);
40 argv.extend(popped.iter().map(Vec::as_slice));
41 commit_write(&mut g, &argv)?;
42 }
43 Ok(popped)
44 }
45
46 pub fn srandmember(&self, key: &[u8], count: usize) -> KevyResult<Vec<Vec<u8>>> {
49 self.wshard(key).store.srandmember(key, count).map_err(store_err)
50 }
51
52 pub fn zrank(&self, key: &[u8], member: &[u8]) -> KevyResult<Option<usize>> {
57 self.wshard(key).store.zrank(key, member).map_err(store_err)
58 }
59
60 pub fn zcount(&self, key: &[u8], min: f64, max: f64) -> KevyResult<usize> {
63 self.wshard(key)
64 .store
65 .zcount(
66 key,
67 ScoreBound { value: min, exclusive: false },
68 ScoreBound { value: max, exclusive: false },
69 )
70 .map_err(store_err)
71 }
72
73 pub fn zpopmin(&self, key: &[u8], count: usize) -> KevyResult<Vec<(Vec<u8>, f64)>> {
76 ensure_writable(self)?;
77 let mut g = self.wshard(key);
78 let popped = g.store.zpopmin(key, count).map_err(store_err)?;
79 if !popped.is_empty() {
80 let count_str = format!("{count}");
81 commit_write(&mut g, &[b"ZPOPMIN", key, count_str.as_bytes()])?;
82 }
83 Ok(popped)
84 }
85
86 pub fn zremrangebyrank(
90 &self,
91 key: &[u8],
92 start: i64,
93 stop: i64,
94 ) -> KevyResult<usize> {
95 ensure_writable(self)?;
96 let mut g = self.wshard(key);
97 let removed = g.store.zrem_range_by_rank(key, start, stop).map_err(store_err)?;
98 if removed > 0 {
99 let s = format!("{start}");
100 let e = format!("{stop}");
101 commit_write(&mut g, &[b"ZREMRANGEBYRANK", key, s.as_bytes(), e.as_bytes()])?;
102 }
103 Ok(removed)
104 }
105
106 pub fn zremrangebyscore(
109 &self,
110 key: &[u8],
111 min: f64,
112 max: f64,
113 ) -> KevyResult<usize> {
114 ensure_writable(self)?;
115 let mut g = self.wshard(key);
116 let removed = g
117 .store
118 .zrem_range_by_score(
119 key,
120 ScoreBound { value: min, exclusive: false },
121 ScoreBound { value: max, exclusive: false },
122 )
123 .map_err(store_err)?;
124 if removed > 0 {
125 let s = format!("{min}");
126 let e = format!("{max}");
127 commit_write(&mut g, &[b"ZREMRANGEBYSCORE", key, s.as_bytes(), e.as_bytes()])?;
128 }
129 Ok(removed)
130 }
131
132 pub fn zrev_range_by_score(
135 &self,
136 key: &[u8],
137 max: f64,
138 min: f64,
139 ) -> KevyResult<Vec<(Vec<u8>, f64)>> {
140 self.wshard(key)
141 .store
142 .zrev_range_by_score(
143 key,
144 ScoreBound { value: min, exclusive: false },
145 ScoreBound { value: max, exclusive: false },
146 )
147 .map_err(store_err)
148 }
149
150 pub fn lset(&self, key: &[u8], idx: i64, value: &[u8]) -> KevyResult<()> {
156 ensure_writable(self)?;
157 let mut g = self.wshard(key);
158 g.store.lset(key, idx, value).map_err(store_err)?;
159 let i = format!("{idx}");
160 commit_write(&mut g, &[b"LSET", key, i.as_bytes(), value])?;
161 Ok(())
162 }
163
164 pub fn ltrim(&self, key: &[u8], start: i64, stop: i64) -> KevyResult<()> {
167 ensure_writable(self)?;
168 let mut g = self.wshard(key);
169 g.store.ltrim(key, start, stop).map_err(store_err)?;
170 let s = format!("{start}");
171 let e = format!("{stop}");
172 commit_write(&mut g, &[b"LTRIM", key, s.as_bytes(), e.as_bytes()])?;
173 Ok(())
174 }
175
176 pub fn rename(&self, src: &[u8], dst: &[u8]) -> KevyResult<bool> {
182 ensure_writable(self)?;
183 let mut g = self.wshard(src);
186 let outcome = g.store.rename(src, dst, false);
187 match outcome {
188 kevy_store::RenameOutcome::Renamed => {
189 commit_write(&mut g, &[b"RENAME", src, dst])?;
190 Ok(true)
191 }
192 kevy_store::RenameOutcome::NoSuchSrc => {
193 Err(KevyError::Store(kevy_store::StoreError::NoSuchKey))
194 }
195 kevy_store::RenameOutcome::DstExists => Ok(false),
196 }
197 }
198
199 pub fn renamenx(&self, src: &[u8], dst: &[u8]) -> KevyResult<bool> {
202 ensure_writable(self)?;
203 let mut g = self.wshard(src);
204 let outcome = g.store.rename(src, dst, true);
205 match outcome {
206 kevy_store::RenameOutcome::Renamed => {
207 commit_write(&mut g, &[b"RENAMENX", src, dst])?;
208 Ok(true)
209 }
210 kevy_store::RenameOutcome::DstExists => Ok(false),
211 kevy_store::RenameOutcome::NoSuchSrc => {
212 Err(KevyError::Store(kevy_store::StoreError::NoSuchKey))
213 }
214 }
215 }
216}