mirror of
https://github.com/aljazceru/turso.git
synced 2026-01-06 09:44:21 +01:00
Merge pull request #90 from crrow/topic/fix-error-handling-for-invalid-file
Replace unwrap() in PageIO.get() with proper error handling
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1 +1,2 @@
|
||||
/target
|
||||
/.idea
|
||||
1
Cargo.lock
generated
1
Cargo.lock
generated
@@ -962,6 +962,7 @@ dependencies = [
|
||||
"rusqlite",
|
||||
"sieve-cache",
|
||||
"sqlite3-parser",
|
||||
"thiserror",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
||||
@@ -31,6 +31,7 @@ log = "0.4.20"
|
||||
ordered-multimap = "0.7.1"
|
||||
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"] }
|
||||
|
||||
@@ -140,8 +140,7 @@ impl Pager {
|
||||
self.buffer_pool.clone(),
|
||||
page.clone(),
|
||||
page_idx,
|
||||
)
|
||||
.unwrap();
|
||||
)?;
|
||||
page_cache.insert(page_idx, page.clone());
|
||||
Ok(page)
|
||||
}
|
||||
|
||||
@@ -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<dyn PageIO>,
|
||||
@@ -63,12 +70,10 @@ struct FileStorage {
|
||||
#[cfg(feature = "fs")]
|
||||
impl PageIO for FileStorage {
|
||||
fn get(&self, page_idx: usize, c: Rc<Completion>) -> 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(())
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user