diff --git a/cmd/stbak/cmd/remove.go b/cmd/stbak/cmd/remove.go new file mode 100644 index 0000000..2a155d8 --- /dev/null +++ b/cmd/stbak/cmd/remove.go @@ -0,0 +1,47 @@ +package cmd + +import ( + "context" + "log" + + "github.com/pojntfx/stfs/pkg/persisters" + "github.com/spf13/cobra" + "github.com/spf13/viper" +) + +const ( + nameFlag = "name" +) + +var removeCmd = &cobra.Command{ + Use: "remove", + Aliases: []string{"r"}, + Short: "Remove a file from tape or tar file and index", + RunE: func(cmd *cobra.Command, args []string) error { + if err := viper.BindPFlags(cmd.PersistentFlags()); err != nil { + return err + } + + metadataPersister := persisters.NewMetadataPersister(viper.GetString(dbFlag)) + if err := metadataPersister.Open(); err != nil { + return err + } + + hdr, err := metadataPersister.DeleteHeader(context.Background(), viper.GetString(nameFlag)) + if err != nil { + return err + } + + log.Println(hdr.Record, hdr.Block) + + return nil + }, +} + +func init() { + removeCmd.PersistentFlags().StringP(nameFlag, "n", "", "Name of the file to remove") + + viper.AutomaticEnv() + + rootCmd.AddCommand(removeCmd) +} diff --git a/cmd/stbak/cmd/root.go b/cmd/stbak/cmd/root.go index e111c9a..3808a27 100644 --- a/cmd/stbak/cmd/root.go +++ b/cmd/stbak/cmd/root.go @@ -33,10 +33,10 @@ func Execute() { if err != nil { panic(err) } - workingDirDefault := filepath.Join(home, ".local", "share", "stcache", "var", "lib", "stcache") + dbPath := filepath.Join(home, ".local", "share", "stbak", "var", "lib", "stbak", "metadata.sqlite") rootCmd.PersistentFlags().StringP(tapeFlag, "t", "/dev/nst0", "Tape or tar file to use") - rootCmd.PersistentFlags().StringP(dbFlag, "d", filepath.Join(workingDirDefault, "index.sqlite"), "Database to use") + rootCmd.PersistentFlags().StringP(dbFlag, "d", dbPath, "Database to use") if err := viper.BindPFlags(rootCmd.PersistentFlags()); err != nil { panic(err) diff --git a/pkg/persisters/metadata.go b/pkg/persisters/metadata.go index 935ff72..4b2c6ec 100644 --- a/pkg/persisters/metadata.go +++ b/pkg/persisters/metadata.go @@ -32,7 +32,7 @@ func NewMetadataPersister(dbPath string) *MetadataPersister { } } -func (c *MetadataPersister) UpsertHeader(ctx context.Context, record, block int64, hdr *tar.Header) error { +func (p *MetadataPersister) UpsertHeader(ctx context.Context, record, block int64, hdr *tar.Header) error { paxRecords, err := json.Marshal(hdr.PAXRecords) if err != nil { return err @@ -59,9 +59,9 @@ func (c *MetadataPersister) UpsertHeader(ctx context.Context, record, block int6 Format: int64(hdr.Format), } - if _, err := models.FindHeader(ctx, c.db, dbhdr.Name, models.HeaderColumns.Name); err != nil { + if _, err := models.FindHeader(ctx, p.db, dbhdr.Name, models.HeaderColumns.Name); err != nil { if err == sql.ErrNoRows { - if err := dbhdr.Insert(ctx, c.db, boil.Infer()); err != nil { + if err := dbhdr.Insert(ctx, p.db, boil.Infer()); err != nil { return err } @@ -71,7 +71,7 @@ func (c *MetadataPersister) UpsertHeader(ctx context.Context, record, block int6 return err } - if _, err := dbhdr.Update(ctx, c.db, boil.Infer()); err != nil { + if _, err := dbhdr.Update(ctx, p.db, boil.Infer()); err != nil { return err } @@ -81,3 +81,16 @@ func (c *MetadataPersister) UpsertHeader(ctx context.Context, record, block int6 func (p *MetadataPersister) GetHeaders(ctx context.Context) (models.HeaderSlice, error) { return models.Headers().All(ctx, p.db) } + +func (p *MetadataPersister) DeleteHeader(ctx context.Context, name string) (*models.Header, error) { + hdr, err := models.FindHeader(ctx, p.db, name, models.HeaderColumns.Name, models.HeaderColumns.Record, models.HeaderColumns.Block) + if err != nil { + return nil, err + } + + if _, err := hdr.Delete(ctx, p.db); err != nil { + return nil, err + } + + return hdr, nil +}