use crate::connection::Connection;
use crate::database::{Database, SystemConfig};
use crate::query_result::QueryResult;
pub use akar_common::types::Value;
use std::sync::Arc;
pub fn setup_db() -> (Arc<Database>, Connection) {
let dir = tempfile::tempdir().unwrap();
let db_path = dir.path().join("test_db");
let config = SystemConfig::default();
let database = Arc::new(Database::new(db_path, config).unwrap());
let conn = Connection::new(&database);
std::mem::forget(dir);
(database, conn)
}
pub fn setup_db_on_disk() -> (tempfile::TempDir, Arc<Database>, Connection) {
let dir = tempfile::tempdir().unwrap();
let db_path = dir.path().join("test_db");
let config = SystemConfig::default();
let database = Arc::new(Database::new(db_path, config).unwrap());
let conn = Connection::new(&database);
(dir, database, conn)
}
pub fn setup_db_with_checkpoint(threshold: i64) -> (Arc<Database>, Connection, tempfile::TempDir) {
let dir = tempfile::tempdir().unwrap();
let db_path = dir.path().join("test_db");
let config = SystemConfig {
checkpoint_threshold: threshold,
..SystemConfig::default()
};
let database = Arc::new(Database::new(db_path, config).unwrap());
let conn = Connection::new(&database);
(database, conn, dir)
}
pub fn exec(conn: &Connection, query: &str) -> String {
let result = conn.query(query).unwrap();
assert!(
result.is_success(),
"Query failed: {query} -> {:?}",
result.error_message
);
result.result_summary()
}
pub fn exec_ok(conn: &Connection, sql: &str) -> Result<String, String> {
conn.query(sql).map(|r| r.to_string())
}
pub fn exec_err(conn: &Connection, query: &str) -> String {
let result = conn.query(query);
match result {
Err(e) => e,
Ok(r) => {
if r.is_success() {
panic!("Expected error for query: {query}, got success: {}", r.result_summary());
}
r.error_message.unwrap_or_else(|| "Unknown error".into())
}
}
}
pub fn query(conn: &Connection, sql: &str) -> QueryResult {
conn.query(sql).unwrap()
}
pub fn query_result(conn: &Connection, sql: &str) -> Result<QueryResult, String> {
conn.query(sql)
}
pub fn query_column(conn: &Connection, sql: &str) -> Vec<Value> {
let result = conn.query(sql).unwrap();
result
.chunks
.iter()
.flat_map(|c| (0..c.size).filter_map(|i| c.get_value(0, i)))
.collect()
}
pub fn query_values(conn: &Connection, query: &str) -> String {
let result = conn.query(query).unwrap();
assert!(
result.is_success(),
"Query failed: {query} -> {:?}",
result.error_message
);
let mut out = String::new();
for chunk in &result.chunks {
for row in chunk.iter_rows() {
for (col_idx, field) in chunk.fields.iter().enumerate() {
if field.is_null(row) {
out.push_str("null ");
} else if let Some(v) = chunk.get_value(col_idx, row) {
out.push_str(&format!("{v:?} "));
}
}
out.push('\n');
}
}
out
}