1use flow_core::Result;
2use rusqlite::Connection;
3use std::time::Duration;
4
5pub fn init_connection(conn: &Connection) -> Result<()> {
7 conn.pragma_update(None, "journal_mode", "WAL")
9 .map_err(|e| flow_core::FlowError::Database(format!("failed to set WAL mode: {e}")))?;
10
11 conn.pragma_update(None, "synchronous", "NORMAL")
13 .map_err(|e| {
14 flow_core::FlowError::Database(format!("failed to set synchronous mode: {e}"))
15 })?;
16
17 conn.pragma_update(None, "cache_size", -64000)
19 .map_err(|e| flow_core::FlowError::Database(format!("failed to set cache size: {e}")))?;
20
21 conn.pragma_update(None, "temp_store", "MEMORY")
23 .map_err(|e| flow_core::FlowError::Database(format!("failed to set temp_store: {e}")))?;
24
25 conn.pragma_update(None, "mmap_size", 30_000_000_000_i64)
27 .map_err(|e| flow_core::FlowError::Database(format!("failed to set mmap_size: {e}")))?;
28
29 conn.busy_timeout(Duration::from_millis(1000))
31 .map_err(|e| flow_core::FlowError::Database(format!("failed to set busy timeout: {e}")))?;
32
33 Ok(())
34}
35
36#[cfg(test)]
37mod tests {
38 use super::*;
39
40 #[test]
41 fn test_init_connection() {
42 let conn = Connection::open_in_memory().unwrap();
43 init_connection(&conn).unwrap();
44
45 let journal_mode: String = conn
48 .pragma_query_value(None, "journal_mode", |row| row.get(0))
49 .unwrap();
50 assert_eq!(journal_mode.to_uppercase(), "MEMORY");
51
52 let cache_size: i32 = conn
54 .pragma_query_value(None, "cache_size", |row| row.get(0))
55 .unwrap();
56 assert_eq!(cache_size, -64000);
57 }
58}