summaryrefslogtreecommitdiff
path: root/src/bin/migrate.rs
diff options
context:
space:
mode:
authormo khan <mo@mokhan.ca>2025-06-11 14:06:07 -0600
committermo khan <mo@mokhan.ca>2025-06-11 14:06:07 -0600
commitd612e590cb4f5b633abc316f2e105924226a7d6f (patch)
tree84103cfbc80099745fedfa2d9f22118dbf539eb5 /src/bin/migrate.rs
parent6abae9d4b410bad780635f361d183d043089cf57 (diff)
Add database migrations
Diffstat (limited to 'src/bin/migrate.rs')
-rw-r--r--src/bin/migrate.rs61
1 files changed, 61 insertions, 0 deletions
diff --git a/src/bin/migrate.rs b/src/bin/migrate.rs
new file mode 100644
index 0000000..9afdbf0
--- /dev/null
+++ b/src/bin/migrate.rs
@@ -0,0 +1,61 @@
+use anyhow::Result;
+use rusqlite::Connection;
+use sts::{Config, MigrationRunner};
+use std::env;
+
+fn main() -> Result<()> {
+ let args: Vec<String> = env::args().collect();
+
+ if args.len() < 2 {
+ print_usage();
+ return Ok(());
+ }
+
+ let config = Config::from_env();
+ let conn = Connection::open(&config.database_path)?;
+ let runner = MigrationRunner::new(&conn);
+
+ match args[1].as_str() {
+ "up" => {
+ println!("Running migrations...");
+ runner.run_migrations()?;
+ }
+ "status" => {
+ runner.show_migration_status()?;
+ }
+ "rollback" => {
+ if args.len() < 3 {
+ eprintln!("Error: rollback requires a version number");
+ eprintln!("Usage: cargo run --bin migrate rollback <version>");
+ return Ok(());
+ }
+ let version: i32 = args[2].parse()
+ .map_err(|_| anyhow::anyhow!("Invalid version number: {}", args[2]))?;
+ runner.rollback_to_version(version)?;
+ }
+ _ => {
+ eprintln!("Error: Unknown command '{}'", args[1]);
+ print_usage();
+ }
+ }
+
+ Ok(())
+}
+
+fn print_usage() {
+ println!("OAuth2 STS Migration Tool");
+ println!("========================");
+ println!("");
+ println!("Usage:");
+ println!(" cargo run --bin migrate up # Run pending migrations");
+ println!(" cargo run --bin migrate status # Show migration status");
+ println!(" cargo run --bin migrate rollback <version> # Rollback to version");
+ println!("");
+ println!("Environment Variables:");
+ println!(" DATABASE_PATH Path to SQLite database (default: oauth.db)");
+ println!("");
+ println!("Examples:");
+ println!(" cargo run --bin migrate up");
+ println!(" cargo run --bin migrate status");
+ println!(" cargo run --bin migrate rollback 0");
+} \ No newline at end of file