diff --git a/cmd/signaldctl/cmd/db/migrate.go b/cmd/signaldctl/cmd/db/migrate.go index 122e499..cec0139 100644 --- a/cmd/signaldctl/cmd/db/migrate.go +++ b/cmd/signaldctl/cmd/db/migrate.go @@ -60,7 +60,7 @@ var ( } return nil }, - RunE: func(cmd *cobra.Command, args []string) error { + RunE: func(cmd *cobra.Command, args []string) (err error) { source, err := sql.Open("sqlite3", sqlitePath) if err != nil { return err @@ -93,83 +93,44 @@ var ( } log.Println("created schema") - if err := moveAccounts(source, dest); err != nil { - log.Println("error moving accounts table") - return err - } - log.Println("moved accounts table") + 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 := moveRecipients(source, dest); err != nil { - log.Println("error moving recipients table") - return err + migrate := func(fn func(*sql.DB, *sql.DB) error, targetName string) { + if err = fn(source, dest); err != nil { + log.Println("error moving", targetName) + panic(err) + } + log.Println("moved", targetName) } - log.Println("moved recipients table") + defer func() { + if r := recover(); r != nil && r != err { + // If r is something other than the error returned via the named return, re-panic it + panic(r) + } + }() - if err := movePrekeys(source, dest); err != nil { - log.Println("error moving prekeys table") - return err - } - log.Println("moved prekeys table") - - if err := moveSessions(source, dest); err != nil { - log.Println("error moving sessions table") - return err - } - log.Println("moved sessions table") - - if err := moveSignedPrekeys(source, dest); err != nil { - log.Println("error moving signed prekeys table") - return err - } - log.Println("moved signed prekeys table") - - if err := moveIdentityKeys(source, dest); err != nil { - log.Println("error moving identity keys table") - return err - } - log.Println("moved identity keys table") - - if err := moveAccountData(source, dest); err != nil { - log.Println("error moving account data") - return err - } - log.Println("moved account data table") - - if err := movePendingAccountData(source, dest); err != nil { - log.Println("error moving pending account data tabe") - return err - } - log.Println("moved pending account data table") - - if err := moveSenderKeys(source, dest); err != nil { - log.Println("error moving sender keys table") - return err - } - log.Println("moved sender keys table") - - if err := moveSenderKeyShared(source, dest); err != nil { - log.Println("error moving sender key shared table") - return err - } - log.Println("moved sender key shared table") - - if err := moveGroups(source, dest); err != nil { - log.Println("error moving groups table") - return err - } - log.Println("moved groups table") - - if err := moveGroupCredentials(source, dest); err != nil { - log.Println("error moving group credentials table") - return err - } - log.Println("moved group credentials table") - - if err := moveContacts(source, dest); err != nil { - log.Println("error moving group credentials table") - return err - } - log.Println("moved contacts table") + migrate(moveAccounts, "accounts table") + migrate(moveRecipients, "recipients table") + migrate(movePrekeys, "prekeys table") + migrate(moveSessions, "sessions table") + migrate(moveSignedPrekeys, "signed prekeys table") + migrate(moveIdentityKeys, "identity keys table") + migrate(moveAccountData, "account data") + migrate(movePendingAccountData, "pending account data table") + migrate(moveSenderKeys, "sender keys table") + migrate(moveSenderKeyShared, "sender key shared table") + migrate(moveGroups, "groups table") + migrate(moveGroupCredentials, "group credentials table") + migrate(moveContacts, "contacts table") if err := moveProfileKeys(source, dest); err != nil { log.Println("error moving profile keys table") @@ -199,6 +160,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 +215,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 { @@ -614,7 +581,9 @@ func moveGroupCredentials(source *sql.DB, dest *sql.DB) error { } func moveContacts(source *sql.DB, dest *sql.DB) error { - rows, err := source.Query("SELECT account_uuid, recipient, name, color, profile_key, message_expiration_time, inbox_position FROM contacts") + rows, err := source.Query("SELECT account_uuid, recipient, name, color, profile_key, message_expiration_time, inbox_position FROM contacts" + + " WHERE account_uuid IN (SELECT DISTINCT uuid FROM accounts)", + ) if err != nil { return err }