feat(del): support for multi deletion

This commit is contained in:
Lewis Wynne 2025-12-17 18:18:48 +00:00
parent 52684d9e38
commit 14897ba587
6 changed files with 66 additions and 38 deletions

View file

@ -123,14 +123,21 @@ pda mv name name2 --copy
<p align="center"></p><!-- spacer --> <p align="center"></p><!-- spacer -->
`pda del` to delete a key. `pda del` to delete one or more keys.
```bash ```bash
pda del kitty pda del kitty
# Are you sure you want to delete kitty? [y/N] # remove "kitty": are you sure? [y/n]
# y
pda del kitty dog@animals
# remove "kitty", "dog@animals": are you sure? [y/n]
# y # y
# Or skip the prompt. # Or skip the prompt.
pda del kitty --force pda del kitty --force
# Delete many in one go.
pda del kitty dogs cats --force
``` ```
<p align="center"></p><!-- spacer --> <p align="center"></p><!-- spacer -->

View file

@ -32,10 +32,10 @@ import (
// delCmd represents the set command // delCmd represents the set command
var delCmd = &cobra.Command{ var delCmd = &cobra.Command{
Use: "del KEY[@DB]", Use: "del KEY[@DB] [KEY[@DB] ...]",
Short: "Delete a key. Optionally specify a db.", Short: "Delete one or more keys. Optionally specify a db.",
Aliases: []string{"delete", "rm", "remove"}, Aliases: []string{"delete", "rm", "remove"},
Args: cobra.ExactArgs(1), Args: cobra.MinimumNArgs(1),
RunE: del, RunE: del,
SilenceUsage: true, SilenceUsage: true,
} }
@ -48,22 +48,29 @@ func del(cmd *cobra.Command, args []string) error {
return err return err
} }
exists, err := keyExists(store, args[0]) targetKeys := make([]string, 0, len(args))
for _, arg := range args {
exists, err := keyExists(store, arg)
if err != nil { if err != nil {
return fmt.Errorf("cannot remove '%s': %v", args[0], err) return fmt.Errorf("cannot remove '%s': %v", arg, err)
} }
if !exists { if !exists {
return fmt.Errorf("cannot remove '%s': No such key", args[0]) return fmt.Errorf("cannot remove '%s': No such key", arg)
} }
targetKey, err := formatKeyForPrompt(store, arg)
targetKey, err := formatKeyForPrompt(store, args[0])
if err != nil { if err != nil {
return err return err
} }
targetKeys = append(targetKeys, targetKey)
}
if !force { if !force {
var confirm string var confirm string
message := fmt.Sprintf("remove %q: are you sure? (y/n)", targetKey) quotedTargets := make([]string, 0, len(targetKeys))
for _, t := range targetKeys {
quotedTargets = append(quotedTargets, fmt.Sprintf("%q", t))
}
message := fmt.Sprintf("remove %s: are you sure? (y/n)", strings.Join(quotedTargets, ", "))
fmt.Println(message) fmt.Println(message)
if _, err := fmt.Scanln(&confirm); err != nil { if _, err := fmt.Scanln(&confirm); err != nil {
return fmt.Errorf("cannot remove '%s': %v", args[0], err) return fmt.Errorf("cannot remove '%s': %v", args[0], err)
@ -73,22 +80,29 @@ func del(cmd *cobra.Command, args []string) error {
} }
} }
for _, arg := range args {
arg := arg
trans := TransactionArgs{ trans := TransactionArgs{
key: args[0], key: arg,
readonly: false, readonly: false,
sync: false, sync: false,
transact: func(tx *badger.Txn, k []byte) error { transact: func(tx *badger.Txn, k []byte) error {
if err := tx.Delete(k); errors.Is(err, badger.ErrKeyNotFound) { if err := tx.Delete(k); errors.Is(err, badger.ErrKeyNotFound) {
return fmt.Errorf("cannot remove '%s': No such key", args[0]) return fmt.Errorf("cannot remove '%s': No such key", arg)
} }
if err != nil { if err != nil {
return fmt.Errorf("cannot remove '%s': %v", args[0], err) return fmt.Errorf("cannot remove '%s': %v", arg, err)
} }
return nil return nil
}, },
} }
return store.Transaction(trans) if err := store.Transaction(trans); err != nil {
return err
}
}
return nil
} }
func init() { func init() {

7
testdata/del__multiple__ok.ct vendored Normal file
View file

@ -0,0 +1,7 @@
$ pda set a 1
$ pda set b 2
$ pda del a b --force
$ pda get a --> FAIL
Error: cannot get 'a': Key not found
$ pda get b --> FAIL
Error: cannot get 'b': Key not found

View file

@ -1,9 +1,9 @@
$ pda help del $ pda help del
$ pda del --help $ pda del --help
Delete a key. Optionally specify a db. Delete one or more keys. Optionally specify a db.
Usage: Usage:
pda del KEY[@DB] [flags] pda del KEY[@DB] [KEY[@DB] ...] [flags]
Aliases: Aliases:
del, delete, rm, remove del, delete, rm, remove
@ -11,10 +11,10 @@ Aliases:
Flags: Flags:
-f, --force Force delete without confirmation -f, --force Force delete without confirmation
-h, --help help for del -h, --help help for del
Delete a key. Optionally specify a db. Delete one or more keys. Optionally specify a db.
Usage: Usage:
pda del KEY[@DB] [flags] pda del KEY[@DB] [KEY[@DB] ...] [flags]
Aliases: Aliases:
del, delete, rm, remove del, delete, rm, remove

View file

@ -15,7 +15,7 @@ Usage:
Available Commands: Available Commands:
completion Generate the autocompletion script for the specified shell completion Generate the autocompletion script for the specified shell
cp Make a copy of a key. cp Make a copy of a key.
del Delete a key. Optionally specify a db. del Delete one or more keys. Optionally specify a db.
del-db Delete a database. del-db Delete a database.
dump Dump all key/value pairs as NDJSON dump Dump all key/value pairs as NDJSON
get Get a value for a key. Optionally specify a db. get Get a value for a key. Optionally specify a db.
@ -46,7 +46,7 @@ Usage:
Available Commands: Available Commands:
completion Generate the autocompletion script for the specified shell completion Generate the autocompletion script for the specified shell
cp Make a copy of a key. cp Make a copy of a key.
del Delete a key. Optionally specify a db. del Delete one or more keys. Optionally specify a db.
del-db Delete a database. del-db Delete a database.
dump Dump all key/value pairs as NDJSON dump Dump all key/value pairs as NDJSON
get Get a value for a key. Optionally specify a db. get Get a value for a key. Optionally specify a db.

View file

@ -14,7 +14,7 @@ Usage:
Available Commands: Available Commands:
completion Generate the autocompletion script for the specified shell completion Generate the autocompletion script for the specified shell
cp Make a copy of a key. cp Make a copy of a key.
del Delete a key. Optionally specify a db. del Delete one or more keys. Optionally specify a db.
del-db Delete a database. del-db Delete a database.
dump Dump all key/value pairs as NDJSON dump Dump all key/value pairs as NDJSON
get Get a value for a key. Optionally specify a db. get Get a value for a key. Optionally specify a db.