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 hvals(&self, key: &[u8]) -> KevyResult<Vec<Vec<u8>>> {
48 self.wshard(key).store.hvals(key).map_err(store_err)
49 }
50
51 pub fn hmget(&self, key: &[u8], fields: &[&[u8]]) -> KevyResult<Vec<Option<Vec<u8>>>> {
54 self.wshard(key).store.hmget(key, fields).map_err(store_err)
55 }
56
57 pub fn hincrby(&self, key: &[u8], field: &[u8], delta: i64) -> KevyResult<i64> {
60 ensure_writable(self)?;
61 let mut g = self.wshard(key);
62 let new_val = g.store.hincrby(key, field, delta).map_err(store_err)?;
63 let delta_str = format!("{delta}");
64 commit_write(&mut g, &[b"HINCRBY", key, field, delta_str.as_bytes()])?;
65 Ok(new_val)
66 }
67
68 pub fn zrange(&self, key: &[u8], start: i64, stop: i64) -> KevyResult<Vec<(Vec<u8>, f64)>> {
75 self.wshard(key).store.zrange(key, start, stop).map_err(store_err)
76 }
77
78 pub fn zrevrange(&self, key: &[u8], start: i64, stop: i64) -> KevyResult<Vec<(Vec<u8>, f64)>> {
82 self.wshard(key).store.zrevrange(key, start, stop).map_err(store_err)
83 }
84
85 pub fn zrange_by_score(
91 &self,
92 key: &[u8],
93 min: f64,
94 max: f64,
95 ) -> KevyResult<Vec<(Vec<u8>, f64)>> {
96 self.wshard(key)
97 .store
98 .zrange_by_score(
99 key,
100 ScoreBound { value: min, exclusive: false },
101 ScoreBound { value: max, exclusive: false },
102 )
103 .map_err(store_err)
104 }
105
106 pub fn zrange_by_score_excl(
110 &self,
111 key: &[u8],
112 min: ScoreBound,
113 max: ScoreBound,
114 ) -> KevyResult<Vec<(Vec<u8>, f64)>> {
115 self.wshard(key).store.zrange_by_score(key, min, max).map_err(store_err)
116 }
117
118 pub fn zrange_by_score_limit(
122 &self,
123 key: &[u8],
124 min: f64,
125 max: f64,
126 offset: usize,
127 count: usize,
128 ) -> KevyResult<Vec<(Vec<u8>, f64)>> {
129 let all = self.zrange_by_score(key, min, max)?;
130 Ok(all.into_iter().skip(offset).take(count).collect())
131 }
132
133 pub fn zrevrange_by_score_limit(
136 &self,
137 key: &[u8],
138 max: f64,
139 min: f64,
140 offset: usize,
141 count: usize,
142 ) -> KevyResult<Vec<(Vec<u8>, f64)>> {
143 let mut all = self.zrange_by_score(key, min, max)?;
144 all.reverse();
145 Ok(all.into_iter().skip(offset).take(count).collect())
146 }
147
148 pub fn zpopmin_below(
152 &self,
153 key: &[u8],
154 below: f64,
155 count: usize,
156 ) -> KevyResult<Vec<(Vec<u8>, f64)>> {
157 ensure_writable(self)?;
158 let mut g = self.wshard(key);
159 let items = g.store.zpopmin_below(key, below, count).map_err(store_err)?;
160 if !items.is_empty() {
161 let mut argv: Vec<&[u8]> = Vec::with_capacity(2 + items.len());
162 argv.push(b"ZREM");
163 argv.push(key);
164 argv.extend(items.iter().map(|(m, _)| m.as_slice()));
165 commit_write(&mut g, &argv)?;
166 }
167 Ok(items)
168 }
169
170 pub fn zincrby(&self, key: &[u8], delta: f64, member: &[u8]) -> KevyResult<f64> {
173 ensure_writable(self)?;
174 let mut g = self.wshard(key);
175 let new_score = g.store.zincrby(key, delta, member).map_err(store_err)?;
176 let delta_str = format!("{delta}");
177 commit_write(&mut g, &[b"ZINCRBY", key, delta_str.as_bytes(), member])?;
178 Ok(new_score)
179 }
180
181 pub fn lrange(&self, key: &[u8], start: i64, stop: i64) -> KevyResult<Vec<Vec<u8>>> {
186 self.wshard(key).store.lrange(key, start, stop).map_err(store_err)
187 }
188
189 pub fn lindex(&self, key: &[u8], idx: i64) -> KevyResult<Option<Vec<u8>>> {
191 self.wshard(key).store.lindex(key, idx).map_err(store_err)
192 }
193
194 pub fn lrem(&self, key: &[u8], count: i64, value: &[u8]) -> KevyResult<usize> {
198 ensure_writable(self)?;
199 let mut g = self.wshard(key);
200 let removed = g.store.lrem(key, count, value).map_err(store_err)?;
201 if removed > 0 {
202 let count_str = format!("{count}");
203 commit_write(&mut g, &[b"LREM", key, count_str.as_bytes(), value])?;
204 }
205 Ok(removed)
206 }
207
208 pub fn getset(&self, key: &[u8], new: &[u8]) -> KevyResult<Option<Vec<u8>>> {
213 ensure_writable(self)?;
214 let mut g = self.wshard(key);
215 let prev = g.store.getset(key, new.to_vec()).map_err(store_err)?;
216 commit_write(&mut g, &[b"SET", key, new])?;
217 Ok(prev)
218 }
219
220 pub fn getdel(&self, key: &[u8]) -> KevyResult<Option<Vec<u8>>> {
223 ensure_writable(self)?;
224 let mut g = self.wshard(key);
225 let prev = g.store.getdel(key).map_err(store_err)?;
226 if prev.is_some() {
227 commit_write(&mut g, &[b"DEL", key])?;
228 }
229 Ok(prev)
230 }
231}