VDBE: use temporary on-disk file for OpenEphemeral

This commit is contained in:
Jussi Saurio
2025-07-29 09:28:52 +03:00
parent 3b27d25b20
commit 8c6293ebb7

View File

@@ -2,7 +2,7 @@
use crate::function::AlterTableFunc;
use crate::numeric::{NullableInteger, Numeric};
use crate::storage::btree::{integrity_check, IntegrityCheckError, IntegrityCheckState};
use crate::storage::database::FileMemoryStorage;
use crate::storage::database::DatabaseFile;
use crate::storage::page_cache::DumbLruPageCache;
use crate::storage::pager::{AtomicDbState, CreateBTreeFlags, DbState};
use crate::storage::sqlite3_ondisk::read_varint;
@@ -30,6 +30,7 @@ use crate::{
},
IO,
};
use std::env::temp_dir;
use std::ops::DerefMut;
use std::{
borrow::BorrowMut,
@@ -6374,12 +6375,22 @@ pub fn op_open_ephemeral(
OpOpenEphemeralState::Start => {
tracing::trace!("Start");
let conn = program.connection.clone();
let io = conn.pager.borrow().io.get_memory_io();
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 file = io.open_file("", OpenFlags::Create, true)?;
let db_file = Arc::new(FileMemoryStorage::new(file));
let buffer_pool = Arc::new(BufferPool::new(None));
let buffer_pool = Arc::new(BufferPool::new(Some(header_accessor::get_page_size(
&conn.pager.borrow(),
)? as usize)));
let page_cache = Arc::new(RwLock::new(DumbLruPageCache::default()));
let pager = Rc::new(Pager::new(