// Copyright 2015 The etcd Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package command import ( "fmt" "github.com/coreos/etcd/clientv3" "github.com/spf13/cobra" ) var ( delPrefix bool delPrevKV bool delFromKey bool ) // NewDelCommand returns the cobra command for "del". func NewDelCommand() *cobra.Command { cmd := &cobra.Command{ Use: "del [options] [range_end]", Short: "Removes the specified key or range of keys [key, range_end)", Run: delCommandFunc, } cmd.Flags().BoolVar(&delPrefix, "prefix", false, "delete keys with matching prefix") cmd.Flags().BoolVar(&delPrevKV, "prev-kv", false, "return deleted key-value pairs") cmd.Flags().BoolVar(&delFromKey, "from-key", false, "delete keys that are greater than or equal to the given key using byte compare") return cmd } // delCommandFunc executes the "del" command. func delCommandFunc(cmd *cobra.Command, args []string) { key, opts := getDelOp(cmd, args) ctx, cancel := commandCtx(cmd) resp, err := mustClientFromCmd(cmd).Delete(ctx, key, opts...) cancel() if err != nil { ExitWithError(ExitError, err) } display.Del(*resp) } func getDelOp(cmd *cobra.Command, args []string) (string, []clientv3.OpOption) { if len(args) == 0 || len(args) > 2 { ExitWithError(ExitBadArgs, fmt.Errorf("del command needs one argument as key and an optional argument as range_end.")) } if delPrefix && delFromKey { ExitWithError(ExitBadArgs, fmt.Errorf("`--prefix` and `--from-key` cannot be set at the same time, choose one.")) } opts := []clientv3.OpOption{} key := args[0] if len(args) > 1 { if delPrefix || delFromKey { ExitWithError(ExitBadArgs, fmt.Errorf("too many arguments, only accept one argument when `--prefix` or `--from-key` is set.")) } opts = append(opts, clientv3.WithRange(args[1])) } if delPrefix { if len(key) == 0 { key = "\x00" opts = append(opts, clientv3.WithFromKey()) } else { opts = append(opts, clientv3.WithPrefix()) } } if delPrevKV { opts = append(opts, clientv3.WithPrevKV()) } if delFromKey { if len(key) == 0 { key = "\x00" } opts = append(opts, clientv3.WithFromKey()) } return key, opts }