use std::sync::Arc;
use parking_lot::RwLock;
use tempfile::TempDir;
use sqlitegraph::backend::native::v3::{
NodeStore, PageAllocator, PersistentHeaderV3, btree::BTreeManager,
};
use sqlitegraph::backend::native::v3::node::NodeRecordV3;
use sqlitegraph::backend::native::types::NodeFlags;
fn main() {
let temp_dir = TempDir::new().unwrap();
let db_path = temp_dir.path().join("test.db");
let header = PersistentHeaderV3::new_v3();
let mut store = NodeStore::new(&header, db_path.clone());
let allocator = Arc::new(RwLock::new(PageAllocator::new(&header)));
let btree = BTreeManager::new(
Arc::clone(&allocator),
None,
db_path.clone()
);
store.initialize(btree, Arc::clone(&allocator), None);
println!("Test 1: Immediate mode");
let node1 = NodeRecordV3::new_inline(0, NodeFlags::empty(), 0, 0, vec![1, 2, 3], 0, 0, 0, 0);
match store.insert_node(node1) {
Ok(id) => println!(" Inserted node {}", id),
Err(e) => println!(" Error: {}", e),
}
println!("\nTest 2: Batch mode");
store.begin_batch();
println!(" Batch mode enabled");
let node2 = NodeRecordV3::new_inline(0, NodeFlags::empty(), 0, 0, vec![4, 5, 6], 0, 0, 0, 0);
match store.insert_node(node2) {
Ok(id) => {
println!(" Staged node {} (dirty_pages: {})", id, store.dirty_page_count());
let node3 = NodeRecordV3::new_inline(0, NodeFlags::empty(), 0, 0, vec![7, 8, 9], 0, 0, 0, 0);
match store.insert_node(node3) {
Ok(id2) => println!(" Staged node {} (dirty_pages: {})", id2, store.dirty_page_count()),
Err(e) => println!(" Second insert error: {}", e),
}
}
Err(e) => println!(" First insert error: {}", e),
}
match store.commit_batch() {
Ok(count) => println!(" Committed {} pages", count),
Err(e) => println!(" Commit error: {}", e),
}
println!("\nDone!");
}