mod context;
mod migrations;
use std::sync::Arc;
use migratex::{Metadata, Migratex, SqliteMetadata, SqliteStorage, connect_to_sqlite};
use okerr::Result;
use sqlx::SqlitePool;
use context::MigContext;
use migrations::migrations;
#[tokio::main]
async fn main() -> Result<()> {
let db_file = "app.db";
let pool = connect_to_sqlite(db_file.into()).await?;
migrate(&pool, db_file).await?;
Ok(())
}
async fn migrate(pool: &SqlitePool, db_file: &str) -> Result<()> {
println!("=== Migratex SQLx Example ===\n");
println!("Database file: {}\n", db_file);
let storage = SqliteStorage::new(Arc::new(pool.clone()));
println!("✓ Connected to database {}\n", db_file);
let mut meta = SqliteMetadata::load_or_init(&storage).await?;
let initial_version = meta.version();
println!("Initial metadata:");
println!(" Version: {}", meta.version());
println!(" Status: {:?}", meta.status());
println!(" App version: {}", meta.app_version());
println!(" Created at: {}", meta.created_at());
println!(" Updated at: {}\n", meta.updated_at());
let mut ctx = MigContext::new(storage.pool.clone());
let migs = migrations();
let mut mx = Migratex::new(&mut ctx, &mut meta, migs);
println!("Latest migration version: {}\n", mx.latest_version());
println!("Running migrations...\n");
mx.migrate_to_latest().await?;
println!("\nFinal metadata:");
println!(" Version: {}", meta.version());
println!(" Status: {:?}", meta.status());
println!(" App version: {}", meta.app_version());
println!(" Updated at: {}\n", meta.updated_at());
meta.save(&storage).await?;
println!("\n=== Migration Complete ===");
if meta.version() == initial_version {
println!("✓ Nothing to migrate");
} else {
println!("✓ Metadata saved to database");
}
println!("\nYou can inspect the database:");
println!(r#" sqlite3 "{}""#, db_file);
println!(" .tables");
println!(" SELECT * FROM _migratex_metadata;");
println!(" .schema users");
println!(" .schema subscriptions");
println!(" .schema products");
Ok(())
}