use crate::types::NodeId;
pub const MAGIC_MANIFEST: u32 = 0x4D424447;
pub const MAGIC_SNAPSHOT: u32 = 0x31534447;
pub const MAGIC_WAL: u32 = 0x31574447;
pub const VERSION_MANIFEST: u32 = 1;
pub const VERSION_SNAPSHOT: u32 = 3;
pub const VERSION_WAL: u32 = 1;
pub const MIN_READER_MANIFEST: u32 = 1;
pub const MIN_READER_SNAPSHOT: u32 = 3;
pub const MIN_READER_WAL: u32 = 1;
pub const SECTION_ALIGNMENT: usize = 64;
pub const WAL_RECORD_ALIGNMENT: usize = 8;
pub const EXT_MANIFEST: &str = ".gdm";
pub const EXT_SNAPSHOT: &str = ".gds";
pub const EXT_WAL: &str = ".gdw";
pub const EXT_LOCK: &str = ".gdl";
pub const MANIFEST_FILENAME: &str = "manifest.gdm";
pub const LOCK_FILENAME: &str = "lock.gdl";
pub const SNAPSHOTS_DIR: &str = "snapshots";
pub const WAL_DIR: &str = "wal";
pub const TRASH_DIR: &str = "trash";
pub const MAGIC_KITEDB: [u8; 16] = [
0x4b, 0x69, 0x74, 0x65, 0x44, 0x42, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x20, 0x31, 0x00, ];
pub const VERSION_SINGLE_FILE: u32 = 1;
pub const MIN_READER_SINGLE_FILE: u32 = 1;
pub const EXT_KITEDB: &str = ".kitedb";
pub const DEFAULT_PAGE_SIZE: usize = 4096;
pub const MIN_PAGE_SIZE: usize = 4096;
pub const MAX_PAGE_SIZE: usize = 65536;
pub const OS_PAGE_SIZE: usize = 4096;
pub const DB_HEADER_SIZE: usize = 4096;
pub const DB_HEADER_RESERVED_SIZE: usize = 14;
pub const WAL_DEFAULT_SIZE: usize = 1024 * 1024;
pub const WAL_MIN_SNAPSHOT_RATIO: f64 = 0.1;
pub const LOCK_BYTE_OFFSET: u64 = 0x40000000;
pub const LOCK_BYTE_RANGE: usize = 512;
pub const DB_FLAG_WAL_MODE: u32 = 1 << 0;
pub const DB_FLAG_COMPRESSION: u32 = 1 << 1;
pub const DB_FLAG_ENCRYPTED: u32 = 1 << 2;
pub const COMPACT_EDGE_RATIO: f64 = 0.1;
pub const COMPACT_NODE_RATIO: f64 = 0.1;
pub const COMPACT_WAL_SIZE: usize = 64 * 1024 * 1024;
pub const DELTA_SET_UPGRADE_THRESHOLD: usize = 64;
pub const COMPRESSION_MIN_SIZE: usize = 64;
pub const INITIAL_NODE_ID: NodeId = 1;
pub const INITIAL_LABEL_ID: u32 = 1;
pub const INITIAL_ETYPE_ID: u32 = 1;
pub const INITIAL_PROPKEY_ID: u32 = 1;
pub const INITIAL_TX_ID: u64 = 1;
pub const INITIAL_SNAPSHOT_GEN: u64 = 0;
pub const INITIAL_WAL_SEG: u64 = 1;
#[inline]
pub fn snapshot_filename(gen: u64) -> String {
format!("snap_{gen:016}{EXT_SNAPSHOT}")
}
#[inline]
pub fn wal_filename(seg: u64) -> String {
format!("wal_{seg:016}{EXT_WAL}")
}
pub fn parse_snapshot_gen(filename: &str) -> Option<u64> {
let prefix = "snap_";
let suffix = EXT_SNAPSHOT;
if !filename.starts_with(prefix) || !filename.ends_with(suffix) {
return None;
}
let num_str = &filename[prefix.len()..filename.len() - suffix.len()];
if num_str.len() != 16 {
return None;
}
num_str.parse().ok()
}
pub fn parse_wal_seg(filename: &str) -> Option<u64> {
let prefix = "wal_";
let suffix = EXT_WAL;
if !filename.starts_with(prefix) || !filename.ends_with(suffix) {
return None;
}
let num_str = &filename[prefix.len()..filename.len() - suffix.len()];
if num_str.len() != 16 {
return None;
}
num_str.parse().ok()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_snapshot_filename() {
assert_eq!(snapshot_filename(1), "snap_0000000000000001.gds");
assert_eq!(snapshot_filename(12345), "snap_0000000000012345.gds");
}
#[test]
fn test_wal_filename() {
assert_eq!(wal_filename(1), "wal_0000000000000001.gdw");
assert_eq!(wal_filename(99999), "wal_0000000000099999.gdw");
}
#[test]
fn test_parse_snapshot_gen() {
assert_eq!(parse_snapshot_gen("snap_0000000000000001.gds"), Some(1));
assert_eq!(parse_snapshot_gen("snap_0000000000012345.gds"), Some(12345));
assert_eq!(parse_snapshot_gen("invalid.gds"), None);
assert_eq!(parse_snapshot_gen("snap_123.gds"), None);
}
#[test]
fn test_parse_wal_seg() {
assert_eq!(parse_wal_seg("wal_0000000000000001.gdw"), Some(1));
assert_eq!(parse_wal_seg("wal_0000000000099999.gdw"), Some(99999));
assert_eq!(parse_wal_seg("invalid.gdw"), None);
}
}