From 4d80f8255fb5c7a3cf6fee7df5ff4601e1a139f8 Mon Sep 17 00:00:00 2001 From: Nikita Sivukhin Date: Tue, 9 Sep 2025 11:20:24 +0400 Subject: [PATCH] use MemoryIO for ephemeral tables for wasm target --- core/vdbe/execute.rs | 40 +++++++++++++++++++++++++++++----------- 1 file changed, 29 insertions(+), 11 deletions(-) diff --git a/core/vdbe/execute.rs b/core/vdbe/execute.rs index 0b2347aa2..10e60eece 100644 --- a/core/vdbe/execute.rs +++ b/core/vdbe/execute.rs @@ -6974,16 +6974,34 @@ pub fn op_open_ephemeral( let conn = program.connection.clone(); let io = conn.pager.borrow().io.clone(); let rand_num = io.generate_random_number(); - let temp_dir = temp_dir(); - let rand_path = - std::path::Path::new(&temp_dir).join(format!("tursodb-ephemeral-{rand_num}")); - let Some(rand_path_str) = rand_path.to_str() else { - return Err(LimboError::InternalError( - "Failed to convert path to string".to_string(), - )); - }; - let file = io.open_file(rand_path_str, OpenFlags::Create, false)?; - let db_file = Arc::new(DatabaseFile::new(file)); + let db_file; + let db_file_io: Arc; + + // we support OPFS in WASM - but it require files to be pre-opened in the browser before use + // we can fix this if we will make open_file interface async + // but for now for simplicity we use MemoryIO for all intermediate calculations + #[cfg(target_family = "wasm")] + { + use crate::MemoryIO; + + db_file_io = Arc::new(MemoryIO::new()); + let file = db_file_io.open_file("temp-file", OpenFlags::Create, false)?; + db_file = Arc::new(DatabaseFile::new(file)); + } + #[cfg(not(target_family = "wasm"))] + { + let temp_dir = temp_dir(); + let rand_path = + std::path::Path::new(&temp_dir).join(format!("tursodb-ephemeral-{rand_num}")); + let Some(rand_path_str) = rand_path.to_str() else { + return Err(LimboError::InternalError( + "Failed to convert path to string".to_string(), + )); + }; + let file = io.open_file(rand_path_str, OpenFlags::Create, false)?; + db_file = Arc::new(DatabaseFile::new(file)); + db_file_io = io; + } let page_size = pager .io @@ -6996,7 +7014,7 @@ pub fn op_open_ephemeral( let pager = Rc::new(Pager::new( db_file, None, - io, + db_file_io, page_cache, buffer_pool.clone(), Arc::new(AtomicDbState::new(DbState::Uninitialized)),