From 0ae66d3263783bbca072c77fc0ceb6f6414c50f7 Mon Sep 17 00:00:00 2001 From: Felicitas Pojtinger Date: Wed, 24 Nov 2021 20:07:51 +0100 Subject: [PATCH] feat: Add `ls` equivalent to `query` cmd --- cmd/stbak/cmd/query.go | 4 +++- pkg/persisters/metadata.go | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/cmd/stbak/cmd/query.go b/cmd/stbak/cmd/query.go index c72e684..e92065f 100644 --- a/cmd/stbak/cmd/query.go +++ b/cmd/stbak/cmd/query.go @@ -24,7 +24,7 @@ var queryCmd = &cobra.Command{ return err } - headers, err := metadataPersister.GetHeaders(context.Background()) + headers, err := metadataPersister.GetHeaderDirectChildren(context.Background(), viper.GetString(nameFlag)) if err != nil { return err } @@ -51,6 +51,8 @@ var queryCmd = &cobra.Command{ } func init() { + queryCmd.PersistentFlags().StringP(nameFlag, "n", "", "Name of the file or directory to query") + viper.AutomaticEnv() rootCmd.AddCommand(queryCmd) diff --git a/pkg/persisters/metadata.go b/pkg/persisters/metadata.go index 309decf..e79b59e 100644 --- a/pkg/persisters/metadata.go +++ b/pkg/persisters/metadata.go @@ -68,6 +68,39 @@ func (p *MetadataPersister) GetHeaderChildren(ctx context.Context, name string) ).All(ctx, p.db) } +func (p *MetadataPersister) GetHeaderDirectChildren(ctx context.Context, name string) (models.HeaderSlice, error) { + if name == "" || name == "." || name == "/" { + return p.GetHeaders(ctx) + } + + prefixWithoutTrailingSlash := strings.TrimSuffix(name, "/") + prefixWithTrailingSlash := prefixWithoutTrailingSlash + "/%" + + headers := models.HeaderSlice{} + if err := queries.Raw( + fmt.Sprintf( + `select * from %v where %v = ? or %v = ? or (%v like ? and %v not like ?)`, + models.TableNames.Headers, + models.HeaderColumns.Name, + models.HeaderColumns.Name, + models.HeaderColumns.Name, + models.HeaderColumns.Name, + ), + prefixWithoutTrailingSlash, + prefixWithTrailingSlash, + prefixWithTrailingSlash, + prefixWithTrailingSlash+"/%", + ).Bind(ctx, p.db, &headers); err != nil { + if err == sql.ErrNoRows { + return headers, nil + } + + return nil, err + } + + return headers, nil +} + func (p *MetadataPersister) DeleteHeader(ctx context.Context, name string, ignoreNotExists bool) (*models.Header, error) { hdr, err := models.FindHeader(ctx, p.db, name) if err != nil {