mirror of
https://github.com/aljazceru/turso.git
synced 2026-01-24 18:34:34 +01:00
Merge 'core: Fold HeaderRef to pager module' from Pekka Enberg
Closes #2401
This commit is contained in:
@@ -1,75 +0,0 @@
|
||||
use super::sqlite3_ondisk::{DatabaseHeader, PageContent};
|
||||
use crate::turso_assert;
|
||||
use crate::{
|
||||
storage::pager::{PageRef, Pager},
|
||||
types::IOResult,
|
||||
LimboError, Result,
|
||||
};
|
||||
use std::cell::{Ref, RefMut};
|
||||
|
||||
pub struct HeaderRef(PageRef);
|
||||
|
||||
impl HeaderRef {
|
||||
pub fn from_pager(pager: &Pager) -> Result<IOResult<Self>> {
|
||||
if !pager.db_state.is_initialized() {
|
||||
return Err(LimboError::InternalError(
|
||||
"Database is empty, header does not exist - page 1 should've been allocated before this".to_string()
|
||||
));
|
||||
}
|
||||
|
||||
let (page, _c) = pager.read_page(DatabaseHeader::PAGE_ID)?;
|
||||
if page.is_locked() {
|
||||
return Ok(IOResult::IO);
|
||||
}
|
||||
|
||||
turso_assert!(
|
||||
page.get().id == DatabaseHeader::PAGE_ID,
|
||||
"incorrect header page id"
|
||||
);
|
||||
|
||||
Ok(IOResult::Done(Self(page)))
|
||||
}
|
||||
|
||||
pub fn borrow(&self) -> Ref<'_, DatabaseHeader> {
|
||||
// TODO: Instead of erasing mutability, implement `get_mut_contents` and return a shared reference.
|
||||
let content: &PageContent = self.0.get_contents();
|
||||
Ref::map(content.buffer.borrow(), |buffer| {
|
||||
bytemuck::from_bytes::<DatabaseHeader>(&buffer.as_slice()[0..DatabaseHeader::SIZE])
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
pub struct HeaderRefMut(PageRef);
|
||||
|
||||
impl HeaderRefMut {
|
||||
pub fn from_pager(pager: &Pager) -> Result<IOResult<Self>> {
|
||||
if !pager.db_state.is_initialized() {
|
||||
return Err(LimboError::InternalError(
|
||||
"Database is empty, header does not exist - page 1 should've been allocated before this".to_string(),
|
||||
));
|
||||
}
|
||||
|
||||
let (page, _c) = pager.read_page(DatabaseHeader::PAGE_ID)?;
|
||||
if page.is_locked() {
|
||||
return Ok(IOResult::IO);
|
||||
}
|
||||
|
||||
turso_assert!(
|
||||
page.get().id == DatabaseHeader::PAGE_ID,
|
||||
"incorrect header page id"
|
||||
);
|
||||
|
||||
pager.add_dirty(&page);
|
||||
|
||||
Ok(IOResult::Done(Self(page)))
|
||||
}
|
||||
|
||||
pub fn borrow_mut(&self) -> RefMut<'_, DatabaseHeader> {
|
||||
let content = self.0.get_contents();
|
||||
RefMut::map(content.buffer.borrow_mut(), |buffer| {
|
||||
bytemuck::from_bytes_mut::<DatabaseHeader>(
|
||||
&mut buffer.as_mut_slice()[0..DatabaseHeader::SIZE],
|
||||
)
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -13,7 +13,6 @@
|
||||
pub(crate) mod btree;
|
||||
pub(crate) mod buffer_pool;
|
||||
pub(crate) mod database;
|
||||
pub(crate) mod header_accessor;
|
||||
pub(crate) mod page_cache;
|
||||
#[allow(clippy::arc_with_non_send_sync)]
|
||||
pub(crate) mod pager;
|
||||
|
||||
@@ -12,6 +12,7 @@ use crate::{return_if_io, Completion, TransactionState};
|
||||
use crate::{turso_assert, Buffer, Connection, LimboError, Result};
|
||||
use parking_lot::RwLock;
|
||||
use std::cell::{Cell, OnceCell, RefCell, UnsafeCell};
|
||||
use std::cell::{Ref, RefMut};
|
||||
use std::collections::HashSet;
|
||||
use std::hash;
|
||||
use std::rc::Rc;
|
||||
@@ -20,7 +21,6 @@ use std::sync::{Arc, Mutex};
|
||||
use tracing::{instrument, trace, Level};
|
||||
|
||||
use super::btree::{btree_init_page, BTreePage};
|
||||
use super::header_accessor::{HeaderRef, HeaderRefMut};
|
||||
use super::page_cache::{CacheError, CacheResizeResult, DumbLruPageCache, PageCacheKey};
|
||||
use super::sqlite3_ondisk::begin_write_btree_page;
|
||||
use super::wal::CheckpointMode;
|
||||
@@ -28,6 +28,73 @@ use super::wal::CheckpointMode;
|
||||
#[cfg(not(feature = "omit_autovacuum"))]
|
||||
use {crate::io::Buffer as IoBuffer, ptrmap::*};
|
||||
|
||||
struct HeaderRef(PageRef);
|
||||
|
||||
impl HeaderRef {
|
||||
pub fn from_pager(pager: &Pager) -> Result<IOResult<Self>> {
|
||||
if !pager.db_state.is_initialized() {
|
||||
return Err(LimboError::InternalError(
|
||||
"Database is empty, header does not exist - page 1 should've been allocated before this".to_string()
|
||||
));
|
||||
}
|
||||
|
||||
let (page, _c) = pager.read_page(DatabaseHeader::PAGE_ID)?;
|
||||
if page.is_locked() {
|
||||
return Ok(IOResult::IO);
|
||||
}
|
||||
|
||||
turso_assert!(
|
||||
page.get().id == DatabaseHeader::PAGE_ID,
|
||||
"incorrect header page id"
|
||||
);
|
||||
|
||||
Ok(IOResult::Done(Self(page)))
|
||||
}
|
||||
|
||||
pub fn borrow(&self) -> Ref<'_, DatabaseHeader> {
|
||||
// TODO: Instead of erasing mutability, implement `get_mut_contents` and return a shared reference.
|
||||
let content: &PageContent = self.0.get_contents();
|
||||
Ref::map(content.buffer.borrow(), |buffer| {
|
||||
bytemuck::from_bytes::<DatabaseHeader>(&buffer.as_slice()[0..DatabaseHeader::SIZE])
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
pub struct HeaderRefMut(PageRef);
|
||||
|
||||
impl HeaderRefMut {
|
||||
pub fn from_pager(pager: &Pager) -> Result<IOResult<Self>> {
|
||||
if !pager.db_state.is_initialized() {
|
||||
return Err(LimboError::InternalError(
|
||||
"Database is empty, header does not exist - page 1 should've been allocated before this".to_string(),
|
||||
));
|
||||
}
|
||||
|
||||
let (page, _c) = pager.read_page(DatabaseHeader::PAGE_ID)?;
|
||||
if page.is_locked() {
|
||||
return Ok(IOResult::IO);
|
||||
}
|
||||
|
||||
turso_assert!(
|
||||
page.get().id == DatabaseHeader::PAGE_ID,
|
||||
"incorrect header page id"
|
||||
);
|
||||
|
||||
pager.add_dirty(&page);
|
||||
|
||||
Ok(IOResult::Done(Self(page)))
|
||||
}
|
||||
|
||||
pub fn borrow_mut(&self) -> RefMut<'_, DatabaseHeader> {
|
||||
let content = self.0.get_contents();
|
||||
RefMut::map(content.buffer.borrow_mut(), |buffer| {
|
||||
bytemuck::from_bytes_mut::<DatabaseHeader>(
|
||||
&mut buffer.as_mut_slice()[0..DatabaseHeader::SIZE],
|
||||
)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
pub struct PageInner {
|
||||
pub flags: AtomicUsize,
|
||||
pub contents: Option<PageContent>,
|
||||
|
||||
Reference in New Issue
Block a user