1use crate::KevyResult;
9
10use kevy_store::ScoreBound;
11
12use crate::store::ensure_writable;
13use crate::store::{Store, commit_write, store_err};
14
15impl Store {
16 pub fn hgetall(&self, key: &[u8]) -> KevyResult<Vec<(Vec<u8>, Vec<u8>)>> {
21 let flat = self.wshard(key).store.hgetall(key).map_err(store_err)?;
22 let mut out = Vec::with_capacity(flat.len() / 2);
24 let mut it = flat.into_iter();
25 while let (Some(f), Some(v)) = (it.next(), it.next()) {
26 out.push((f, v));
27 }
28 Ok(out)
29 }
30
31 pub fn hexists(&self, key: &[u8], field: &[u8]) -> KevyResult<bool> {
33 self.wshard(key).store.hexists(key, field).map_err(store_err)
34 }
35
36 pub fn hlen(&self, key: &[u8]) -> KevyResult<usize> {
38 self.wshard(key).store.hlen(key).map_err(store_err)
39 }
40
41 pub fn hkeys(&self, key: &[u8]) -> KevyResult<Vec<Vec<u8>>> {
43 self.wshard(key).store.hkeys(key).map_err(store_err)
44 }
45
46 pub fn hrandfield(
49 &self,
50 key: &[u8],
51 count: i64,
52 with_values: bool,
53 ) -> KevyResult<kevy_store::FieldValuePairs> {
54 self.wshard(key).store.hrandfield(key, count, with_values).map_err(store_err)
55 }
56
57 pub fn hvals(&self, key: &[u8]) -> KevyResult<Vec<Vec<u8>>> {
59 self.wshard(key).store.hvals(key).map_err(store_err)
60 }
61
62 pub fn hmget(&self, key: &[u8], fields: &[&[u8]]) -> KevyResult<Vec<Option<Vec<u8>>>> {
65 self.wshard(key).store.hmget(key, fields).map_err(store_err)
66 }
67
68 pub fn hincrby(&self, key: &[u8], field: &[u8], delta: i64) -> KevyResult<i64> {
71 ensure_writable(self)?;
72 let mut g = self.wshard(key);
73 let new_val = g.store.hincrby(key, field, delta).map_err(store_err)?;
74 let delta_str = format!("{delta}");
75 commit_write(&mut g, &[b"HINCRBY", key, field, delta_str.as_bytes()])?;
76 Ok(new_val)
77 }
78
79 pub fn zrange(&self, key: &[u8], start: i64, stop: i64) -> KevyResult<Vec<(Vec<u8>, f64)>> {
86 self.wshard(key).store.zrange(key, start, stop).map_err(store_err)
87 }
88
89 pub fn zrevrange(&self, key: &[u8], start: i64, stop: i64) -> KevyResult<Vec<(Vec<u8>, f64)>> {
93 self.wshard(key).store.zrevrange(key, start, stop).map_err(store_err)
94 }
95
96 pub fn zrange_by_score(
102 &self,
103 key: &[u8],
104 min: f64,
105 max: f64,
106 ) -> KevyResult<Vec<(Vec<u8>, f64)>> {
107 self.wshard(key)
108 .store
109 .zrange_by_score(
110 key,
111 ScoreBound { value: min, exclusive: false },
112 ScoreBound { value: max, exclusive: false },
113 )
114 .map_err(store_err)
115 }
116
117 pub fn zrange_by_score_excl(
121 &self,
122 key: &[u8],
123 min: ScoreBound,
124 max: ScoreBound,
125 ) -> KevyResult<Vec<(Vec<u8>, f64)>> {
126 self.wshard(key).store.zrange_by_score(key, min, max).map_err(store_err)
127 }
128
129 pub fn zrange_by_score_limit(
133 &self,
134 key: &[u8],
135 min: f64,
136 max: f64,
137 offset: usize,
138 count: usize,
139 ) -> KevyResult<Vec<(Vec<u8>, f64)>> {
140 let all = self.zrange_by_score(key, min, max)?;
141 Ok(all.into_iter().skip(offset).take(count).collect())
142 }
143
144 pub fn zrevrange_by_score_limit(
147 &self,
148 key: &[u8],
149 max: f64,
150 min: f64,
151 offset: usize,
152 count: usize,
153 ) -> KevyResult<Vec<(Vec<u8>, f64)>> {
154 let mut all = self.zrange_by_score(key, min, max)?;
155 all.reverse();
156 Ok(all.into_iter().skip(offset).take(count).collect())
157 }
158
159 pub fn zpopmin_below(
163 &self,
164 key: &[u8],
165 below: f64,
166 count: usize,
167 ) -> KevyResult<Vec<(Vec<u8>, f64)>> {
168 ensure_writable(self)?;
169 let mut g = self.wshard(key);
170 let items = g.store.zpopmin_below(key, below, count).map_err(store_err)?;
171 if !items.is_empty() {
172 let mut argv: Vec<&[u8]> = Vec::with_capacity(2 + items.len());
173 argv.push(b"ZREM");
174 argv.push(key);
175 argv.extend(items.iter().map(|(m, _)| m.as_slice()));
176 commit_write(&mut g, &argv)?;
177 }
178 Ok(items)
179 }
180
181 pub fn zincrby(&self, key: &[u8], delta: f64, member: &[u8]) -> KevyResult<f64> {
184 ensure_writable(self)?;
185 let mut g = self.wshard(key);
186 let new_score = g.store.zincrby(key, delta, member).map_err(store_err)?;
187 let delta_str = format!("{delta}");
188 commit_write(&mut g, &[b"ZINCRBY", key, delta_str.as_bytes(), member])?;
189 Ok(new_score)
190 }
191
192 pub fn lrange(&self, key: &[u8], start: i64, stop: i64) -> KevyResult<Vec<Vec<u8>>> {
197 self.wshard(key).store.lrange(key, start, stop).map_err(store_err)
198 }
199
200 pub fn lindex(&self, key: &[u8], idx: i64) -> KevyResult<Option<Vec<u8>>> {
202 self.wshard(key).store.lindex(key, idx).map_err(store_err)
203 }
204
205 pub fn lrem(&self, key: &[u8], count: i64, value: &[u8]) -> KevyResult<usize> {
209 ensure_writable(self)?;
210 let mut g = self.wshard(key);
211 let removed = g.store.lrem(key, count, value).map_err(store_err)?;
212 if removed > 0 {
213 let count_str = format!("{count}");
214 commit_write(&mut g, &[b"LREM", key, count_str.as_bytes(), value])?;
215 }
216 Ok(removed)
217 }
218
219 pub fn getset(&self, key: &[u8], new: &[u8]) -> KevyResult<Option<Vec<u8>>> {
224 ensure_writable(self)?;
225 let mut g = self.wshard(key);
226 let prev = g.store.getset(key, new.to_vec()).map_err(store_err)?;
227 commit_write(&mut g, &[b"SET", key, new])?;
228 Ok(prev)
229 }
230
231 pub fn getdel(&self, key: &[u8]) -> KevyResult<Option<Vec<u8>>> {
234 ensure_writable(self)?;
235 let mut g = self.wshard(key);
236 let prev = g.store.getdel(key).map_err(store_err)?;
237 if prev.is_some() {
238 commit_write(&mut g, &[b"DEL", key])?;
239 }
240 Ok(prev)
241 }
242}