use std::io;
use crate::store::{Store, store_err};
impl Store {
pub fn scan(
&self,
cursor: u64,
pattern: Option<&[u8]>,
count: usize,
) -> (u64, Vec<Vec<u8>>) {
let all = self.collect_keys(pattern, None);
page_into(all, cursor, count)
}
pub fn keys_iter(&self, pattern: Option<&[u8]>) -> std::vec::IntoIter<Vec<u8>> {
self.collect_keys(pattern, None).into_iter()
}
pub fn hscan(
&self,
key: &[u8],
cursor: u64,
count: usize,
) -> io::Result<(u64, Vec<(Vec<u8>, Vec<u8>)>)> {
let pairs = self.hgetall(key)?;
Ok(page_into(pairs, cursor, count))
}
pub fn hash_iter(
&self,
key: &[u8],
) -> io::Result<std::vec::IntoIter<(Vec<u8>, Vec<u8>)>> {
Ok(self.hgetall(key)?.into_iter())
}
pub fn zscan(
&self,
key: &[u8],
cursor: u64,
count: usize,
) -> io::Result<(u64, Vec<(Vec<u8>, f64)>)> {
let pairs = self
.wshard(key)
.store
.zrange(key, 0, -1)
.map_err(store_err)?;
Ok(page_into(pairs, cursor, count))
}
pub fn zset_iter(
&self,
key: &[u8],
) -> io::Result<std::vec::IntoIter<(Vec<u8>, f64)>> {
let pairs = self
.wshard(key)
.store
.zrange(key, 0, -1)
.map_err(store_err)?;
Ok(pairs.into_iter())
}
}
fn page_into<T>(data: Vec<T>, cursor: u64, count: usize) -> (u64, Vec<T>) {
let total = data.len();
let start = (cursor as usize).min(total);
let end = start.saturating_add(count).min(total);
let batch = data.into_iter().skip(start).take(end - start).collect();
let next_cursor = if end >= total { 0 } else { end as u64 };
(next_cursor, batch)
}