feat(del): support for multi deletion
This commit is contained in:
parent
52684d9e38
commit
14897ba587
6 changed files with 66 additions and 38 deletions
11
README.md
11
README.md
|
|
@ -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 -->
|
||||||
|
|
|
||||||
40
cmd/del.go
40
cmd/del.go
|
|
@ -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
7
testdata/del__multiple__ok.ct
vendored
Normal 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
|
||||||
8
testdata/help__del__ok.ct
vendored
8
testdata/help__del__ok.ct
vendored
|
|
@ -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
|
||||||
|
|
|
||||||
4
testdata/help__ok.ct
vendored
4
testdata/help__ok.ct
vendored
|
|
@ -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.
|
||||||
|
|
|
||||||
2
testdata/root__ok.ct
vendored
2
testdata/root__ok.ct
vendored
|
|
@ -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.
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue