From cff778464e4ef9d77a388102c65318131a75350e Mon Sep 17 00:00:00 2001 From: Ben Johnson Date: Wed, 30 Dec 2020 16:10:48 -0700 Subject: [PATCH] Add 'databases' command. --- cmd/litestream/databases.go | 76 +++++++++++++++++++++++++++++++++++ cmd/litestream/generations.go | 4 -- cmd/litestream/main.go | 2 + cmd/litestream/replicate.go | 4 -- cmd/litestream/restore.go | 4 -- cmd/litestream/snapshots.go | 4 -- cmd/litestream/wal.go | 4 -- 7 files changed, 78 insertions(+), 20 deletions(-) create mode 100644 cmd/litestream/databases.go diff --git a/cmd/litestream/databases.go b/cmd/litestream/databases.go new file mode 100644 index 0000000..b43d174 --- /dev/null +++ b/cmd/litestream/databases.go @@ -0,0 +1,76 @@ +package main + +import ( + "context" + "errors" + "flag" + "fmt" + "os" + "strings" + "text/tabwriter" +) + +type DatabasesCommand struct{} + +func (c *DatabasesCommand) Run(ctx context.Context, args []string) (err error) { + var configPath string + fs := flag.NewFlagSet("litestream-databases", flag.ContinueOnError) + registerConfigFlag(fs, &configPath) + fs.Usage = c.Usage + if err := fs.Parse(args); err != nil { + return err + } else if fs.NArg() != 0 { + return fmt.Errorf("too many argument") + } + + // Load configuration. + if configPath == "" { + return errors.New("-config required") + } + config, err := ReadConfigFile(configPath) + if err != nil { + return err + } + + // List all databases. + w := tabwriter.NewWriter(os.Stdout, 0, 8, 1, '\t', 0) + fmt.Fprintln(w, "path\treplicas") + for _, dbConfig := range config.DBs { + db, err := newDBFromConfig(dbConfig) + if err != nil { + return err + } + + var replicaNames []string + for _, r := range db.Replicas { + replicaNames = append(replicaNames, r.Name()) + } + + fmt.Fprintf(w, "%s\t%s\n", + db.Path(), + strings.Join(replicaNames, ","), + ) + } + w.Flush() + + return nil +} + +func (c *DatabasesCommand) Usage() { + fmt.Printf(` +The databases command lists all databases in the configuration file. + +Usage: + + litestream databases [arguments] + +Arguments: + + -config PATH + Specifies the configuration file. + Defaults to %s + +`[1:], + DefaultConfigPath, + ) +} diff --git a/cmd/litestream/generations.go b/cmd/litestream/generations.go index 49313cd..8020b50 100644 --- a/cmd/litestream/generations.go +++ b/cmd/litestream/generations.go @@ -14,10 +14,6 @@ import ( type GenerationsCommand struct{} -func NewGenerationsCommand() *GenerationsCommand { - return &GenerationsCommand{} -} - func (c *GenerationsCommand) Run(ctx context.Context, args []string) (err error) { var configPath string fs := flag.NewFlagSet("litestream-generations", flag.ContinueOnError) diff --git a/cmd/litestream/main.go b/cmd/litestream/main.go index 7af31e3..ddfc1d5 100644 --- a/cmd/litestream/main.go +++ b/cmd/litestream/main.go @@ -48,6 +48,8 @@ func (m *Main) Run(ctx context.Context, args []string) (err error) { } switch cmd { + case "databases": + return (&DatabasesCommand{}).Run(ctx, args) case "generations": return (&GenerationsCommand{}).Run(ctx, args) case "replicate": diff --git a/cmd/litestream/replicate.go b/cmd/litestream/replicate.go index 361e5c9..222744d 100644 --- a/cmd/litestream/replicate.go +++ b/cmd/litestream/replicate.go @@ -19,10 +19,6 @@ type ReplicateCommand struct { DBs []*litestream.DB } -func NewReplicateCommand() *ReplicateCommand { - return &ReplicateCommand{} -} - // Run loads all databases specified in the configuration. func (c *ReplicateCommand) Run(ctx context.Context, args []string) (err error) { fs := flag.NewFlagSet("litestream-replicate", flag.ContinueOnError) diff --git a/cmd/litestream/restore.go b/cmd/litestream/restore.go index 985a002..ebd01e4 100644 --- a/cmd/litestream/restore.go +++ b/cmd/litestream/restore.go @@ -17,10 +17,6 @@ type RestoreCommand struct { DBPath string } -func NewRestoreCommand() *RestoreCommand { - return &RestoreCommand{} -} - func (c *RestoreCommand) Run(ctx context.Context, args []string) (err error) { var configPath string var opt litestream.RestoreOptions diff --git a/cmd/litestream/snapshots.go b/cmd/litestream/snapshots.go index b1f5dbc..7a3f4d6 100644 --- a/cmd/litestream/snapshots.go +++ b/cmd/litestream/snapshots.go @@ -15,10 +15,6 @@ import ( type SnapshotsCommand struct{} -func NewSnapshotsCommand() *SnapshotsCommand { - return &SnapshotsCommand{} -} - func (c *SnapshotsCommand) Run(ctx context.Context, args []string) (err error) { var configPath string fs := flag.NewFlagSet("litestream-snapshots", flag.ContinueOnError) diff --git a/cmd/litestream/wal.go b/cmd/litestream/wal.go index 07d6b3b..16dd23f 100644 --- a/cmd/litestream/wal.go +++ b/cmd/litestream/wal.go @@ -15,10 +15,6 @@ import ( type WALCommand struct{} -func NewWALCommand() *WALCommand { - return &WALCommand{} -} - func (c *WALCommand) Run(ctx context.Context, args []string) (err error) { var configPath string fs := flag.NewFlagSet("litestream-wal", flag.ContinueOnError)