#![cfg(feature = "sqlite")]
use autumn_web::config::DatabaseConfig;
use autumn_web::db::{RuntimeConnection, create_pool};
use autumn_web::reexports::{diesel, diesel_async};
use diesel_async::RunQueryDsl as _;
use diesel_async::pooled_connection::deadpool::Pool;
type SqlitePool = Pool<RuntimeConnection>;
#[derive(diesel::QueryableByName)]
struct BusyTimeout {
#[diesel(sql_type = diesel::sql_types::Integer)]
timeout: i32,
}
#[derive(diesel::QueryableByName)]
struct JournalMode {
#[diesel(sql_type = diesel::sql_types::Text)]
journal_mode: String,
}
#[tokio::test]
async fn pooled_sqlite_connections_configure_busy_timeout_and_journal_mode() {
let tmp = tempfile::TempDir::new().expect("temp dir");
let db_path = tmp.path().join("pragmas.db");
let url = format!("sqlite://{}", db_path.display());
let config = DatabaseConfig {
url: Some(url),
primary_pool_size: Some(4),
..Default::default()
};
let pool: SqlitePool = create_pool(&config)
.expect("sqlite pool builds via build_sqlite_pool")
.expect("a url is configured");
{
let mut conn = pool.get().await.expect("checkout a sqlite connection");
diesel::sql_query("CREATE TABLE t (id INTEGER PRIMARY KEY)")
.execute(&mut *conn)
.await
.expect("create table");
}
let mut conn = pool.get().await.expect("checkout a second connection");
let rows: Vec<BusyTimeout> = diesel::sql_query("PRAGMA busy_timeout")
.load(&mut *conn)
.await
.expect("read busy_timeout pragma");
let timeout = rows
.into_iter()
.next()
.expect("busy_timeout pragma returns a row")
.timeout;
assert_eq!(
timeout, 5000,
"every pooled connection must carry the configured busy_timeout (ms), \
mirroring crate::sync::store"
);
let rows: Vec<JournalMode> = diesel::sql_query("PRAGMA journal_mode")
.load(&mut *conn)
.await
.expect("read journal_mode pragma");
let mode = rows
.into_iter()
.next()
.expect("journal_mode pragma returns a row")
.journal_mode;
assert_eq!(
mode.to_ascii_lowercase(),
"wal",
"file-backed pooled connections must use the deliberate WAL journal mode"
);
}