1use std::path::Path;
10
11use rusqlite::Connection;
12
13use crate::error::Result;
14use crate::paths::Paths;
15
16mod embedded {
17 use refinery::embed_migrations;
18 embed_migrations!("./migrations");
19}
20
21pub fn open(paths: &Paths) -> Result<Connection> {
25 open_at(&paths.db_file())
26}
27
28pub fn open_at(path: &Path) -> Result<Connection> {
29 if let Some(parent) = path.parent() {
30 std::fs::create_dir_all(parent)?;
31 }
32 let mut conn = Connection::open(path)?;
33 conn.pragma_update(None, "journal_mode", "WAL")?;
34 conn.pragma_update(None, "foreign_keys", "ON")?;
35 embedded::migrations::runner().run(&mut conn)?;
36 Ok(conn)
37}
38
39pub fn schema_version(conn: &Connection) -> Result<Option<u32>> {
41 let v: Option<u32> = conn
42 .query_row(
43 "SELECT MAX(version) FROM refinery_schema_history",
44 [],
45 |row| row.get(0),
46 )
47 .ok();
48 Ok(v)
49}