From 73ab65c6d2317edcda14ad966523b0596a84204e Mon Sep 17 00:00:00 2001 From: Vraj Shah Date: Fri, 10 Nov 2023 18:22:51 -0500 Subject: [PATCH] Updated MigrateDatabase Trait + related functions --- sqlx-cli/src/database.rs | 7 ++++--- sqlx-cli/src/lib.rs | 6 ++++-- sqlx-cli/src/opt.rs | 8 ++++++++ sqlx-core/src/any/driver.rs | 6 +++--- sqlx-core/src/any/migrate.rs | 6 +++--- sqlx-core/src/migrate/migrate.rs | 2 +- sqlx-mysql/src/migrate.rs | 2 +- sqlx-postgres/src/migrate.rs | 2 +- sqlx-sqlite/src/migrate.rs | 2 +- 9 files changed, 26 insertions(+), 15 deletions(-) diff --git a/sqlx-cli/src/database.rs b/sqlx-cli/src/database.rs index 9c03f85788..d751a3f875 100644 --- a/sqlx-cli/src/database.rs +++ b/sqlx-cli/src/database.rs @@ -23,7 +23,7 @@ pub async fn create(connect_opts: &ConnectOpts) -> anyhow::Result<()> { Ok(()) } -pub async fn drop(connect_opts: &ConnectOpts, confirm: bool) -> anyhow::Result<()> { +pub async fn drop(connect_opts: &ConnectOpts, confirm: bool, force: bool) -> anyhow::Result<()> { if confirm && !ask_to_continue(connect_opts) { return Ok(()); } @@ -33,7 +33,7 @@ pub async fn drop(connect_opts: &ConnectOpts, confirm: bool) -> anyhow::Result<( let exists = crate::retry_connect_errors(connect_opts, Any::database_exists).await?; if exists { - Any::drop_database(&connect_opts.database_url).await?; + Any::drop_database(&connect_opts.database_url, force).await?; } Ok(()) @@ -43,8 +43,9 @@ pub async fn reset( migration_source: &str, connect_opts: &ConnectOpts, confirm: bool, + force: bool, ) -> anyhow::Result<()> { - drop(connect_opts, confirm).await?; + drop(connect_opts, confirm, force).await?; setup(migration_source, connect_opts).await } diff --git a/sqlx-cli/src/lib.rs b/sqlx-cli/src/lib.rs index aec2392f75..2ba150c1f1 100644 --- a/sqlx-cli/src/lib.rs +++ b/sqlx-cli/src/lib.rs @@ -74,12 +74,14 @@ pub async fn run(opt: Opt) -> Result<()> { DatabaseCommand::Drop { confirmation, connect_opts, - } => database::drop(&connect_opts, !confirmation.yes).await?, + force, + } => database::drop(&connect_opts, !confirmation.yes, force).await?, DatabaseCommand::Reset { confirmation, source, connect_opts, - } => database::reset(&source, &connect_opts, !confirmation.yes).await?, + force, + } => database::reset(&source, &connect_opts, !confirmation.yes, force).await?, DatabaseCommand::Setup { source, connect_opts, diff --git a/sqlx-cli/src/opt.rs b/sqlx-cli/src/opt.rs index d2dc0732ef..8ff37d184e 100644 --- a/sqlx-cli/src/opt.rs +++ b/sqlx-cli/src/opt.rs @@ -76,6 +76,10 @@ pub enum DatabaseCommand { #[clap(flatten)] connect_opts: ConnectOpts, + + /// PostgreSQL only: force drops the database. + #[clap(long, short, default_value = "false")] + force: bool, }, /// Drops the database specified in your DATABASE_URL, re-creates it, and runs any pending migrations. @@ -88,6 +92,10 @@ pub enum DatabaseCommand { #[clap(flatten)] connect_opts: ConnectOpts, + + /// PostgreSQL only: force drops the database. + #[clap(long, short, default_value = "false")] + force: bool, }, /// Creates the database specified in your DATABASE_URL and runs any pending migrations. diff --git a/sqlx-core/src/any/driver.rs b/sqlx-core/src/any/driver.rs index b89688d8a1..c3c28acb9c 100644 --- a/sqlx-core/src/any/driver.rs +++ b/sqlx-core/src/any/driver.rs @@ -93,7 +93,7 @@ impl Debug for AnyDriver { pub struct AnyMigrateDatabase { create_database: DebugFn BoxFuture<'_, crate::Result<()>>>, database_exists: DebugFn BoxFuture<'_, crate::Result>>, - drop_database: DebugFn BoxFuture<'_, crate::Result<()>>>, + drop_database: DebugFn BoxFuture<'_, crate::Result<()>>>, } impl AnyMigrateDatabase { @@ -105,8 +105,8 @@ impl AnyMigrateDatabase { (self.database_exists)(url) } - pub fn drop_database<'a>(&self, url: &'a str) -> BoxFuture<'a, crate::Result<()>> { - (self.drop_database)(url) + pub fn drop_database<'a>(&self, url: &'a str, force: bool) -> BoxFuture<'a, crate::Result<()>> { + (self.drop_database)(url, force) } } diff --git a/sqlx-core/src/any/migrate.rs b/sqlx-core/src/any/migrate.rs index 6fd63c79f6..2ef7a4bf99 100644 --- a/sqlx-core/src/any/migrate.rs +++ b/sqlx-core/src/any/migrate.rs @@ -24,11 +24,11 @@ impl MigrateDatabase for Any { }) } - fn drop_database(url: &str) -> BoxFuture<'_, Result<(), Error>> { - Box::pin(async { + fn drop_database(url: &str, force: bool) -> BoxFuture<'_, Result<(), Error>> { + Box::pin(async move { driver::from_url_str(url)? .get_migrate_database()? - .drop_database(url) + .drop_database(url, force) .await }) } diff --git a/sqlx-core/src/migrate/migrate.rs b/sqlx-core/src/migrate/migrate.rs index 1ea64f503e..cf5c147b38 100644 --- a/sqlx-core/src/migrate/migrate.rs +++ b/sqlx-core/src/migrate/migrate.rs @@ -14,7 +14,7 @@ pub trait MigrateDatabase { // drop database in url // uses a maintenance database depending on driver - fn drop_database(url: &str) -> BoxFuture<'_, Result<(), Error>>; + fn drop_database(url: &str, _force: bool) -> BoxFuture<'_, Result<(), Error>>; } // 'e = Executor diff --git a/sqlx-mysql/src/migrate.rs b/sqlx-mysql/src/migrate.rs index dac2753e5f..8269ae167d 100644 --- a/sqlx-mysql/src/migrate.rs +++ b/sqlx-mysql/src/migrate.rs @@ -60,7 +60,7 @@ impl MigrateDatabase for MySql { }) } - fn drop_database(url: &str) -> BoxFuture<'_, Result<(), Error>> { + fn drop_database(url: &str, _force: bool) -> BoxFuture<'_, Result<(), Error>> { Box::pin(async move { let (options, database) = parse_for_maintenance(url)?; let mut conn = options.connect().await?; diff --git a/sqlx-postgres/src/migrate.rs b/sqlx-postgres/src/migrate.rs index de4103bfcc..caa32c671c 100644 --- a/sqlx-postgres/src/migrate.rs +++ b/sqlx-postgres/src/migrate.rs @@ -70,7 +70,7 @@ impl MigrateDatabase for Postgres { }) } - fn drop_database(url: &str) -> BoxFuture<'_, Result<(), Error>> { + fn drop_database(url: &str, force: bool) -> BoxFuture<'_, Result<(), Error>> { Box::pin(async move { let (options, database) = parse_for_maintenance(url)?; let mut conn = options.connect().await?; diff --git a/sqlx-sqlite/src/migrate.rs b/sqlx-sqlite/src/migrate.rs index 94a39a94f0..3ce3f68099 100644 --- a/sqlx-sqlite/src/migrate.rs +++ b/sqlx-sqlite/src/migrate.rs @@ -51,7 +51,7 @@ impl MigrateDatabase for Sqlite { }) } - fn drop_database(url: &str) -> BoxFuture<'_, Result<(), Error>> { + fn drop_database(url: &str, _force: bool) -> BoxFuture<'_, Result<(), Error>> { Box::pin(async move { let options = SqliteConnectOptions::from_str(url)?;