shardmap 0.3.0

Sharded embedded in-memory map with optional cache, protocol, and server internals
Documentation
use super::super::*;
use super::access::RedisObjectStoreAccess;

#[allow(dead_code)]
pub(crate) trait RedisSetStore {
    fn sadd(&self, key: &[u8], members: &[&[u8]]) -> RedisObjectResult;
    fn srem(&self, key: &[u8], members: &[&[u8]]) -> RedisObjectResult;
    fn sismember(&self, key: &[u8], member: &[u8]) -> RedisObjectResult;
    fn smismember(&self, key: &[u8], members: &[&[u8]]) -> RedisObjectResult;
    fn scard(&self, key: &[u8]) -> RedisObjectResult;
    fn smembers(&self, key: &[u8]) -> RedisObjectResult;
    fn smembers_visit(
        &self,
        key: &[u8],
        emit: impl FnMut(RedisObjectArrayItem<'_>),
    ) -> RedisObjectReadOutcome;
    fn set_members(&self, key: &[u8]) -> Result<Vec<Bytes>, RedisObjectError>;
    fn spop(&self, key: &[u8], count: Option<usize>) -> RedisObjectResult;
    fn srandmember(&self, key: &[u8], count: Option<i64>) -> RedisObjectResult;
    fn srandmember_positive_visit(
        &self,
        key: &[u8],
        requested: usize,
        emit: impl FnMut(RedisObjectArrayItem<'_>),
    ) -> RedisObjectReadOutcome;
    fn sadd_hashed(&self, key_hash: u64, key: &[u8], members: &[&[u8]]) -> RedisObjectResult;
}

impl RedisSetStore for EmbeddedStore {
    fn sadd(&self, key: &[u8], members: &[&[u8]]) -> RedisObjectResult {
        self.sadd_hashed(hash_key(key), key, members)
    }

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

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

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

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

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

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

    fn set_members(&self, key: &[u8]) -> Result<Vec<Bytes>, RedisObjectError> {
        let route = self.route_key(key);
        let bucket = self.objects.read_bucket(route.shard_id, route.key_hash);
        let result = bucket
            .set_members(key)
            .map_err(|()| RedisObjectError::WrongType);
        if result.is_err() || bucket.contains_object(key) {
            return result;
        }
        drop(bucket);
        if self.string_exists_routed(route, key) {
            Err(RedisObjectError::WrongType)
        } else {
            result
        }
    }

    fn spop(&self, key: &[u8], count: Option<usize>) -> RedisObjectResult {
        self.object_write(key, |bucket| bucket.spop(key, count))
    }

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

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

    fn sadd_hashed(&self, key_hash: u64, key: &[u8], members: &[&[u8]]) -> RedisObjectResult {
        self.object_create_hashed(
            key_hash,
            key,
            |bucket, key_hash| bucket.sadd_existing_or_wrongtype_hashed(key_hash, key, members),
            |bucket, key_hash| bucket.sadd_new_unchecked_hashed(key_hash, key, members),
        )
    }
}