nils-memo-cli 0.3.3

CLI crate for nils-memo-cli in the nils-cli workspace.
Documentation
use rusqlite::{Connection, params};

use crate::errors::AppError;

const SCHEMA_VERSION: i64 = 1;
const SCHEMA_V1_SQL: &str = include_str!("sql/schema_v1.sql");

pub fn apply(conn: &Connection) -> Result<(), AppError> {
    conn.execute_batch(
        "create table if not exists schema_migrations (
            version integer primary key,
            applied_at text not null default (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))
        );",
    )
    .map_err(AppError::db_write)?;

    let already_applied: i64 = conn
        .query_row(
            "select count(*) from schema_migrations where version = ?1",
            params![SCHEMA_VERSION],
            |row| row.get(0),
        )
        .map_err(AppError::db_query)?;

    if already_applied == 0 {
        conn.execute_batch(SCHEMA_V1_SQL)
            .map_err(AppError::db_write)?;
        conn.execute(
            "insert into schema_migrations(version) values(?1)",
            params![SCHEMA_VERSION],
        )
        .map_err(AppError::db_write)?;
    }

    Ok(())
}