feat: Implement basic remove command which modifies the index
This commit is contained in:
47
cmd/stbak/cmd/remove.go
Normal file
47
cmd/stbak/cmd/remove.go
Normal 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)
|
||||
}
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user