flashdb_rs/tsdb/
types.rs

1use embedded_storage::nor_flash::NorFlash;
2
3use crate::{
4    fdb_blob, fdb_blob__bindgen_ty_1, fdb_tsl, fdb_tsl_status_FDB_TSL_DELETED, fdb_tsl_status_FDB_TSL_PRE_WRITE, fdb_tsl_status_FDB_TSL_UNUSED, fdb_tsl_status_FDB_TSL_USER_STATUS1, fdb_tsl_status_FDB_TSL_USER_STATUS2, fdb_tsl_status_FDB_TSL_WRITE, fdb_tsl_status_t, fdb_tsl_t, RawHandle, TSDB
5};
6
7#[repr(u32)]
8#[derive(Debug, PartialEq, Eq, Clone, Copy)]
9pub enum TSLStatus {
10    UNUSED = fdb_tsl_status_FDB_TSL_UNUSED,
11    PRE_WRITE = fdb_tsl_status_FDB_TSL_PRE_WRITE,
12    Write = fdb_tsl_status_FDB_TSL_WRITE, // 已写入状态,TSL 被追加到 TSDB 后的默认状态
13    UserStatus1 = fdb_tsl_status_FDB_TSL_USER_STATUS1, // 介于写入与删除之间,用户可自定义状态含义(如数据已同步至云端)
14    Deleted = fdb_tsl_status_FDB_TSL_DELETED,          // 已删除状态,删除 TSL 时设置此状态
15    UserStatus2 = fdb_tsl_status_FDB_TSL_USER_STATUS2, // 介于写入与删除之间,用户可自定义状态含义(如数据已同步至云端)
16}
17
18impl From<fdb_tsl_status_t> for TSLStatus {
19    fn from(value: fdb_tsl_status_t) -> Self {
20        unsafe { core::mem::transmute(value) }
21    }
22}
23
24#[derive(Debug, Clone, Default)]
25pub struct TSLEntry {
26    pub(super) inner: fdb_tsl,
27}
28
29impl TSLEntry {
30    pub fn status(&self) -> TSLStatus {
31        self.inner.status.into()
32    }
33
34    pub fn value_len(&self) -> usize {
35        self.inner.log_len as usize
36    }
37
38    pub fn time(&self) -> i64 {
39        self.inner.time as i64
40    }
41}
42
43impl RawHandle for TSLEntry {
44    type Handle = fdb_tsl_t;
45    fn handle(&self) -> Self::Handle {
46        &self.inner as *const _ as *mut _
47    }
48}
49
50impl From<fdb_tsl> for TSLEntry {
51    fn from(value: fdb_tsl) -> Self {
52        Self { inner: value }
53    }
54}
55
56// 迭代器闭包数据包装(用于跨语言回调)
57pub(super) struct CallbackData<'a, S: NorFlash, F> {
58    pub(super) callback: F,         // 用户提供的迭代回调函数
59    pub(super) db: &'a mut TSDB<S>, // 当前数据库引用
60}
61
62/// 跨语言回调函数(unsafe边界)
63///
64/// # 安全说明
65/// - 必须确保`arg`指针指向有效的`CallbackData`
66/// - 闭包需实现`Send` trait以支持线程安全
67pub(super) unsafe extern "C" fn iter_callback<
68    S: NorFlash,
69    F: FnMut(&mut TSDB<S>, &mut TSLEntry) -> bool + Send,
70>(
71    tsl: fdb_tsl_t,
72    arg: *mut core::ffi::c_void,
73) -> bool {
74    // 从C指针还原Rust结构体(unsafe操作)
75    let callback_data: &mut CallbackData<'_, S, F> = unsafe { core::mem::transmute(arg) };
76    // 调用用户闭包并传递数据库引用和TSL句柄
77    // 这里反转一下,使其更符合rust遍历习惯
78    // 这里可能会导致问题
79    !(callback_data.callback)(callback_data.db, unsafe { core::mem::transmute(tsl) })
80}
81
82
83pub fn fdb_blob_make_by_tsl(v: &mut [u8], tsl:& TSLEntry, offset: usize) -> fdb_blob {
84    fdb_blob {
85        buf: v.as_mut_ptr() as *mut _,
86        size: v.len(),
87        saved: fdb_blob__bindgen_ty_1 {
88            meta_addr: tsl.inner.addr.index,
89            addr: tsl.inner.addr.log + offset as u32,
90            len: tsl.inner.log_len as usize - offset,
91        },
92    }
93}