From f464d15f8b048b0dcc83d7a04c9d9e97838f3abe Mon Sep 17 00:00:00 2001 From: meteorgan Date: Fri, 25 Apr 2025 21:45:18 +0800 Subject: [PATCH] refactor database open_file and open --- bindings/javascript/src/lib.rs | 17 +++-------------- bindings/wasm/lib.rs | 16 ++-------------- core/lib.rs | 26 ++++++++++++-------------- 3 files changed, 17 insertions(+), 42 deletions(-) diff --git a/bindings/javascript/src/lib.rs b/bindings/javascript/src/lib.rs index 2e0054358..aa18b208c 100644 --- a/bindings/javascript/src/lib.rs +++ b/bindings/javascript/src/lib.rs @@ -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, diff --git a/bindings/wasm/lib.rs b/bindings/wasm/lib.rs index a704706be..95984ebcf 100644 --- a/bindings/wasm/lib.rs +++ b/bindings/wasm/lib.rs @@ -19,22 +19,10 @@ impl Database { #[wasm_bindgen(constructor)] pub fn new(path: &str) -> Database { let io: Arc = 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 } } diff --git a/core/lib.rs b/core/lib.rs index 9d5508e2d..aa25f3c94 100644 --- a/core/lib.rs +++ b/core/lib.rs @@ -109,48 +109,46 @@ unsafe impl Sync for Database {} impl Database { #[cfg(feature = "fs")] pub fn open_file(io: Arc, path: &str, enable_mvcc: bool) -> Result> { - 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, + path: &str, db_file: Arc, - shared_wal: Arc>, enable_mvcc: bool, ) -> Result> { 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,