diff --git a/internal/cli/rm/rm.go b/internal/cli/rm/rm.go index 284a2a9..adb7896 100644 --- a/internal/cli/rm/rm.go +++ b/internal/cli/rm/rm.go @@ -10,11 +10,50 @@ import ( "github.com/ooni/probe-cli/internal/database" survey "gopkg.in/AlecAivazis/survey.v1" db "upper.io/db.v3" + "upper.io/db.v3/lib/sqlbuilder" ) +func deleteAll(sess sqlbuilder.Database, skipInteractive bool) error { + if skipInteractive == false { + answer := "" + confirm := &survey.Select{ + Message: fmt.Sprintf("Are you sure you wish to delete ALL results"), + Options: []string{"true", "false"}, + Default: "false", + } + survey.AskOne(confirm, &answer, nil) + if answer == "false" { + return errors.New("canceled by user") + } + } + doneResults, incompleteResults, err := database.ListResults(sess) + if err != nil { + log.WithError(err).Error("failed to list results") + return err + } + cnt := 0 + for _, result := range incompleteResults { + err = database.DeleteResult(sess, result.Result.ID) + if err == db.ErrNoMoreRows { + log.WithError(err).Errorf("failed to delete result #%d", result.Result.ID) + } + cnt++ + } + for _, result := range doneResults { + err = database.DeleteResult(sess, result.Result.ID) + if err == db.ErrNoMoreRows { + log.WithError(err).Errorf("failed to delete result #%d", result.Result.ID) + } + cnt++ + } + log.Infof("Deleted #%d measurements", cnt) + return nil +} + func init() { cmd := root.Command("rm", "Delete a result") yes := cmd.Flag("yes", "Skip interactive prompt").Bool() + all := cmd.Flag("all", "Delete all measurements").Bool() resultID := cmd.Arg("id", "the id of the result to delete").Int64() @@ -25,6 +64,10 @@ func init() { return err } + if *all == true { + return deleteAll(ctx.DB, *yes) + } + if *yes == true { err = database.DeleteResult(ctx.DB, *resultID) if err == db.ErrNoMoreRows {