flashdb_rs/kvdb/
types.rs

1use crate::{
2    fdb_kv, fdb_kv_status, fdb_kv_status_FDB_KV_DELETED, fdb_kv_status_FDB_KV_ERR_HDR, fdb_kv_status_FDB_KV_PRE_DELETE, fdb_kv_status_FDB_KV_PRE_WRITE, fdb_kv_status_FDB_KV_UNUSED, fdb_kv_status_FDB_KV_WRITE, fdb_kv_t, RawHandle
3};
4
5/// 键值对状态枚举
6///
7/// 表示KV在数据库中的生命周期状态,用于跟踪键值对的操作历史和当前状态
8#[repr(u32)]
9#[derive(Debug, PartialEq, Eq, Clone, Copy)]
10pub enum KVStatus {
11    /// 未使用状态,初始创建但未被操作
12    UNUSED = fdb_kv_status_FDB_KV_UNUSED,
13    /// 预写入状态,准备写入但尚未完成
14    PRE_WRITE = fdb_kv_status_FDB_KV_PRE_WRITE,
15    /// 已写入状态,数据已成功写入
16    Write = fdb_kv_status_FDB_KV_WRITE,
17    /// 预删除状态,准备删除但尚未完成
18    PRE_DELETE = fdb_kv_status_FDB_KV_PRE_DELETE,
19    /// 已删除状态,数据已标记为删除
20    DELETED = fdb_kv_status_FDB_KV_DELETED,
21    /// 头部错误状态,键值对头部信息损坏
22    ERR_HDR = fdb_kv_status_FDB_KV_ERR_HDR,
23}
24impl From<fdb_kv_status> for KVStatus {
25    /// 从底层C类型转换为Rust枚举类型
26    ///
27    /// # 安全性
28    /// 依赖于C库定义的状态值与Rust枚举变体的数值匹配
29    fn from(value: fdb_kv_status) -> Self {
30        unsafe { core::mem::transmute(value) }
31    }
32}
33
34#[derive(Debug, Clone, Default)]
35pub struct KVEntry {
36    pub(super) inner: fdb_kv,
37}
38
39impl KVEntry {
40    /// 获取 KV 的当前状态。
41    pub fn status(&self) -> KVStatus {
42        self.inner.status.into()
43    }
44
45    /// 获取 KV 值的字节长度。
46    pub fn value_len(&self) -> usize {
47        self.inner.value_len as usize
48    }
49
50    /// 获取 KV 的名称(键)。
51    ///
52    /// 返回一个字符串切片 `&str`。如果名称不是有效的 UTF-8 编码,
53    /// 此方法会返回 `None`。
54    pub fn name(&self) -> Option<&str> {
55        // C 库保证了 name_len 是准确的长度
56        let name_slice = &self.inner.name[..self.inner.name_len as usize];
57        // 将 C 风格的 char 数组(在这里是 u8)转换为 Rust 字符串切片
58        core::str::from_utf8(unsafe {
59            // fdb_kv.name 的类型是 [i8; 64],需要安全地转换为 [u8]
60            core::slice::from_raw_parts(name_slice.as_ptr() as *const u8, name_slice.len())
61        })
62        .ok()
63    }
64
65    /// 检查内部的 CRC 校验是否通过。
66    pub fn is_valid(&self) -> bool {
67        self.inner.crc_is_ok
68    }
69}
70
71impl RawHandle for KVEntry {
72    type Handle = fdb_kv_t;
73    fn handle(&self) -> Self::Handle {
74        &self.inner as *const _ as *mut _
75    }
76}
77
78impl From<fdb_kv> for KVEntry {
79    fn from(value: fdb_kv) -> Self {
80        Self { inner: value }
81    }
82}