use crate::{
api::hash::{
HashFieldPair, HashRandField, HashScanResult,
conf::{
HExpire, HGetEx, HSetEx, HashFetchType, HashGetExOptions, HashLengthMode, HashSetExOptions,
RangeLexSpec,
},
},
error::Result,
traits::DbLike,
};
pub trait Hash: DbLike {
fn hget<K: AsRef<[u8]>, F: AsRef<[u8]>>(&self, key: K, field: F) -> Result<Option<Vec<u8>>>;
fn hset<K: AsRef<[u8]>, F: AsRef<[u8]>, V: AsRef<[u8]>>(
&self,
key: K,
fields: &[(F, V)],
) -> Result<usize>;
fn hdel<K: AsRef<[u8]>, F: AsRef<[u8]>>(&self, key: K, fields: &[F]) -> Result<usize>;
fn hexists<K: AsRef<[u8]>, F: AsRef<[u8]>>(&self, key: K, field: F) -> Result<bool>;
fn hlen<K: AsRef<[u8]>>(&self, key: K) -> Result<usize>;
fn hlen_with_mode<K: AsRef<[u8]>>(&self, key: K, mode: HashLengthMode) -> Result<usize>;
fn hgetall<K: AsRef<[u8]>>(&self, key: K) -> Result<Vec<(Vec<u8>, Vec<u8>)>>;
fn hget_all_with_type<K: AsRef<[u8]>>(
&self,
key: K,
fetch_type: HashFetchType,
) -> Result<Vec<(Vec<u8>, Vec<u8>)>>;
fn hkeys<K: AsRef<[u8]>>(&self, key: K) -> Result<Vec<Vec<u8>>>;
fn hvals<K: AsRef<[u8]>>(&self, key: K) -> Result<Vec<Vec<u8>>>;
fn hincrby<K: AsRef<[u8]>, F: AsRef<[u8]>>(&self, key: K, field: F, step: i64) -> Result<i64>;
fn hincrbyfloat<K: AsRef<[u8]>, F: AsRef<[u8]>>(
&self,
key: K,
field: F,
step: f64,
) -> Result<f64>;
fn hmget<K: AsRef<[u8]>, F: AsRef<[u8]>>(
&self,
key: K,
fields: &[F],
) -> Result<Vec<Option<Vec<u8>>>>;
fn hmset<K: AsRef<[u8]>, F: AsRef<[u8]>, V: AsRef<[u8]>>(
&self,
key: K,
fields: &[(F, V)],
) -> Result<()>;
fn hstrlen<K: AsRef<[u8]>, F: AsRef<[u8]>>(&self, key: K, field: F) -> Result<usize>;
fn hiter<K: AsRef<[u8]>, F>(&self, key: K, f: F) -> Result<()>
where
F: FnMut(&[u8], &[u8]) -> bool;
fn hsetnx<K: AsRef<[u8]>, F: AsRef<[u8]>, V: AsRef<[u8]>>(
&self,
key: K,
field: F,
val: V,
) -> Result<bool>;
fn hrandfield<K: AsRef<[u8]>>(
&self,
key: K,
count: i64,
with_values: bool,
) -> Result<Vec<HashRandField>>;
fn hscan<K: AsRef<[u8]>>(
&self,
key: K,
cursor: usize,
limit: usize,
pattern: Option<&[u8]>,
) -> Result<HashScanResult>;
fn hexpire<K: AsRef<[u8]>, F: AsRef<[u8]>>(
&self,
key: K,
fields: &[F],
seconds: i64,
condition: HExpire,
) -> Result<Vec<i64>>;
fn hpexpire<K: AsRef<[u8]>, F: AsRef<[u8]>>(
&self,
key: K,
fields: &[F],
milliseconds: i64,
condition: HExpire,
) -> Result<Vec<i64>>;
fn hexpireat<K: AsRef<[u8]>, F: AsRef<[u8]>>(
&self,
key: K,
fields: &[F],
unix_time_sec: u64,
condition: HExpire,
) -> Result<Vec<i64>>;
fn hpexpireat<K: AsRef<[u8]>, F: AsRef<[u8]>>(
&self,
key: K,
fields: &[F],
unix_time_ms: u64,
condition: HExpire,
) -> Result<Vec<i64>>;
fn expire_fields<K: AsRef<[u8]>, F: AsRef<[u8]>>(
&self,
key: K,
fields: &[F],
expire_at_ms: u64,
condition: HExpire,
now_ms: u64,
) -> Result<Vec<i64>>;
fn httl<K: AsRef<[u8]>, F: AsRef<[u8]>>(&self, key: K, fields: &[F]) -> Result<Vec<i64>>;
fn hpttl<K: AsRef<[u8]>, F: AsRef<[u8]>>(&self, key: K, fields: &[F]) -> Result<Vec<i64>>;
fn hexpiretime<K: AsRef<[u8]>, F: AsRef<[u8]>>(&self, key: K, fields: &[F]) -> Result<Vec<i64>>;
fn hpexpiretime<K: AsRef<[u8]>, F: AsRef<[u8]>>(&self, key: K, fields: &[F]) -> Result<Vec<i64>>;
fn hpersist<K: AsRef<[u8]>, F: AsRef<[u8]>>(&self, key: K, fields: &[F]) -> Result<Vec<i64>>;
fn hgetdel<K: AsRef<[u8]>, F: AsRef<[u8]>>(
&self,
key: K,
fields: &[F],
) -> Result<Vec<Option<Vec<u8>>>>;
fn hsetex<K: AsRef<[u8]>, F: AsRef<[u8]>, V: AsRef<[u8]>>(
&self,
key: K,
field_vals: &[(F, V)],
flags: &[HSetEx],
) -> Result<bool>;
fn set_fields_with_expire<K: AsRef<[u8]>, F: AsRef<[u8]>, V: AsRef<[u8]>>(
&self,
key: K,
field_values: &[(F, V)],
options: HashSetExOptions,
) -> Result<bool>;
fn hgetex<K: AsRef<[u8]>, F: AsRef<[u8]>>(
&self,
key: K,
field: F,
flag: Option<HGetEx>,
) -> Result<Option<Vec<u8>>>;
fn get_fields_with_expire<K: AsRef<[u8]>, F: AsRef<[u8]>>(
&self,
key: K,
fields: &[F],
options: HashGetExOptions,
) -> Result<Vec<Option<Vec<u8>>>>;
fn hrangebylex<K: AsRef<[u8]>>(&self, key: K, spec: RangeLexSpec) -> Result<Vec<HashFieldPair>>;
}