use MemoryIO for ephemeral tables for wasm target

This commit is contained in:
Nikita Sivukhin
2025-09-09 11:20:24 +04:00
parent 794440606a
commit 4d80f8255f

View File

@@ -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<dyn crate::IO>;
// 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)),