Files
core/test/rust/performance/database/setup.rs
T
2026-11-03 03:32:07 +00:00

75 lines
2.7 KiB
Rust

// PostgreSQL 只读取显式测试连接;每个比较进程创建并删除独占 schema。
struct PostgresSchema {
database: dever_runtime::database::Database,
drop_sql: &'static str,
}
impl PostgresSchema {
fn close(self, runtime: &Runtime) {
runtime
.run(async |scope| {
self.database
.executor()
.await
.unwrap()
.initialize(scope, self.drop_sql)
.await
.unwrap();
})
.unwrap();
self.database.close();
}
}
fn database_settings(
runtime: &Runtime,
directory: &std::path::Path,
settings: &std::path::Path,
relative: &str,
) -> Option<PostgresSchema> {
if !POSTGRES {
std::fs::write(settings, format!(r#"{{"database":{{"default":{{"type":"sqlite","path":"{relative}/case.db","max_connections":1,"max_page_size":20}}}}}}"#)).unwrap();
return None;
}
let test_settings = std::env::var_os("DEVER_BENCH_POSTGRES_SETTINGS")
.expect("PostgreSQL benchmarks require an explicit isolated test configuration");
let config: serde_json::Value =
serde_json::from_slice(&std::fs::read(test_settings).unwrap()).unwrap();
let mut connection = config["database"]["postgres_test"].clone();
let options: dever_runtime::database::Options =
serde_json::from_value(connection.clone()).unwrap();
assert_eq!(options.driver, "postgres");
let name = format!("dever_bench_{}", std::process::id());
let create_sql: &'static str = Box::leak(format!("CREATE SCHEMA {name}").into_boxed_str());
let drop_sql = Box::leak(format!("DROP SCHEMA {name} CASCADE").into_boxed_str());
let database = runtime
.run(async |scope| {
let database = dever_runtime::database::Database::open(directory, options, scope)
.await
.unwrap();
database
.executor()
.await
.unwrap()
.initialize(scope, create_sql)
.await
.unwrap();
database
})
.unwrap();
let url = connection["url"].as_str().unwrap();
assert!(
!url.contains('?'),
"test connection must not override schema options"
);
connection["url"] = format!("{url}?options=-csearch_path%3D{name}").into();
connection["max_connections"] = 1.into();
connection["max_page_size"] = 20.into();
std::fs::write(
settings,
serde_json::to_vec(&serde_json::json!({"database":{"default":connection}})).unwrap(),
)
.unwrap();
Some(PostgresSchema { database, drop_sql })
}