diff --git a/.gitignore b/.gitignore index ea8c4bf7f..40d9acab9 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ /target +/.idea \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index bbd070f20..5644a9279 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -932,6 +932,7 @@ dependencies = [ "rusqlite", "sieve-cache", "sqlite3-parser", + "thiserror", ] [[package]] diff --git a/core/Cargo.toml b/core/Cargo.toml index 7310fa6c0..3012d8273 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -30,6 +30,7 @@ fallible-iterator = "0.3.0" log = "0.4.20" sieve-cache = "0.1.4" sqlite3-parser = "0.11.0" +thiserror = "1.0.61" [target.'cfg(not(target_family = "windows"))'.dev-dependencies] pprof = { version = "0.12.1", features = ["criterion", "flamegraph"] } diff --git a/core/pager.rs b/core/pager.rs index c8275bb48..c2b29574b 100644 --- a/core/pager.rs +++ b/core/pager.rs @@ -140,8 +140,7 @@ impl Pager { self.buffer_pool.clone(), page.clone(), page_idx, - ) - .unwrap(); + )?; page_cache.insert(page_idx, page.clone()); Ok(page) } diff --git a/core/storage.rs b/core/storage.rs index 1086e3274..41e430f91 100644 --- a/core/storage.rs +++ b/core/storage.rs @@ -4,8 +4,15 @@ use crate::{ io::{Completion, WriteCompletion}, Buffer, }; -use anyhow::Result; +use anyhow::{ensure, Result}; use std::{cell::RefCell, rc::Rc}; +use thiserror::Error; + +#[derive(Debug, Error)] +pub enum StorageError { + #[error("file is not a database")] + NotADB, +} pub struct PageSource { io: Rc, @@ -63,12 +70,10 @@ struct FileStorage { #[cfg(feature = "fs")] impl PageIO for FileStorage { fn get(&self, page_idx: usize, c: Rc) -> Result<()> { - let page_size = c.buf().len(); + let size = c.buf().len(); assert!(page_idx > 0); - assert!(page_size >= 512); - assert!(page_size <= 65536); - assert!((page_size & (page_size - 1)) == 0); - let pos = (page_idx - 1) * page_size; + ensure!(size >= 1 << 9 && size <= 1 << 16 && size & (size - 1) == 0, StorageError::NotADB); + let pos = (page_idx - 1) * size; self.file.pread(pos, c)?; Ok(()) }