use std::sync::Arc; use crate::{ storage::sqlite3_ondisk::finish_read_page, Buffer, Completion, CompletionError, PageRef, Result, }; #[derive(Clone)] pub struct Subjournal { file: Arc, } impl Subjournal { pub fn new(file: Arc) -> Self { Self { file } } pub fn size(&self) -> Result { self.file.size() } pub fn write_page( &self, offset: u64, page_size: usize, buffer: Arc, c: Completion, ) -> Result { assert!( buffer.len() == page_size + 4, "buffer length should be page_size + 4 bytes for page id" ); self.file.pwrite(offset, buffer, c) } pub fn read_page_number(&self, offset: u64, page_id_buffer: Arc) -> Result { assert!( page_id_buffer.len() == 4, "page_id_buffer length should be 4 bytes" ); let c = Completion::new_read( page_id_buffer, move |res: Result<(Arc, i32), CompletionError>| { let Ok((_buffer, _bytes_read)) = res else { return; }; }, ); let c = self.file.pread(offset, c)?; Ok(c) } pub fn read_page( &self, offset: u64, buffer: Arc, page: PageRef, page_size: usize, ) -> Result { assert!( buffer.len() == page_size, "buffer length should be page_size" ); let c = Completion::new_read( buffer, move |res: Result<(Arc, i32), CompletionError>| { let Ok((buffer, bytes_read)) = res else { return; }; assert!( bytes_read == page_size as i32, "bytes_read should be page_size" ); finish_read_page(page.get().id, buffer, page.clone()); }, ); let c = self.file.pread(offset, c)?; Ok(c) } pub fn truncate(&self, offset: u64) -> Result { let c = Completion::new_trunc(move |res: Result| { let Ok(_) = res else { return; }; }); self.file.truncate(offset, c) } }