use rusqlite::Connection;
use crate::error::{Error, Result};
pub const SCHEMA_VERSION: i64 = 1;
const SCHEMA_V1: &str = include_str!("schema.sql");
pub(crate) fn migrate(conn: &mut Connection) -> Result<()> {
loop {
let version: i64 = conn.query_row("PRAGMA user_version", [], |r| r.get(0))?;
match version {
SCHEMA_VERSION => return Ok(()),
v if v > SCHEMA_VERSION => {
return Err(Error::SchemaTooNew {
found: v,
supported: SCHEMA_VERSION,
});
}
0 => apply_step(conn, SCHEMA_V1, 1)?,
v => unreachable!("no migration path from version {v}"),
}
}
}
fn apply_step(conn: &mut Connection, sql: &str, target: i64) -> Result<()> {
let tx = conn.transaction()?;
tx.execute_batch(sql)?;
tx.pragma_update(None, "user_version", target)?;
tx.commit()?;
Ok(())
}