diff --git a/core/storage/database.rs b/core/storage/database.rs index f23d2d3ee..33ca2ac18 100644 --- a/core/storage/database.rs +++ b/core/storage/database.rs @@ -70,3 +70,52 @@ impl DatabaseFile { Self { file } } } + +pub struct FileMemoryStorage { + file: Arc, +} + +unsafe impl Send for FileMemoryStorage {} +unsafe impl Sync for FileMemoryStorage {} + +impl DatabaseStorage for FileMemoryStorage { + fn read_page(&self, page_idx: usize, c: Completion) -> Result<()> { + let r = match c { + Completion::Read(ref r) => r, + _ => unreachable!(), + }; + let size = r.buf().len(); + assert!(page_idx > 0); + if !(512..=65536).contains(&size) || size & (size - 1) != 0 { + return Err(LimboError::NotADB); + } + let pos = (page_idx - 1) * size; + self.file.pread(pos, c)?; + Ok(()) + } + + fn write_page( + &self, + page_idx: usize, + buffer: Arc>, + c: Completion, + ) -> Result<()> { + let buffer_size = buffer.borrow().len(); + assert!(buffer_size >= 512); + assert!(buffer_size <= 65536); + assert_eq!(buffer_size & (buffer_size - 1), 0); + let pos = (page_idx - 1) * buffer_size; + self.file.pwrite(pos, buffer, c)?; + Ok(()) + } + + fn sync(&self, c: Completion) -> Result<()> { + self.file.sync(c) + } +} + +impl FileMemoryStorage { + pub fn new(file: Arc) -> Self { + Self { file } + } +}