refactor database open_file and open

This commit is contained in:
meteorgan 2025-04-25 21:45:18 +08:00
parent 7137f4ab3b
commit f464d15f8b
3 changed files with 17 additions and 42 deletions

View file

@ -4,7 +4,7 @@ use std::cell::RefCell;
use std::rc::Rc;
use std::sync::Arc;
use limbo_core::{Clock, Instant};
use limbo_core::{maybe_init_database_file, Clock, Instant};
use napi::{Env, JsUnknown, Result as NapiResult};
use napi_derive::napi;
@ -29,20 +29,9 @@ impl Database {
let file = io
.open_file(&path, limbo_core::OpenFlags::Create, false)
.unwrap();
limbo_core::maybe_init_database_file(&file, &io).unwrap();
maybe_init_database_file(&file, &io).unwrap();
let db_file = Arc::new(DatabaseFile::new(file));
let db_header = limbo_core::Pager::begin_open(db_file.clone()).unwrap();
// ensure db header is there
io.run_once().unwrap();
let page_size = db_header.lock().page_size;
let wal_path = format!("{}-wal", path);
let wal_shared =
limbo_core::WalFileShared::open_shared(&io, wal_path.as_str(), page_size).unwrap();
let db = limbo_core::Database::open(io, db_file, wal_shared, false).unwrap();
let db = limbo_core::Database::open(io, &path, db_file, false).unwrap();
let conn = db.connect().unwrap();
Self {
memory,

View file

@ -19,22 +19,10 @@ impl Database {
#[wasm_bindgen(constructor)]
pub fn new(path: &str) -> Database {
let io: Arc<dyn limbo_core::IO> = Arc::new(PlatformIO { vfs: VFS::new() });
let file = io
.open_file(path, limbo_core::OpenFlags::Create, false)
.unwrap();
let file = io.open_file(path, OpenFlags::Create, false).unwrap();
maybe_init_database_file(&file, &io).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();
let page_size = db_header.lock().page_size;
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, db_file, wal_shared, false).unwrap();
let db = limbo_core::Database::open(io, path, db_file, false).unwrap();
let conn = db.connect().unwrap();
Database { db, conn }
}

View file

@ -109,48 +109,46 @@ unsafe impl Sync for Database {}
impl Database {
#[cfg(feature = "fs")]
pub fn open_file(io: Arc<dyn IO>, path: &str, enable_mvcc: bool) -> Result<Arc<Database>> {
use storage::wal::WalFileShared;
let file = io.open_file(path, OpenFlags::Create, true)?;
maybe_init_database_file(&file, &io)?;
let db_file = Arc::new(DatabaseFile::new(file));
let wal_path = format!("{}-wal", path);
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, db_file, wal_shared, enable_mvcc)
Self::open(io, path, db_file, enable_mvcc)
}
#[allow(clippy::arc_with_non_send_sync)]
pub fn open(
io: Arc<dyn IO>,
path: &str,
db_file: Arc<dyn DatabaseStorage>,
shared_wal: Arc<UnsafeCell<WalFileShared>>,
enable_mvcc: bool,
) -> Result<Arc<Database>> {
let db_header = Pager::begin_open(db_file.clone())?;
io.run_once()?;
let page_size = db_header.lock().page_size;
let wal_path = format!("{}-wal", path);
let shared_wal = WalFileShared::open_shared(&io, wal_path.as_str(), page_size)?;
DATABASE_VERSION.get_or_init(|| {
let version = db_header.lock().version_number;
version.to_string()
});
let mv_store = if enable_mvcc {
Some(Rc::new(MvStore::new(
crate::mvcc::LocalClock::new(),
crate::mvcc::persistent_storage::Storage::new_noop(),
mvcc::LocalClock::new(),
mvcc::persistent_storage::Storage::new_noop(),
)))
} else {
None
};
let shared_page_cache = Arc::new(RwLock::new(DumbLruPageCache::new(10)));
let page_size = db_header.lock().page_size;
let header = db_header;
let schema = Arc::new(RwLock::new(Schema::new()));
let db = Database {
mv_store,
schema: schema.clone(),
header: header.clone(),
header: db_header.clone(),
shared_page_cache: shared_page_cache.clone(),
shared_wal: shared_wal.clone(),
db_file,