From f15260d1cab57ef3e18d288a927c9c14f57d2db1 Mon Sep 17 00:00:00 2001
From: Andrew Ferrazzutti <andrewf@element.io>
Date: Thu, 11 Aug 2022 10:37:39 -0400
Subject: [PATCH] Drop postgres schema on failed migration

If db-move fails, don't leave behind a partially-created postgres DB
that will block attempts at future migrations.

Only delete schemas created by the current db-move, lest a valid,
pre-existing postgres DB exists that shouldn't be deleted.
---
 cmd/signaldctl/cmd/db/migrate.go | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)

diff --git a/cmd/signaldctl/cmd/db/migrate.go b/cmd/signaldctl/cmd/db/migrate.go
index 122e499..416ca3f 100644
--- a/cmd/signaldctl/cmd/db/migrate.go
+++ b/cmd/signaldctl/cmd/db/migrate.go
@@ -93,6 +93,17 @@ var (
 			}
 			log.Println("created schema")
 
+			ok := false
+			defer func() {
+				if !ok {
+					if err := dropSchema(dest); err != nil {
+						log.Println("error dropping schema in postgres after failed migration:", err)
+					} else {
+						log.Println("dropped schema in postgres after failed migration")
+					}
+				}
+			}()
+
 			if err := moveAccounts(source, dest); err != nil {
 				log.Println("error moving accounts table")
 				return err
@@ -199,6 +210,7 @@ var (
 				log.Println("error deleting sqlite file")
 				return err
 			}
+			ok = true
 			log.Println("sqlite file deleted, your data is now in postgres :)")
 			return nil
 		},
@@ -253,6 +265,11 @@ func createSchema(dest *sql.DB) error {
 	return nil
 }
 
+func dropSchema(dest *sql.DB) error {
+	_, err := dest.Exec("DROP OWNED BY CURRENT_ROLE CASCADE")
+	return err
+}
+
 func moveAccounts(source *sql.DB, dest *sql.DB) error {
 	rows, err := source.Query("SELECT uuid, e164, server FROM accounts")
 	if err != nil {