Files
turso/core/pager.rs
2023-09-16 09:34:17 +03:00

38 lines
1.2 KiB
Rust

use crate::buffer_pool;
use crate::buffer_pool::BufferPool;
use crate::sqlite3_ondisk;
use crate::sqlite3_ondisk::BTreePage;
use crate::Storage;
use concurrent_lru::unsharded::LruCache;
use std::sync::{Arc, Mutex};
pub struct Pager {
storage: Storage,
page_cache: LruCache<usize, Arc<BTreePage>>,
buffer_pool: Arc<Mutex<BufferPool>>,
}
impl Pager {
pub fn open(storage: Storage) -> anyhow::Result<Self> {
let db_header = sqlite3_ondisk::read_database_header(&storage)?;
let page_size = db_header.page_size as usize;
let buffer_pool = Arc::new(Mutex::new(buffer_pool::BufferPool::new(page_size)));
let page_cache = LruCache::new(10);
Ok(Self {
storage,
buffer_pool,
page_cache,
})
}
pub fn read_page(&self, page_idx: usize) -> anyhow::Result<Arc<BTreePage>> {
let handle = self.page_cache.get_or_try_init(page_idx, 1, |_idx| {
let mut buffer_pool = self.buffer_pool.lock().unwrap();
let page =
sqlite3_ondisk::read_btree_page(&self.storage, &mut buffer_pool, page_idx).unwrap();
Ok::<Arc<BTreePage>, anyhow::Error>(Arc::new(page))
})?;
Ok(handle.value().clone())
}
}