shardmap 0.3.1

Sharded embedded in-memory map with optional cache, protocol, and server internals
Documentation
use super::super::*;
use super::access::RedisObjectStoreAccess;
use crate::storage::{
    HashFieldExpireCond, HashFieldGetExpireAction, HashFieldSetCondition, HashFieldSetExpireAction,
};

#[allow(dead_code)]
pub(crate) trait RedisHashStore {
    fn hset(&self, key: &[u8], field: &[u8], value: &[u8]) -> RedisObjectResult;
    fn hset_many(&self, key: &[u8], fields: &[(&[u8], &[u8])]) -> RedisObjectResult;
    fn hget(&self, key: &[u8], field: &[u8]) -> RedisObjectResult;
    fn hexists(&self, key: &[u8], field: &[u8]) -> RedisObjectResult;
    fn hdel(&self, key: &[u8], field: &[u8]) -> RedisObjectResult;
    fn hdel_many(&self, key: &[u8], fields: &[&[u8]]) -> RedisObjectResult;
    fn hgetdel(&self, key: &[u8], fields: &[&[u8]]) -> RedisObjectResult;
    fn hgetex(
        &self,
        key: &[u8],
        fields: &[&[u8]],
        action: HashFieldGetExpireAction,
    ) -> RedisObjectResult;
    fn hsetex(
        &self,
        key: &[u8],
        fields: &[(&[u8], &[u8])],
        condition: HashFieldSetCondition,
        action: HashFieldSetExpireAction,
    ) -> RedisObjectResult;
    fn hlen(&self, key: &[u8]) -> RedisObjectResult;
    fn hmget(&self, key: &[u8], fields: &[&[u8]]) -> RedisObjectResult;
    fn hmget_visit(
        &self,
        key: &[u8],
        fields: &[&[u8]],
        emit: impl FnMut(RedisObjectArrayItem<'_>),
    ) -> RedisObjectReadOutcome;
    fn hkeys(&self, key: &[u8]) -> RedisObjectResult;
    fn hvals(&self, key: &[u8]) -> RedisObjectResult;
    fn hkeys_visit(
        &self,
        key: &[u8],
        emit: impl FnMut(RedisObjectArrayItem<'_>),
    ) -> RedisObjectReadOutcome;
    fn hvals_visit(
        &self,
        key: &[u8],
        emit: impl FnMut(RedisObjectArrayItem<'_>),
    ) -> RedisObjectReadOutcome;
    fn hgetall(&self, key: &[u8]) -> RedisObjectResult;
    fn hgetall_visit(
        &self,
        key: &[u8],
        emit: impl FnMut(RedisObjectArrayItem<'_>),
    ) -> RedisObjectReadOutcome;
    fn hsetnx(&self, key: &[u8], field: &[u8], value: &[u8]) -> RedisObjectResult;
    fn hincrby(&self, key: &[u8], field: &[u8], delta: i64) -> RedisObjectResult;
    fn hincrbyfloat(&self, key: &[u8], field: &[u8], delta: f64) -> RedisObjectResult;
    fn hrandfield(&self, key: &[u8], count: Option<i64>, with_values: bool) -> RedisObjectResult;
    fn hset_hashed(
        &self,
        key_hash: u64,
        key: &[u8],
        field: &[u8],
        value: &[u8],
    ) -> RedisObjectResult;
    fn hash_field_expire(
        &self,
        key: &[u8],
        fields: &[&[u8]],
        expire_at_ms: u64,
        cond: HashFieldExpireCond,
    ) -> RedisObjectResult;
    fn hash_field_ttl_query(
        &self,
        key: &[u8],
        fields: &[&[u8]],
        as_millis: bool,
        absolute: bool,
    ) -> RedisObjectResult;
    fn hash_field_persist(&self, key: &[u8], fields: &[&[u8]]) -> RedisObjectResult;
}

impl RedisHashStore for EmbeddedStore {
    fn hset(&self, key: &[u8], field: &[u8], value: &[u8]) -> RedisObjectResult {
        self.hset_hashed(hash_key(key), key, field, value)
    }

    fn hset_many(&self, key: &[u8], fields: &[(&[u8], &[u8])]) -> RedisObjectResult {
        self.object_write(key, |bucket| bucket.hset_many(key, fields))
    }

    fn hget(&self, key: &[u8], field: &[u8]) -> RedisObjectResult {
        self.object_read(key, |bucket| bucket.hget(key, field))
    }

    fn hexists(&self, key: &[u8], field: &[u8]) -> RedisObjectResult {
        self.object_read(key, |bucket| bucket.hexists(key, field))
    }

    fn hdel(&self, key: &[u8], field: &[u8]) -> RedisObjectResult {
        self.object_write(key, |bucket| bucket.hdel(key, field))
    }

    fn hdel_many(&self, key: &[u8], fields: &[&[u8]]) -> RedisObjectResult {
        self.object_write(key, |bucket| bucket.hdel_many(key, fields))
    }

    fn hgetdel(&self, key: &[u8], fields: &[&[u8]]) -> RedisObjectResult {
        let now_ms = now_millis();
        self.object_write(key, |bucket| bucket.hash_field_getdel(key, fields, now_ms))
    }

    fn hgetex(
        &self,
        key: &[u8],
        fields: &[&[u8]],
        action: HashFieldGetExpireAction,
    ) -> RedisObjectResult {
        let now_ms = now_millis();
        self.object_write(key, |bucket| {
            bucket.hash_field_getex(key, fields, action, now_ms)
        })
    }

    fn hsetex(
        &self,
        key: &[u8],
        fields: &[(&[u8], &[u8])],
        condition: HashFieldSetCondition,
        action: HashFieldSetExpireAction,
    ) -> RedisObjectResult {
        let now_ms = now_millis();
        self.object_write(key, |bucket| {
            bucket.hash_field_setex(key, fields, condition, action, now_ms)
        })
    }

    fn hlen(&self, key: &[u8]) -> RedisObjectResult {
        self.object_read(key, |bucket| bucket.hlen(key))
    }

    fn hmget(&self, key: &[u8], fields: &[&[u8]]) -> RedisObjectResult {
        self.object_read(key, |bucket| bucket.hmget(key, fields))
    }

    fn hmget_visit(
        &self,
        key: &[u8],
        fields: &[&[u8]],
        mut emit: impl FnMut(RedisObjectArrayItem<'_>),
    ) -> RedisObjectReadOutcome {
        self.object_read_hashed_visit(hash_key(key), key, |bucket| {
            bucket.hmget_visit(key, fields, &mut emit)
        })
    }

    fn hkeys(&self, key: &[u8]) -> RedisObjectResult {
        self.object_read(key, |bucket| bucket.hkeys(key))
    }

    fn hvals(&self, key: &[u8]) -> RedisObjectResult {
        self.object_read(key, |bucket| bucket.hvals(key))
    }

    fn hkeys_visit(
        &self,
        key: &[u8],
        mut emit: impl FnMut(RedisObjectArrayItem<'_>),
    ) -> RedisObjectReadOutcome {
        self.object_read_hashed_visit(hash_key(key), key, |bucket| {
            bucket.hkeys_visit(key, &mut emit)
        })
    }

    fn hvals_visit(
        &self,
        key: &[u8],
        mut emit: impl FnMut(RedisObjectArrayItem<'_>),
    ) -> RedisObjectReadOutcome {
        self.object_read_hashed_visit(hash_key(key), key, |bucket| {
            bucket.hvals_visit(key, &mut emit)
        })
    }

    fn hgetall(&self, key: &[u8]) -> RedisObjectResult {
        self.object_read(key, |bucket| bucket.hgetall(key))
    }

    fn hgetall_visit(
        &self,
        key: &[u8],
        mut emit: impl FnMut(RedisObjectArrayItem<'_>),
    ) -> RedisObjectReadOutcome {
        self.object_read_hashed_visit(hash_key(key), key, |bucket| {
            bucket.hgetall_visit(key, &mut emit)
        })
    }

    fn hsetnx(&self, key: &[u8], field: &[u8], value: &[u8]) -> RedisObjectResult {
        self.object_write(key, |bucket| bucket.hsetnx(key, field, value))
    }

    fn hincrby(&self, key: &[u8], field: &[u8], delta: i64) -> RedisObjectResult {
        self.object_write(key, |bucket| bucket.hincrby(key, field, delta))
    }

    fn hincrbyfloat(&self, key: &[u8], field: &[u8], delta: f64) -> RedisObjectResult {
        self.object_write(key, |bucket| bucket.hincrbyfloat(key, field, delta))
    }

    fn hrandfield(&self, key: &[u8], count: Option<i64>, with_values: bool) -> RedisObjectResult {
        self.object_read(key, |bucket| bucket.hrandfield(key, count, with_values))
    }

    fn hset_hashed(
        &self,
        key_hash: u64,
        key: &[u8],
        field: &[u8],
        value: &[u8],
    ) -> RedisObjectResult {
        self.object_create_hashed(
            key_hash,
            key,
            |bucket, key_hash| {
                bucket.hset_existing_or_wrongtype_hashed(key_hash, key, field, value)
            },
            |bucket, key_hash| bucket.hset_new_unchecked_hashed(key_hash, key, field, value),
        )
    }

    fn hash_field_expire(
        &self,
        key: &[u8],
        fields: &[&[u8]],
        expire_at_ms: u64,
        cond: HashFieldExpireCond,
    ) -> RedisObjectResult {
        let now_ms = now_millis();
        self.object_write(key, |bucket| {
            bucket.hash_field_expire(key, fields, expire_at_ms, cond, now_ms)
        })
    }

    fn hash_field_ttl_query(
        &self,
        key: &[u8],
        fields: &[&[u8]],
        as_millis: bool,
        absolute: bool,
    ) -> RedisObjectResult {
        let now_ms = now_millis();
        self.object_read(key, |bucket| {
            bucket.hash_field_ttl_query(key, fields, as_millis, absolute, now_ms)
        })
    }

    fn hash_field_persist(&self, key: &[u8], fields: &[&[u8]]) -> RedisObjectResult {
        let now_ms = now_millis();
        self.object_write(key, |bucket| bucket.hash_field_persist(key, fields, now_ms))
    }
}