mirror of
https://github.com/tursodatabase/limbo.git
synced 2025-08-04 10:08:20 +00:00
core: Rename FileStorage to DatabaseFile
This commit is contained in:
parent
1f29e1fe08
commit
df6af6ed79
6 changed files with 47 additions and 46 deletions
|
@ -21,8 +21,8 @@ impl Database {
|
|||
.open_file(path, limbo_core::OpenFlags::Create, false)
|
||||
.unwrap();
|
||||
maybe_init_database_file(&file, &io).unwrap();
|
||||
let page_io = Arc::new(DatabaseStorage::new(file));
|
||||
let db_header = Pager::begin_open(page_io.clone()).unwrap();
|
||||
let db_file = Arc::new(DatabaseFile::new(file));
|
||||
let db_header = Pager::begin_open(db_file.clone()).unwrap();
|
||||
|
||||
// ensure db header is there
|
||||
io.run_once().unwrap();
|
||||
|
@ -32,7 +32,7 @@ impl Database {
|
|||
let wal_path = format!("{}-wal", path);
|
||||
let wal_shared = WalFileShared::open_shared(&io, wal_path.as_str(), page_size).unwrap();
|
||||
|
||||
let db = limbo_core::Database::open(io, page_io, wal_shared, false).unwrap();
|
||||
let db = limbo_core::Database::open(io, db_file, wal_shared, false).unwrap();
|
||||
let conn = db.connect().unwrap();
|
||||
Database { db, conn }
|
||||
}
|
||||
|
@ -315,19 +315,20 @@ extern "C" {
|
|||
fn toISOString(this: &Date) -> String;
|
||||
}
|
||||
|
||||
pub struct DatabaseStorage {
|
||||
pub struct DatabaseFile {
|
||||
file: Arc<dyn limbo_core::File>,
|
||||
}
|
||||
unsafe impl Send for DatabaseStorage {}
|
||||
unsafe impl Sync for DatabaseStorage {}
|
||||
|
||||
impl DatabaseStorage {
|
||||
unsafe impl Send for DatabaseFile {}
|
||||
unsafe impl Sync for DatabaseFile {}
|
||||
|
||||
impl DatabaseFile {
|
||||
pub fn new(file: Arc<dyn limbo_core::File>) -> Self {
|
||||
Self { file }
|
||||
}
|
||||
}
|
||||
|
||||
impl limbo_core::DatabaseStorage for DatabaseStorage {
|
||||
impl limbo_core::DatabaseStorage for DatabaseFile {
|
||||
fn read_page(&self, page_idx: usize, c: limbo_core::Completion) -> Result<()> {
|
||||
let r = match c {
|
||||
limbo_core::Completion::Read(ref r) => r,
|
||||
|
|
18
core/lib.rs
18
core/lib.rs
|
@ -47,7 +47,7 @@ use std::{
|
|||
};
|
||||
use storage::btree::btree_init_page;
|
||||
#[cfg(feature = "fs")]
|
||||
use storage::database::FileStorage;
|
||||
use storage::database::DatabaseFile;
|
||||
pub use storage::{
|
||||
buffer_pool::BufferPool,
|
||||
database::DatabaseStorage,
|
||||
|
@ -84,7 +84,7 @@ pub struct Database {
|
|||
schema: Arc<RwLock<Schema>>,
|
||||
// TODO: make header work without lock
|
||||
header: Arc<SpinLock<DatabaseHeader>>,
|
||||
page_io: Arc<dyn DatabaseStorage>,
|
||||
db_file: Arc<dyn DatabaseStorage>,
|
||||
io: Arc<dyn IO>,
|
||||
page_size: u16,
|
||||
// Shared structures of a Database are the parts that are common to multiple threads that might
|
||||
|
@ -103,23 +103,23 @@ impl Database {
|
|||
|
||||
let file = io.open_file(path, OpenFlags::Create, true)?;
|
||||
maybe_init_database_file(&file, &io)?;
|
||||
let page_io = Arc::new(FileStorage::new(file));
|
||||
let db_file = Arc::new(DatabaseFile::new(file));
|
||||
let wal_path = format!("{}-wal", path);
|
||||
let db_header = Pager::begin_open(page_io.clone())?;
|
||||
let db_header = Pager::begin_open(db_file.clone())?;
|
||||
io.run_once()?;
|
||||
let page_size = db_header.lock().page_size;
|
||||
let wal_shared = WalFileShared::open_shared(&io, wal_path.as_str(), page_size)?;
|
||||
Self::open(io, page_io, wal_shared, enable_mvcc)
|
||||
Self::open(io, db_file, wal_shared, enable_mvcc)
|
||||
}
|
||||
|
||||
#[allow(clippy::arc_with_non_send_sync)]
|
||||
pub fn open(
|
||||
io: Arc<dyn IO>,
|
||||
page_io: Arc<dyn DatabaseStorage>,
|
||||
db_file: Arc<dyn DatabaseStorage>,
|
||||
shared_wal: Arc<RwLock<WalFileShared>>,
|
||||
enable_mvcc: bool,
|
||||
) -> Result<Arc<Database>> {
|
||||
let db_header = Pager::begin_open(page_io.clone())?;
|
||||
let db_header = Pager::begin_open(db_file.clone())?;
|
||||
io.run_once()?;
|
||||
DATABASE_VERSION.get_or_init(|| {
|
||||
let version = db_header.lock().version_number;
|
||||
|
@ -143,7 +143,7 @@ impl Database {
|
|||
header: header.clone(),
|
||||
shared_page_cache: shared_page_cache.clone(),
|
||||
shared_wal: shared_wal.clone(),
|
||||
page_io,
|
||||
db_file,
|
||||
io: io.clone(),
|
||||
page_size,
|
||||
};
|
||||
|
@ -172,7 +172,7 @@ impl Database {
|
|||
)));
|
||||
let pager = Rc::new(Pager::finish_open(
|
||||
self.header.clone(),
|
||||
self.page_io.clone(),
|
||||
self.db_file.clone(),
|
||||
wal,
|
||||
self.io.clone(),
|
||||
self.shared_page_cache.clone(),
|
||||
|
|
|
@ -3159,7 +3159,7 @@ mod tests {
|
|||
use super::*;
|
||||
use crate::fast_lock::SpinLock;
|
||||
use crate::io::{Buffer, Completion, MemoryIO, OpenFlags, IO};
|
||||
use crate::storage::database::FileStorage;
|
||||
use crate::storage::database::DatabaseFile;
|
||||
use crate::storage::page_cache::DumbLruPageCache;
|
||||
use crate::storage::sqlite3_ondisk;
|
||||
use crate::storage::sqlite3_ondisk::DatabaseHeader;
|
||||
|
@ -3443,7 +3443,7 @@ mod tests {
|
|||
#[allow(clippy::arc_with_non_send_sync)]
|
||||
let io: Arc<dyn IO> = Arc::new(MemoryIO::new());
|
||||
let io_file = io.open_file("test.db", OpenFlags::Create, false).unwrap();
|
||||
let page_io = Arc::new(FileStorage::new(io_file));
|
||||
let db_file = Arc::new(DatabaseFile::new(io_file));
|
||||
|
||||
let buffer_pool = Rc::new(BufferPool::new(db_header.page_size as usize));
|
||||
let wal_shared = WalFileShared::open_shared(&io, "test.wal", db_header.page_size).unwrap();
|
||||
|
@ -3453,7 +3453,7 @@ mod tests {
|
|||
let page_cache = Arc::new(parking_lot::RwLock::new(DumbLruPageCache::new(10)));
|
||||
let pager = {
|
||||
let db_header = Arc::new(SpinLock::new(db_header.clone()));
|
||||
Pager::finish_open(db_header, page_io, wal, io, page_cache, buffer_pool).unwrap()
|
||||
Pager::finish_open(db_header, db_file, wal, io, page_cache, buffer_pool).unwrap()
|
||||
};
|
||||
let pager = Rc::new(pager);
|
||||
let page1 = pager.allocate_page().unwrap();
|
||||
|
@ -3700,7 +3700,7 @@ mod tests {
|
|||
}
|
||||
|
||||
let io: Arc<dyn IO> = Arc::new(MemoryIO::new());
|
||||
let page_io = Arc::new(FileStorage::new(
|
||||
let db_file = Arc::new(DatabaseFile::new(
|
||||
io.open_file("test.db", OpenFlags::Create, false).unwrap(),
|
||||
));
|
||||
|
||||
|
@ -3714,7 +3714,7 @@ mod tests {
|
|||
|
||||
let write_complete = Box::new(|_| {});
|
||||
let c = Completion::Write(WriteCompletion::new(write_complete));
|
||||
page_io.write_page(1, buf.clone(), c).unwrap();
|
||||
db_file.write_page(1, buf.clone(), c).unwrap();
|
||||
|
||||
let wal_shared = WalFileShared::open_shared(&io, "test.wal", page_size).unwrap();
|
||||
let wal = Rc::new(RefCell::new(WalFile::new(
|
||||
|
@ -3727,7 +3727,7 @@ mod tests {
|
|||
let pager = Rc::new(
|
||||
Pager::finish_open(
|
||||
db_header.clone(),
|
||||
page_io,
|
||||
db_file,
|
||||
wal,
|
||||
io,
|
||||
Arc::new(parking_lot::RwLock::new(DumbLruPageCache::new(10))),
|
||||
|
@ -3765,7 +3765,7 @@ mod tests {
|
|||
let write_complete = Box::new(|_| {});
|
||||
let c = Completion::Write(WriteCompletion::new(write_complete));
|
||||
pager
|
||||
.page_io
|
||||
.db_file
|
||||
.write_page(current_page as usize, buf.clone(), c)?;
|
||||
pager.io.run_once()?;
|
||||
|
||||
|
|
|
@ -20,17 +20,17 @@ pub trait DatabaseStorage: Send + Sync {
|
|||
}
|
||||
|
||||
#[cfg(feature = "fs")]
|
||||
pub struct FileStorage {
|
||||
pub struct DatabaseFile {
|
||||
file: Arc<dyn crate::io::File>,
|
||||
}
|
||||
|
||||
#[cfg(feature = "fs")]
|
||||
unsafe impl Send for FileStorage {}
|
||||
unsafe impl Send for DatabaseFile {}
|
||||
#[cfg(feature = "fs")]
|
||||
unsafe impl Sync for FileStorage {}
|
||||
unsafe impl Sync for DatabaseFile {}
|
||||
|
||||
#[cfg(feature = "fs")]
|
||||
impl DatabaseStorage for FileStorage {
|
||||
impl DatabaseStorage for DatabaseFile {
|
||||
fn read_page(&self, page_idx: usize, c: Completion) -> Result<()> {
|
||||
let r = c.as_read();
|
||||
let size = r.buf().len();
|
||||
|
@ -64,7 +64,7 @@ impl DatabaseStorage for FileStorage {
|
|||
}
|
||||
|
||||
#[cfg(feature = "fs")]
|
||||
impl FileStorage {
|
||||
impl DatabaseFile {
|
||||
pub fn new(file: Arc<dyn crate::io::File>) -> Self {
|
||||
Self { file }
|
||||
}
|
||||
|
|
|
@ -153,7 +153,7 @@ struct FlushInfo {
|
|||
/// transaction management.
|
||||
pub struct Pager {
|
||||
/// Source of the database pages.
|
||||
pub page_io: Arc<dyn DatabaseStorage>,
|
||||
pub db_file: Arc<dyn DatabaseStorage>,
|
||||
/// The write-ahead log (WAL) for the database.
|
||||
wal: Rc<RefCell<dyn Wal>>,
|
||||
/// A page cache for the database.
|
||||
|
@ -173,21 +173,21 @@ pub struct Pager {
|
|||
|
||||
impl Pager {
|
||||
/// Begins opening a database by reading the database header.
|
||||
pub fn begin_open(page_io: Arc<dyn DatabaseStorage>) -> Result<Arc<SpinLock<DatabaseHeader>>> {
|
||||
sqlite3_ondisk::begin_read_database_header(page_io)
|
||||
pub fn begin_open(db_file: Arc<dyn DatabaseStorage>) -> Result<Arc<SpinLock<DatabaseHeader>>> {
|
||||
sqlite3_ondisk::begin_read_database_header(db_file)
|
||||
}
|
||||
|
||||
/// Completes opening a database by initializing the Pager with the database header.
|
||||
pub fn finish_open(
|
||||
db_header_ref: Arc<SpinLock<DatabaseHeader>>,
|
||||
page_io: Arc<dyn DatabaseStorage>,
|
||||
db_file: Arc<dyn DatabaseStorage>,
|
||||
wal: Rc<RefCell<dyn Wal>>,
|
||||
io: Arc<dyn crate::io::IO>,
|
||||
page_cache: Arc<RwLock<DumbLruPageCache>>,
|
||||
buffer_pool: Rc<BufferPool>,
|
||||
) -> Result<Self> {
|
||||
Ok(Self {
|
||||
page_io,
|
||||
db_file,
|
||||
wal,
|
||||
page_cache,
|
||||
io,
|
||||
|
@ -285,7 +285,7 @@ impl Pager {
|
|||
return Ok(page);
|
||||
}
|
||||
sqlite3_ondisk::begin_read_page(
|
||||
self.page_io.clone(),
|
||||
self.db_file.clone(),
|
||||
self.buffer_pool.clone(),
|
||||
page.clone(),
|
||||
page_idx,
|
||||
|
@ -316,7 +316,7 @@ impl Pager {
|
|||
return Ok(());
|
||||
}
|
||||
sqlite3_ondisk::begin_read_page(
|
||||
self.page_io.clone(),
|
||||
self.db_file.clone(),
|
||||
self.buffer_pool.clone(),
|
||||
page.clone(),
|
||||
id,
|
||||
|
@ -407,7 +407,7 @@ impl Pager {
|
|||
};
|
||||
}
|
||||
FlushState::SyncDbFile => {
|
||||
sqlite3_ondisk::begin_sync(self.page_io.clone(), self.syncing.clone())?;
|
||||
sqlite3_ondisk::begin_sync(self.db_file.clone(), self.syncing.clone())?;
|
||||
self.flush_info.borrow_mut().state = FlushState::WaitSyncDbFile;
|
||||
}
|
||||
FlushState::WaitSyncDbFile => {
|
||||
|
@ -444,7 +444,7 @@ impl Pager {
|
|||
};
|
||||
}
|
||||
CheckpointState::SyncDbFile => {
|
||||
sqlite3_ondisk::begin_sync(self.page_io.clone(), self.syncing.clone())?;
|
||||
sqlite3_ondisk::begin_sync(self.db_file.clone(), self.syncing.clone())?;
|
||||
self.checkpoint_state
|
||||
.replace(CheckpointState::WaitSyncDbFile);
|
||||
}
|
||||
|
|
|
@ -244,7 +244,7 @@ impl Default for DatabaseHeader {
|
|||
}
|
||||
|
||||
pub fn begin_read_database_header(
|
||||
page_io: Arc<dyn DatabaseStorage>,
|
||||
db_file: Arc<dyn DatabaseStorage>,
|
||||
) -> Result<Arc<SpinLock<DatabaseHeader>>> {
|
||||
let drop_fn = Rc::new(|_buf| {});
|
||||
#[allow(clippy::arc_with_non_send_sync)]
|
||||
|
@ -256,7 +256,7 @@ pub fn begin_read_database_header(
|
|||
finish_read_database_header(buf, header).unwrap();
|
||||
});
|
||||
let c = Completion::Read(ReadCompletion::new(buf, complete));
|
||||
page_io.read_page(1, c)?;
|
||||
db_file.read_page(1, c)?;
|
||||
Ok(result)
|
||||
}
|
||||
|
||||
|
@ -297,7 +297,7 @@ fn finish_read_database_header(
|
|||
}
|
||||
|
||||
pub fn begin_write_database_header(header: &DatabaseHeader, pager: &Pager) -> Result<()> {
|
||||
let page_source = pager.page_io.clone();
|
||||
let page_source = pager.db_file.clone();
|
||||
let header = Rc::new(header.clone());
|
||||
|
||||
let drop_fn = Rc::new(|_buf| {});
|
||||
|
@ -700,7 +700,7 @@ impl PageContent {
|
|||
}
|
||||
|
||||
pub fn begin_read_page(
|
||||
page_io: Arc<dyn DatabaseStorage>,
|
||||
db_file: Arc<dyn DatabaseStorage>,
|
||||
buffer_pool: Rc<BufferPool>,
|
||||
page: PageRef,
|
||||
page_idx: usize,
|
||||
|
@ -720,7 +720,7 @@ pub fn begin_read_page(
|
|||
}
|
||||
});
|
||||
let c = Completion::Read(ReadCompletion::new(buf, complete));
|
||||
page_io.read_page(page_idx, c)?;
|
||||
db_file.read_page(page_idx, c)?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
|
@ -755,7 +755,7 @@ pub fn begin_write_btree_page(
|
|||
write_counter: Rc<RefCell<usize>>,
|
||||
) -> Result<()> {
|
||||
trace!("begin_write_btree_page(page={})", page.get().id);
|
||||
let page_source = &pager.page_io;
|
||||
let page_source = &pager.db_file;
|
||||
let page_finish = page.clone();
|
||||
|
||||
let page_id = page.get().id;
|
||||
|
@ -786,7 +786,7 @@ pub fn begin_write_btree_page(
|
|||
Ok(())
|
||||
}
|
||||
|
||||
pub fn begin_sync(page_io: Arc<dyn DatabaseStorage>, syncing: Rc<RefCell<bool>>) -> Result<()> {
|
||||
pub fn begin_sync(db_file: Arc<dyn DatabaseStorage>, syncing: Rc<RefCell<bool>>) -> Result<()> {
|
||||
assert!(!*syncing.borrow());
|
||||
*syncing.borrow_mut() = true;
|
||||
let completion = Completion::Sync(SyncCompletion {
|
||||
|
@ -794,7 +794,7 @@ pub fn begin_sync(page_io: Arc<dyn DatabaseStorage>, syncing: Rc<RefCell<bool>>)
|
|||
*syncing.borrow_mut() = false;
|
||||
}),
|
||||
});
|
||||
page_io.sync(completion)?;
|
||||
db_file.sync(completion)?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue