Skip to content

Commit 6d3fef8

Browse files
committed
perf: check and create the md index in the clarity db
1 parent b1545ee commit 6d3fef8

File tree

2 files changed

+53
-6
lines changed

2 files changed

+53
-6
lines changed

clarity/src/vm/database/sqlite.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -254,16 +254,13 @@ impl SqliteConnection {
254254

255255
Ok(())
256256
}
257+
257258
pub fn memory() -> Result<Connection> {
258259
let contract_db = SqliteConnection::inner_open(":memory:")?;
259260
SqliteConnection::initialize_conn(&contract_db)?;
260261
Ok(contract_db)
261262
}
262-
pub fn open(filename: &str) -> Result<Connection> {
263-
let contract_db = SqliteConnection::inner_open(filename)?;
264-
SqliteConnection::check_schema(&contract_db)?;
265-
Ok(contract_db)
266-
}
263+
267264
pub fn check_schema(conn: &Connection) -> Result<()> {
268265
let sql = "SELECT sql FROM sqlite_master WHERE name=?";
269266
let _: String = conn
@@ -272,10 +269,13 @@ impl SqliteConnection {
272269
let _: String = conn
273270
.query_row(sql, params!["metadata_table"], |row| row.get(0))
274271
.map_err(|x| InterpreterError::SqliteError(IncomparableError { err: x }))?;
272+
let _: String = conn
273+
.query_row(sql, params!["md_blockhashes"], |row| row.get(0))
274+
.map_err(|x| InterpreterError::SqliteError(IncomparableError { err: x }))?;
275275
Ok(())
276276
}
277277

278-
pub fn inner_open(filename: &str) -> Result<Connection> {
278+
fn inner_open(filename: &str) -> Result<Connection> {
279279
let conn = Connection::open(filename)
280280
.map_err(|x| InterpreterError::SqliteError(IncomparableError { err: x }))?;
281281

stackslib/src/clarity_vm/clarity.rs

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1940,6 +1940,7 @@ impl ClarityTransactionConnection<'_, '_> {
19401940
#[cfg(test)]
19411941
mod tests {
19421942
use std::fs;
1943+
use std::path::PathBuf;
19431944

19441945
use clarity::vm::analysis::errors::CheckErrors;
19451946
use clarity::vm::database::{ClarityBackingStore, STXBalance};
@@ -1950,10 +1951,56 @@ mod tests {
19501951
use stacks_common::types::sqlite::NO_PARAMS;
19511952

19521953
use super::*;
1954+
use crate::chainstate::stacks::index::marf::{MARFOpenOpts, MarfConnection as _};
19531955
use crate::chainstate::stacks::index::ClarityMarfTrieId;
19541956
use crate::clarity_vm::database::marf::MarfedKV;
19551957
use crate::core::{PEER_VERSION_EPOCH_1_0, PEER_VERSION_EPOCH_2_0, PEER_VERSION_EPOCH_2_05};
19561958

1959+
#[test]
1960+
pub fn create_md_index() {
1961+
let path_db = "/tmp/stacks-node-tests/creat_md_index";
1962+
let mut path = PathBuf::from(path_db);
1963+
1964+
std::fs::create_dir_all(&path).unwrap();
1965+
1966+
path.push("marf.sqlite");
1967+
let marf_path = path.to_str().unwrap().to_string();
1968+
1969+
let mut marf_opts = MARFOpenOpts::default();
1970+
marf_opts.external_blobs = true;
1971+
1972+
let mut marf: MARF<StacksBlockId> = MARF::from_path(&marf_path, marf_opts).unwrap();
1973+
1974+
let tx = marf.storage_tx().unwrap();
1975+
1976+
tx.query_row("PRAGMA journal_mode = WAL;", NO_PARAMS, |_row| Ok(()))
1977+
.unwrap();
1978+
1979+
tx.execute(
1980+
"CREATE TABLE IF NOT EXISTS data_table
1981+
(key TEXT PRIMARY KEY, value TEXT)",
1982+
NO_PARAMS,
1983+
)
1984+
.unwrap();
1985+
1986+
tx.execute(
1987+
"CREATE TABLE IF NOT EXISTS metadata_table
1988+
(key TEXT NOT NULL, blockhash TEXT, value TEXT,
1989+
UNIQUE (key, blockhash))",
1990+
NO_PARAMS,
1991+
)
1992+
.unwrap();
1993+
1994+
tx.commit().unwrap();
1995+
1996+
assert!(SqliteConnection::check_schema(marf.sqlite_conn()).is_err());
1997+
1998+
MarfedKV::open(path_db, None, None).unwrap();
1999+
2000+
// schema should be good now
2001+
assert!(SqliteConnection::check_schema(marf.sqlite_conn()).is_ok());
2002+
}
2003+
19572004
#[test]
19582005
pub fn bad_syntax_test() {
19592006
let marf = MarfedKV::temporary();

0 commit comments

Comments
 (0)