use parking_lot::RwLock;
use std::sync::Arc;
use tempfile::TempDir;
use sqlitegraph::backend::native::types::NodeFlags;
use sqlitegraph::backend::native::v3::node::NodeRecordV3;
use sqlitegraph::backend::native::v3::{
NodeStore, PageAllocator, PersistentHeaderV3, btree::BTreeManager,
};
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!");
}