feat: Implement basic remove command which modifies the index

This commit is contained in:
Felicitas Pojtinger
2021-11-21 14:02:21 +01:00
parent aefbe4bbce
commit b78e577ed0
3 changed files with 66 additions and 6 deletions

47
cmd/stbak/cmd/remove.go Normal file
View File

@@ -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)
}

View File

@@ -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)

View File

@@ -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
}