use bytemuck::{Pod, Zeroable};
#[derive(Clone, Copy, Debug, PartialEq)]
pub struct NodePoint {
pub id: u64,
pub x: f32,
pub y: f32,
pub z: f32,
}
#[repr(C)]
#[derive(Clone, Copy, Debug, Pod, Zeroable)]
pub struct NodeRec {
pub id: u64,
pub morton_code: u64, pub x: f32,
pub y: f32,
pub z: f32,
pub edge_off: u32,
pub edge_len: u32,
pub flags: u32,
pub begin_ts: u64, pub end_ts: u64, pub tx_id: u64, pub visibility: u8, pub _padding: [u8; 7], }
#[repr(C)]
#[derive(Clone, Copy, Debug, Pod, Zeroable)]
pub struct EdgeRec {
pub src: u64, pub dst: u64,
pub w: f32, pub flags: u32,
pub begin_ts: u64, pub end_ts: u64, pub tx_id: u64, pub visibility: u8, pub _padding: [u8; 7], }
#[repr(C)]
#[derive(Clone, Copy, Debug, Pod, Zeroable)]
#[allow(dead_code)]
pub struct OctreeNode {
pub min_x: f32,
pub min_y: f32,
pub min_z: f32,
pub max_x: f32,
pub max_y: f32,
pub max_z: f32,
pub children_ptr: u64, pub data_ptr: u64, pub data_len: u32, pub _padding: u32, }
pub const WAL_ENTRY_NODE_CREATE: u8 = 1;
pub const WAL_ENTRY_EDGE_CREATE: u8 = 2;
pub const WAL_ENTRY_NODE_DELETE: u8 = 3;
pub const WAL_ENTRY_EDGE_DELETE: u8 = 4;
pub const WAL_ENTRY_PROPERTY_UPDATE: u8 = 5;
pub const WAL_ENTRY_BEGIN_TX: u8 = 6;
pub const WAL_ENTRY_COMMIT_TX: u8 = 7;
pub const WAL_ENTRY_ABORT_TX: u8 = 8;
pub const NODE_FLAG_TOMBSTONE: u32 = 0x1;
pub const EDGE_FLAG_TOMBSTONE: u32 = 0x1;
pub const VERSION_UNCOMMITTED: u8 = 0; pub const VERSION_COMMITTED: u8 = 1; pub const VERSION_ABORTED: u8 = 2;
#[repr(C)]
#[derive(Clone, Copy, Debug, Pod, Zeroable)]
pub struct MetadataRec {
pub block_kind: [u8; 32],
pub terminator: [u8; 64],
pub byte_start: u64,
pub byte_end: u64,
pub start_line: u64,
pub start_col: u64,
pub end_line: u64,
pub end_col: u64,
pub _padding: [u8; 32],
}
impl MetadataRec {
pub const SIZE: usize = 176;
#[allow(clippy::too_many_arguments)]
pub fn from_strings(
block_kind: &str,
terminator: &str,
byte_start: u64,
byte_end: u64,
start_line: u64,
start_col: u64,
end_line: u64,
end_col: u64,
) -> Self {
let mut rec = Self {
block_kind: [0u8; 32],
terminator: [0u8; 64],
byte_start,
byte_end,
start_line,
start_col,
end_line,
end_col,
_padding: [0u8; 32],
};
let kind_bytes = block_kind.as_bytes();
let len = kind_bytes.len().min(31);
if len > 0 {
rec.block_kind[..len].copy_from_slice(&kind_bytes[..len]);
}
let term_bytes = terminator.as_bytes();
let len = term_bytes.len().min(63);
if len > 0 {
rec.terminator[..len].copy_from_slice(&term_bytes[..len]);
}
rec
}
pub fn get_block_kind(&self) -> String {
let null_pos = self.block_kind.iter().position(|&b| b == 0).unwrap_or(32);
String::from_utf8_lossy(&self.block_kind[..null_pos]).to_string()
}
pub fn get_terminator(&self) -> String {
let null_pos = self.terminator.iter().position(|&b| b == 0).unwrap_or(64);
String::from_utf8_lossy(&self.terminator[..null_pos]).to_string()
}
}
impl Default for MetadataRec {
fn default() -> Self {
Self {
block_kind: [0u8; 32],
terminator: [0u8; 64],
byte_start: 0,
byte_end: 0,
start_line: 0,
start_col: 0,
end_line: 0,
end_col: 0,
_padding: [0u8; 32],
}
}
}
#[repr(C)]
#[derive(Clone, Copy, Debug, Pod, Zeroable)]
pub struct WalEntry {
pub timestamp: u64, pub node_id: u64, pub edge_dst: u64, pub x: f32, pub y: f32, pub z: f32, pub edge_w: f32, pub entry_type: u8, pub _padding: [u8; 7], pub tx_id: u64, pub lsn: u64, }