wedb_embed 0.1.2

Embedded database engine providing Redis-like APIs, built on fjall / 嵌入式数据库引擎,提供类似 Redis 的接口,底层基于 fjall 开发
Documentation
use crate::key_composer::{
  oppv::encode_oppv_u64,
  tag::{SysMetaTag, SystemDomainTag},
};

pub const DEFAULT_NAMESPACE: &str = "default";

pub const NS_NAME_PREFIX: &[u8] = &[0, SystemDomainTag::SysMeta as u8, SysMetaTag::NsName as u8];
pub const NS_ID_PREFIX: &[u8] = &[0, SystemDomainTag::SysMeta as u8, SysMetaTag::NsId as u8];
pub const NS_NEXT_ID_KEY: &[u8] = &[
  0,
  SystemDomainTag::SysMeta as u8,
  SysMetaTag::NsNextId as u8,
];
pub const NS_TOKEN_PREFIX: &[u8] = &[0, SystemDomainTag::SysMeta as u8, SysMetaTag::NsToken as u8];
pub const CATALOG_PREFIX: &[u8] = &[0, SystemDomainTag::Catalog as u8];

/// 构造命名空间名称元数据键(零 UTF-8 约束)
#[inline]
pub fn ns_name_key(ns: impl AsRef<[u8]>) -> Vec<u8> {
  let ns_bytes = ns.as_ref();
  let mut v = Vec::with_capacity(NS_NAME_PREFIX.len() + ns_bytes.len());
  v.extend_from_slice(NS_NAME_PREFIX);
  v.extend_from_slice(ns_bytes);
  v
}

/// 构造命名空间数字 ID 反查元数据键
#[inline]
pub fn ns_id_key(id: u64) -> Vec<u8> {
  let mut v = Vec::with_capacity(NS_ID_PREFIX.len() + 9);
  v.extend_from_slice(NS_ID_PREFIX);
  encode_oppv_u64(id, &mut v);
  v
}

/// 构造命名空间 Token 元数据键
#[inline]
pub fn ns_token_key(token: impl AsRef<[u8]>) -> Vec<u8> {
  let token_bytes = token.as_ref();
  let mut v = Vec::with_capacity(NS_TOKEN_PREFIX.len() + token_bytes.len());
  v.extend_from_slice(NS_TOKEN_PREFIX);
  v.extend_from_slice(token_bytes);
  v
}

/// 构造 Catalog 目录中命名空间的全局前缀(采用 OPPV 变长前缀编码长度,数学上严格杜绝任意冒号或子字符串碰撞)
#[inline]
pub fn catalog_ns_prefix(ns: impl AsRef<[u8]>) -> Vec<u8> {
  let ns_bytes = ns.as_ref();
  let mut v = Vec::with_capacity(CATALOG_PREFIX.len() + 9 + ns_bytes.len());
  v.extend_from_slice(CATALOG_PREFIX);
  encode_oppv_u64(ns_bytes.len() as u64, &mut v);
  v.extend_from_slice(ns_bytes);
  v
}

/// 构造 Catalog 目录中特定 DB 的索引键(OPPV 保序变长整型)
#[inline]
pub fn catalog_db_key(ns: impl AsRef<[u8]>, db_idx: u64) -> Vec<u8> {
  let ns_bytes = ns.as_ref();
  let mut v = Vec::with_capacity(CATALOG_PREFIX.len() + 9 + ns_bytes.len() + 9);
  v.extend_from_slice(CATALOG_PREFIX);
  encode_oppv_u64(ns_bytes.len() as u64, &mut v);
  v.extend_from_slice(ns_bytes);
  encode_oppv_u64(db_idx, &mut v);
  v
}

/// 判断命名空间是否为默认命名空间(支持 "default", "0", "db0", "" 等)
#[inline]
pub fn is_default_namespace(ns: &str) -> bool {
  ns == DEFAULT_NAMESPACE || ns == "0" || ns == "db0" || ns.is_empty()
}

/// 字节切片版本判断
#[inline]
pub fn is_default_namespace_bytes(ns: &[u8]) -> bool {
  ns == DEFAULT_NAMESPACE.as_bytes() || ns == b"0" || ns == b"db0" || ns.is_empty()
}