From d54071f2a826768ccc0c6220f44968aea6f40a08 Mon Sep 17 00:00:00 2001 From: Julien Cassis Date: Fri, 10 Mar 2023 21:00:30 -0500 Subject: [PATCH 1/2] wip --- cmd/kvdb/common.go | 22 +++++ cmd/kvdb/decoder.go | 8 ++ cmd/kvdb/decoder/ascii.go | 10 +++ cmd/kvdb/decoder/hex.go | 12 +++ cmd/kvdb/decoder/interface.go | 30 +++++++ cmd/kvdb/decoder/proto.go | 77 +++++++++++++++++ cmd/kvdb/main.go | 88 +++++++++++++++++++ cmd/kvdb/read_get.go | 55 ++++++++++++ cmd/kvdb/read_scan.go | 65 ++++++++++++++ go.mod | 45 +++++++--- go.sum | 154 +++++++++++++++++++++++++++++++--- 11 files changed, 546 insertions(+), 20 deletions(-) create mode 100644 cmd/kvdb/common.go create mode 100644 cmd/kvdb/decoder.go create mode 100644 cmd/kvdb/decoder/ascii.go create mode 100644 cmd/kvdb/decoder/hex.go create mode 100644 cmd/kvdb/decoder/interface.go create mode 100644 cmd/kvdb/decoder/proto.go create mode 100644 cmd/kvdb/main.go create mode 100644 cmd/kvdb/read_get.go create mode 100644 cmd/kvdb/read_scan.go diff --git a/cmd/kvdb/common.go b/cmd/kvdb/common.go new file mode 100644 index 0000000..e833bd5 --- /dev/null +++ b/cmd/kvdb/common.go @@ -0,0 +1,22 @@ +package main + +import ( + "fmt" + + "github.com/spf13/viper" + "github.com/streamingfast/kvdb/store" + "go.uber.org/zap" +) + +func getKV() (store.KVStore, error) { + dsn := viper.GetString("global-dsn") + if dsn == "" { + return nil, fmt.Errorf("dsn is required") + } + zlog.Info("setting up store", zap.String("dsn", dsn)) + s, err := store.New(dsn) + if err != nil { + return nil, fmt.Errorf("create store: %w", err) + } + return s, nil +} diff --git a/cmd/kvdb/decoder.go b/cmd/kvdb/decoder.go new file mode 100644 index 0000000..f59aa28 --- /dev/null +++ b/cmd/kvdb/decoder.go @@ -0,0 +1,8 @@ +package main + +type Decoder struct { +} + +func NewDecoder() { + +} diff --git a/cmd/kvdb/decoder/ascii.go b/cmd/kvdb/decoder/ascii.go new file mode 100644 index 0000000..7d65120 --- /dev/null +++ b/cmd/kvdb/decoder/ascii.go @@ -0,0 +1,10 @@ +package decoder + +var _ Decode = (*AsciiDecoder)(nil) + +type AsciiDecoder struct { +} + +func (a *AsciiDecoder) Decode(data []byte) string { + return string(data) +} diff --git a/cmd/kvdb/decoder/hex.go b/cmd/kvdb/decoder/hex.go new file mode 100644 index 0000000..be90300 --- /dev/null +++ b/cmd/kvdb/decoder/hex.go @@ -0,0 +1,12 @@ +package decoder + +import "encoding/hex" + +var _ Decode = (*HexDecoder)(nil) + +type HexDecoder struct { +} + +func (h *HexDecoder) Decode(data []byte) string { + return hex.EncodeToString(data) +} diff --git a/cmd/kvdb/decoder/interface.go b/cmd/kvdb/decoder/interface.go new file mode 100644 index 0000000..6e7d1ee --- /dev/null +++ b/cmd/kvdb/decoder/interface.go @@ -0,0 +1,30 @@ +package decoder + +import ( + "fmt" + "strings" +) + +type Decode interface { + Decode([]byte) string +} + +func NewDecoder(scheme string) (Decode, error) { + if scheme == "ascii" { + return &AsciiDecoder{}, nil + } + + if scheme == "hex" { + return &HexDecoder{}, nil + } + + if strings.HasPrefix(scheme, "proto") { + decoder, err := newProtoDecoder(scheme) + if err != nil { + return nil, fmt.Errorf("proto decoder: %w", err) + } + return decoder, nil + } + + return nil, fmt.Errorf("unknown decoding scheme %q", scheme) +} diff --git a/cmd/kvdb/decoder/proto.go b/cmd/kvdb/decoder/proto.go new file mode 100644 index 0000000..e2f24e5 --- /dev/null +++ b/cmd/kvdb/decoder/proto.go @@ -0,0 +1,77 @@ +package decoder + +import ( + "fmt" + "strings" + + "github.com/jhump/protoreflect/desc" + "github.com/jhump/protoreflect/desc/protoparse" + "github.com/jhump/protoreflect/dynamic" +) + +var _ Decode = (*ProtoDecoder)(nil) + +// proto:///path/to/file.proto@ +type ProtoDecoder struct { + messageDescriptor *desc.MessageDescriptor + messageType string +} + +func (p *ProtoDecoder) Decode(bytes []byte) string { + dynMsg := dynamic.NewMessageFactoryWithDefaults().NewDynamicMessage(p.messageDescriptor) + if err := dynMsg.Unmarshal(bytes); err != nil { + return fmt.Sprintf("Error unmarshalling message into %s: %s\n", p.messageType, err.Error()) + + } + + cnt, err := dynMsg.MarshalJSON() + if err != nil { + return fmt.Sprintf("Error marhsalling proto to json %s: %s\n", p.messageType, err.Error()) + } + return string(cnt) +} + +func newProtoDecoder(scheme string) (*ProtoDecoder, error) { + chunks := strings.Split(scheme, "://") + if len(chunks) != 2 { + return nil, fmt.Errorf("invalid proto decoder scheme %q, expect proto:///path/to/file.proto@", scheme) + } + + protoChunks := strings.Split(chunks[1], "@") + if len(chunks) != 2 { + return nil, fmt.Errorf("invalid proto decoder scheme %q, expect proto:///path/to/file.proto@", scheme) + } + + protoPath := protoChunks[0] + messageType := protoChunks[1] + + parser := &protoparse.Parser{ + ImportPaths: []string{}, + IncludeSourceCodeInfo: true, + } + + customFiles, err := parser.ParseFiles(protoPath) + if err != nil { + return nil, fmt.Errorf("parse proto file %q: %w", protoPath, err) + + } + if len(customFiles) != 1 { + return nil, fmt.Errorf("expected 1 proto file descriptor") + } + + fileDescs, err := desc.CreateFileDescriptor(customFiles[0].AsFileDescriptorProto()) + if err != nil { + return nil, fmt.Errorf("couldn't convert file descriptor proto to file descriptor: %w", err) + } + + messageDescriptor := fileDescs.FindMessage(messageType) + if messageDescriptor == nil { + return nil, fmt.Errorf("failed to find message descriptor %q", messageType) + } + + return &ProtoDecoder{ + messageType: messageType, + messageDescriptor: messageDescriptor, + }, nil + +} diff --git a/cmd/kvdb/main.go b/cmd/kvdb/main.go new file mode 100644 index 0000000..f867f17 --- /dev/null +++ b/cmd/kvdb/main.go @@ -0,0 +1,88 @@ +package main + +import ( + "fmt" + "strings" + + "github.com/spf13/cobra" + "github.com/spf13/pflag" + "github.com/streamingfast/logging" + + . "github.com/streamingfast/cli" + _ "github.com/streamingfast/kvdb/store/badger" + _ "github.com/streamingfast/kvdb/store/badger3" + _ "github.com/streamingfast/kvdb/store/bigkv" + _ "github.com/streamingfast/kvdb/store/netkv" + _ "github.com/streamingfast/kvdb/store/tikv" +) + +// Commit sha1 value, injected via go build `ldflags` at build time +var commit = "" + +// Version value, injected via go build `ldflags` at build time +var version = "dev" + +// Date value, injected via go build `ldflags` at build time +var date = "" + +var zlog, tracer = logging.RootLogger("kvdb", "github.com/streamingfast/kvdb/cmd/kvdb") + +var RootCmd = &cobra.Command{ + Use: "kvdb", Short: "", +} + +func init() { + logging.InstantiateLoggers() +} + +func main() { + Run("substreams-sink-kv", "KVDB Client", + ConfigureViper("KVDB"), + ConfigureVersion(), + + Group("read", "KVDB read commands", + ReadGetCmd, + ReadScanCmd, + + PersistentFlags( + func(flags *pflag.FlagSet) { + flags.String("decoder", "hex", "output decoding. Supported schemes: 'hex', 'ascii', 'proto:'") + }, + ), + ), + + PersistentFlags( + func(flags *pflag.FlagSet) { + flags.String("dsn", "", "URL to connect to the KV store. Supported schemes: 'badger3', 'badger', 'bigkv', 'tikv', 'netkv'. See https://github.com/streamingfast/kvdb for more details. (ex: 'badger3:///tmp/substreams-sink-kv-db')") + }, + ), + AfterAllHook(func(cmd *cobra.Command) { + cmd.PersistentPreRunE = func(_ *cobra.Command, _ []string) error { + return nil + } + }), + ) +} + +func ConfigureVersion() CommandOption { + return CommandOptionFunc(func(cmd *cobra.Command) { + cmd.Version = versionString(version) + }) +} + +func versionString(version string) string { + var labels []string + if len(commit) >= 7 { + labels = append(labels, fmt.Sprintf("Commit %s", commit[0:7])) + } + + if date != "" { + labels = append(labels, fmt.Sprintf("Built %s", date)) + } + + if len(labels) == 0 { + return version + } + + return fmt.Sprintf("%s (%s)", version, strings.Join(labels, ", ")) +} diff --git a/cmd/kvdb/read_get.go b/cmd/kvdb/read_get.go new file mode 100644 index 0000000..c26608c --- /dev/null +++ b/cmd/kvdb/read_get.go @@ -0,0 +1,55 @@ +package main + +import ( + "errors" + "fmt" + + "github.com/spf13/viper" + "github.com/streamingfast/kvdb/cmd/kvdb/decoder" + + "github.com/streamingfast/kvdb/store" + + "github.com/spf13/cobra" + . "github.com/streamingfast/cli" + "go.uber.org/zap" +) + +var ReadGetCmd = Command(readGetRunE, + "get ", + "Retrieve a key", + ExactArgs(1), +) + +func readGetRunE(cmd *cobra.Command, args []string) error { + ctx := cmd.Context() + + kvdb, err := getKV() + if err != nil { + return err + } + + outputDecoder, err := decoder.NewDecoder(viper.GetString("read-global-decoder")) + if err != nil { + return fmt.Errorf("decoder: %w", err) + } + + key := args[0] + zlog.Info("store get key", + zap.String("key", key), + ) + + value, err := kvdb.Get(ctx, []byte(key)) + if err != nil { + if errors.Is(err, store.ErrNotFound) { + fmt.Println("") + fmt.Printf("Key: %q NOT FOUND\n", key) + return nil + } + return fmt.Errorf("failed to get key: %w", err) + } + + fmt.Println("") + fmt.Printf("Key: %s\n", key) + fmt.Printf("Value: as hex: %s\n", outputDecoder.Decode(value)) + return nil +} diff --git a/cmd/kvdb/read_scan.go b/cmd/kvdb/read_scan.go new file mode 100644 index 0000000..7beb31d --- /dev/null +++ b/cmd/kvdb/read_scan.go @@ -0,0 +1,65 @@ +package main + +import ( + "fmt" + + "github.com/streamingfast/kvdb/cmd/kvdb/decoder" + + "github.com/spf13/pflag" + "github.com/spf13/viper" + + "github.com/spf13/cobra" + . "github.com/streamingfast/cli" + "go.uber.org/zap" +) + +var ReadScanCmd = Command(readScanRunE, + "scan ", + "Retrieve a key", + ExactArgs(2), + Flags(func(flags *pflag.FlagSet) { + flags.Uint64("limit", 100, "Number of value to return, 0 is unbounded") + }), +) + +func readScanRunE(cmd *cobra.Command, args []string) error { + ctx := cmd.Context() + + kvdb, err := getKV() + if err != nil { + return err + } + + outputDecoder, err := decoder.NewDecoder(viper.GetString("read-global-decoder")) + if err != nil { + return fmt.Errorf("decoder: %w", err) + } + + startKey := args[0] + exclusivelyEndKey := args[1] + limit := viper.GetUint64("read-scan-limit") + zlog.Info("store scan key", + zap.String("start_key", startKey), + zap.String("exclusively_end_key", exclusivelyEndKey), + zap.Uint64("limit", limit), + ) + + itr := kvdb.Scan(ctx, []byte(startKey), []byte(exclusivelyEndKey), int(limit)) + + keyCount := 0 + fmt.Printf("Scanning keys [%q,%q)\n", startKey, exclusivelyEndKey) + fmt.Println("> note: values are encoded as Hex") + fmt.Println("") + for itr.Next() { + keyCount++ + it := itr.Item() + fmt.Printf("%s -> %s\n", string(it.Key), outputDecoder.Decode(it.Value)) + } + if err := itr.Err(); err != nil { + return fmt.Errorf("iteration failed: %w", err) + } + fmt.Println("") + fmt.Printf("Found %d keys\n", keyCount) + + return nil +} diff --git a/go.mod b/go.mod index f528753..e31c2f4 100644 --- a/go.mod +++ b/go.mod @@ -1,16 +1,21 @@ module github.com/streamingfast/kvdb -go 1.17 +go 1.18 require ( cloud.google.com/go/bigtable v1.2.0 github.com/dgraph-io/badger/v2 v2.0.3 github.com/dgraph-io/badger/v3 v3.2103.5 github.com/golang/protobuf v1.5.2 + github.com/jhump/protoreflect v1.15.1 github.com/klauspost/compress v1.12.3 github.com/sirupsen/logrus v1.6.0 - github.com/streamingfast/logging v0.0.0-20220405224725-2755dab2ce75 - github.com/stretchr/testify v1.7.0 + github.com/spf13/cobra v1.1.3 + github.com/spf13/pflag v1.0.5 + github.com/spf13/viper v1.7.0 + github.com/streamingfast/cli v0.0.4-0.20230125023849-e5d1052482ea + github.com/streamingfast/logging v0.0.0-20221209193439-bff11742bf4c + github.com/stretchr/testify v1.8.1 github.com/tikv/client-go/v2 v2.0.1-0.20220224085007-df187fa79aa1 go.opencensus.io v0.23.0 go.uber.org/multierr v1.7.0 @@ -28,26 +33,40 @@ require ( github.com/benbjohnson/clock v1.1.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/blendle/zapdriver v1.3.1 // indirect + github.com/bufbuild/protocompile v0.4.0 // indirect github.com/cespare/xxhash v1.1.0 // indirect github.com/cespare/xxhash/v2 v2.1.1 // indirect + github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/dgraph-io/ristretto v0.1.1 // indirect github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 // indirect github.com/dustin/go-humanize v1.0.0 // indirect + github.com/fsnotify/fsnotify v1.4.9 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b // indirect github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e // indirect github.com/golang/snappy v0.0.3 // indirect github.com/google/btree v1.0.0 // indirect github.com/google/flatbuffers v1.12.1 // indirect - github.com/google/go-cmp v0.5.7 // indirect + github.com/google/go-cmp v0.5.9 // indirect github.com/googleapis/gax-go/v2 v2.1.1 // indirect github.com/grpc-ecosystem/go-grpc-middleware v1.1.0 // indirect + github.com/hashicorp/hcl v1.0.0 // indirect + github.com/inconshreveable/mousetrap v1.0.0 // indirect + github.com/juju/ansiterm v0.0.0-20180109212912-720a0952cc2a // indirect github.com/konsorten/go-windows-terminal-sequences v1.0.3 // indirect + github.com/lithammer/dedent v1.1.0 // indirect github.com/logrusorgru/aurora v2.0.3+incompatible // indirect + github.com/lunixbochs/vtclean v0.0.0-20180621232353-2d01aacdc34a // indirect + github.com/magiconair/properties v1.8.1 // indirect + github.com/manifoldco/promptui v0.8.0 // indirect + github.com/mattn/go-colorable v0.0.9 // indirect + github.com/mattn/go-isatty v0.0.4 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect github.com/mitchellh/go-testing-interface v1.14.1 // indirect + github.com/mitchellh/mapstructure v1.1.2 // indirect github.com/opentracing/opentracing-go v1.2.0 // indirect + github.com/pelletier/go-toml v1.2.0 // indirect github.com/pingcap/errors v0.11.5-0.20211224045212-9687c2b0f87c // indirect github.com/pingcap/failpoint v0.0.0-20210918120811-547c13e3eb00 // indirect github.com/pingcap/kvproto v0.0.0-20220106070556-3fa8fa04f898 // indirect @@ -58,19 +77,25 @@ require ( github.com/prometheus/client_model v0.2.0 // indirect github.com/prometheus/common v0.26.0 // indirect github.com/prometheus/procfs v0.6.0 // indirect + github.com/spf13/afero v1.1.2 // indirect + github.com/spf13/cast v1.3.0 // indirect + github.com/spf13/jwalterweatherman v1.0.0 // indirect + github.com/subosito/gotenv v1.2.0 // indirect github.com/tikv/pd/client v0.0.0-20220216070739-26c668271201 // indirect go.uber.org/atomic v1.9.0 // indirect golang.org/x/crypto v0.0.0-20220214200702-86341886e292 // indirect - golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd // indirect + golang.org/x/net v0.7.0 // indirect golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8 // indirect golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect - golang.org/x/sys v0.0.0-20221010170243-090e33056c14 // indirect - golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect - golang.org/x/text v0.3.7 // indirect + golang.org/x/sys v0.5.0 // indirect + golang.org/x/term v0.5.0 // indirect + golang.org/x/text v0.7.0 // indirect golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect google.golang.org/appengine v1.6.7 // indirect google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c // indirect - google.golang.org/protobuf v1.27.1 // indirect + google.golang.org/protobuf v1.28.2-0.20230222093303-bc1253ad3743 // indirect + gopkg.in/ini.v1 v1.51.0 // indirect gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect - gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index fae096e..47e1fc9 100644 --- a/go.sum +++ b/go.sum @@ -42,6 +42,7 @@ cloud.google.com/go/compute v1.3.0 h1:mPL/MzDDYHsh5tHRS9mhmhWlcgClCrCa6ApQCU6wnH cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= cloud.google.com/go/iam v0.2.0 h1:Ouq6qif4mZdXkb3SiFMpxvu0JQJB1Yid9TsZ23N6hg8= cloud.google.com/go/iam v0.2.0/go.mod h1:BCK88+tmjAwnZYfOSizmKCTSFjJHCa18t3DpdGEY13Y= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= @@ -69,22 +70,32 @@ github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRF github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6/go.mod h1:V8iCPQYkqmusNa815XgQio277wI47sdRh1dUOLdyC6Q= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= +github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= github.com/blendle/zapdriver v1.3.1 h1:C3dydBOWYRiOk+B8X9IVZ5IOe+7cl+tGOexN4QqHfpE= github.com/blendle/zapdriver v1.3.1/go.mod h1:mdXfREi6u5MArG4j9fewC+FGnXaBR+T4Ox4J2u4eHCc= +github.com/bufbuild/protocompile v0.4.0 h1:LbFKd2XowZvQ/kajzguUp2DC9UEIQhIq77fZZlaQsNA= +github.com/bufbuild/protocompile v0.4.0/go.mod h1:3v93+mbWn/v3xzN+31nwkJfrEpAUwp+BagBSZWx+TP8= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/chzyer/logex v1.1.10 h1:Swpa1K6QvQznwJRcfTfQJmTE72DqScAa40E+fbHEXEE= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e h1:fY5BOSpyZCqRo5OhCuC+XN+r/bBCmeuuJtjz+bCNIf8= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1 h1:q763qf9huN11kDQavWsoZXJNW3xEE4JJyHa5Q25/sd8= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= @@ -95,12 +106,17 @@ github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWH github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= +github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cznic/mathutil v0.0.0-20181122101859-297441e03548/go.mod h1:e6NPNENfs9mPDVNRekM7lKScauxd5kXTr1Mfyig6TDM= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= @@ -112,8 +128,10 @@ github.com/dgraph-io/badger/v3 v3.2103.5/go.mod h1:4MPiseMeDQ3FNCYwRbbcBOGJLf5js github.com/dgraph-io/ristretto v0.0.2-0.20200115201040-8f368f2f2ab3/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= github.com/dgraph-io/ristretto v0.1.1 h1:6CWw5tJNgpegArSHpNHJKldNeq03FQCwYvfMVWajOK8= github.com/dgraph-io/ristretto v0.1.1/go.mod h1:S1GPSBCYCIhmVNfcth17y2zZtQT6wzkzgwUve0VDWWA= +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= @@ -125,7 +143,9 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.m github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= @@ -147,6 +167,7 @@ github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e h1:1r7pUrabqp18hOBcwBwiTsbnFeTZHV9eER/QT5JVZxY= @@ -199,8 +220,9 @@ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.7 h1:81/ik6ipDQS2aGcBfIN5dHDB36BwrStyeAQquSYCV4o= github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= +github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= @@ -228,24 +250,55 @@ github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5m github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= github.com/googleapis/gax-go/v2 v2.1.1 h1:dp3bWCh+PPO1zjRRiCSczJav13sBvG4UhNyVTa1KqdU= github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.1.0 h1:THDBEeQ9xZ8JEaCLyLQqXMMdRqNr0QAUJTIkQAUtFjg= github.com/grpc-ecosystem/go-grpc-middleware v1.1.0/go.mod h1:f5nM7jw/oeRSadq3xCzHAvxcr8HZnzsqU6ILg/0NiiE= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.12.1/go.mod h1:8XEsbTttt/W+VvjtQhLACqCisSPWTxCZ7sBRjU6iH9c= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= +github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= +github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= +github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= +github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= +github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= +github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= +github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/jhump/protoreflect v1.15.1 h1:HUMERORf3I3ZdX05WaQ6MIpd/NJ434hTp5YiKgfCL6c= +github.com/jhump/protoreflect v1.15.1/go.mod h1:jD/2GMKKE6OqX8qTjhADU1e6DShO+gavG9e0Q693nKo= +github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/juju/ansiterm v0.0.0-20180109212912-720a0952cc2a h1:FaWFmfWdAUKbSCtOU2QjDaorUexogfaMgbipgYATUMU= +github.com/juju/ansiterm v0.0.0-20180109212912-720a0952cc2a/go.mod h1:UJSiEoRfvx3hP73CvoARgeLjaIOjybY9vj8PUPPFGeU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= @@ -263,14 +316,35 @@ github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORN github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/lithammer/dedent v1.1.0 h1:VNzHMVCBNG1j0fh3OrsFRkVUwStdDArbgBWoPAffktY= +github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= github.com/logrusorgru/aurora v2.0.3+incompatible h1:tOpm7WcpBTn4fjmVfgpQq0EfczGlG91VSDkswnjF5A8= github.com/logrusorgru/aurora v2.0.3+incompatible/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= +github.com/lunixbochs/vtclean v0.0.0-20180621232353-2d01aacdc34a h1:weJVJJRzAJBFRlAiJQROKQs8oC9vOxvm4rZmBBk0ONw= +github.com/lunixbochs/vtclean v0.0.0-20180621232353-2d01aacdc34a/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= +github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/manifoldco/promptui v0.8.0 h1:R95mMF+McvXZQ7j1g8ucVZE1gLP3Sv6j9vlF9kyRqQo= +github.com/manifoldco/promptui v0.8.0/go.mod h1:n4zTdgP0vr0S3w7/O/g98U+e0gwLScEXGwov2nIKuGQ= +github.com/mattn/go-colorable v0.0.9 h1:UVL0vNpWh04HeJXV0KLcaT7r06gOH2l4OW6ddYRUIY4= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.4 h1:bnP0vzxcAdeI1zdubAl5PjU6zsERjGZb7raWodagDYs= +github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= github.com/mitchellh/go-testing-interface v1.14.1 h1:jrgshOhYAUVNMAJiKbEu7EqAwgJJ2JqpQmpLJOu07cU= github.com/mitchellh/go-testing-interface v1.14.1/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8= +github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= +github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= +github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -280,6 +354,7 @@ github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRW github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= +github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= @@ -292,6 +367,8 @@ github.com/onsi/gomega v1.18.1/go.mod h1:0q+aL8jAiMXy9hbwj2mr5GziHiwhAIQpFmmtT5h github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= +github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pingcap/check v0.0.0-20190102082844-67f458068fc8/go.mod h1:B1+S9LNcuMyLH/4HMTViQOJevkGiik3wW2AN9zb2fNQ= github.com/pingcap/check v0.0.0-20211026125417-57bd13f7b5f0 h1:HVl5539r48eA+uDuX/ziBmQCxzT1pGrzWbKuXT46Bq0= @@ -315,7 +392,9 @@ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.11.0 h1:HNkLOAEQMIDv/K+04rukrLx6ch7msSRwf3/SASFAGtQ= @@ -325,58 +404,93 @@ github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1: github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.26.0 h1:iMAkS2TDoNWnKM+Kopnx/8tnEStIfpYA0ur0xQzzhMQ= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0 h1:mxy4L2jP6qMonqmq+aTtOx1ifVWUgG/TAmntgbh3xv4= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0 h1:UBcNElsrwanuuMsnGSlYmtmgbb23qDR5dG+6X6Oo89I= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v1.1.2 h1:m8/z1t7/fwjysjQRYbP0RD+bUIF/8tJwPdEZsI83ACI= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= +github.com/spf13/cobra v1.1.3 h1:xghbfqPkxzxP3C/f3n5DdpAbdKLj4ZE4BWQI362l53M= +github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= +github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= -github.com/streamingfast/logging v0.0.0-20220405224725-2755dab2ce75 h1:ZqpS7rAhhKD7S7DnrpEdrnW1/gZcv82ytpMviovkli4= -github.com/streamingfast/logging v0.0.0-20220405224725-2755dab2ce75/go.mod h1:VlduQ80JcGJSargkRU4Sg9Xo63wZD/l8A5NC/Uo1/uU= +github.com/spf13/viper v1.7.0 h1:xVKxvI7ouOI5I+U9s2eeiUfMaWBVoXA3AWskkrqK0VM= +github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= +github.com/streamingfast/cli v0.0.4-0.20230125023849-e5d1052482ea h1:htLnAIoFiRxm7k2vd5zdh824Wt4sOXGApWJvG2M7WD4= +github.com/streamingfast/cli v0.0.4-0.20230125023849-e5d1052482ea/go.mod h1:Z9pBewRFgQZ3YaDR+yMUeYU0W4A3HMV67MXrwRx9Ot0= +github.com/streamingfast/logging v0.0.0-20221209193439-bff11742bf4c h1:dV1ye/S2PiW9uIWvLtMrxWoTLcZS+yhjZDSKEV102Ho= +github.com/streamingfast/logging v0.0.0-20221209193439-bff11742bf4c/go.mod h1:VlduQ80JcGJSargkRU4Sg9Xo63wZD/l8A5NC/Uo1/uU= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= +github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/test-go/testify v1.1.4 h1:Tf9lntrKUMHiXQ07qBScBTSA0dhYQlu83hswqelv1iE= github.com/test-go/testify v1.1.4/go.mod h1:rH7cfJo/47vWGdi4GPj16x3/t1xGOj2YxzmNQzk2ghU= github.com/tikv/client-go/v2 v2.0.1-0.20220224085007-df187fa79aa1 h1:VHDM0RS86XGBZZbvRqnwC/H78Prb7p3d12vJL2URYBU= github.com/tikv/client-go/v2 v2.0.1-0.20220224085007-df187fa79aa1/go.mod h1:gaHSp8rnxZ0w36qb6QPPNPh9P0Mu5vAEwCQcc0Brni4= github.com/tikv/pd/client v0.0.0-20220216070739-26c668271201 h1:7h/Oi4Zw6eGCeXh4Q4ZvKI4k7nBJVUq0c29YCcLwKPM= github.com/tikv/pd/client v0.0.0-20220216070739-26c668271201/go.mod h1:fEvI5fhAuJn1Fn87VJF8ByE9Vc16EzWGoePZB21/nL8= +github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/twmb/murmur3 v1.1.3/go.mod h1:Qq/R7NUyOfr65zD+6Q5IHKsJLwP7exErjN6lyyq3OSQ= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= +github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/etcd/api/v3 v3.5.2/go.mod h1:5GB2vv4A4AOn3yk7MftYGHkUfGtDHnEraIjym4dYz5A= go.etcd.io/etcd/client/pkg/v3 v3.5.2/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= go.etcd.io/etcd/client/v3 v3.5.2/go.mod h1:kOOaWFFgHygyT0WlSmL8TJiXmMysO/nNUlEsSsN6W4o= @@ -416,6 +530,7 @@ go.uber.org/zap v1.20.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= go.uber.org/zap v1.21.0 h1:WefMeulhovoZ2sYXz7st6K0sLj7bBhpiFaud4r4zST8= go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= @@ -462,7 +577,10 @@ golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= @@ -501,8 +619,9 @@ golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96b golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd h1:O7DYs+zxREGLKzKoMQrtrEacpb0ZVXA5rIwylE2Xchk= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -532,10 +651,14 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -600,11 +723,13 @@ golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20221010170243-090e33056c14 h1:k5II8e6QD8mITdi+okbbmR/cIyEbeXLBhy5Ha4nevyc= golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.5.0 h1:n2a8QNdAb0sZNpU9R1ALUXBbY+w51fCQDN+7EdxNBsY= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -613,8 +738,9 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -626,6 +752,7 @@ golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3 golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= @@ -639,6 +766,7 @@ golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191107010934-f79515f33823/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -835,8 +963,9 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.28.2-0.20230222093303-bc1253ad3743 h1:yqElulDvOF26oZ2O+2/aoX7mQ8DY/6+p39neytrycd8= +google.golang.org/protobuf v1.28.2-0.20230222093303-bc1253ad3743/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -844,9 +973,13 @@ gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogR gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/ini.v1 v1.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno= +gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= +gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -857,8 +990,9 @@ gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= From f4eabf885fc7faa2ff7f9132060e97b7bcbdc0f1 Mon Sep 17 00:00:00 2001 From: Julien Cassis Date: Sat, 11 Mar 2023 08:46:25 -0500 Subject: [PATCH 2/2] Fix proto decoder, added read by prefix support --- cmd/kvdb/decoder/pb/system/system.go | 8 +++ cmd/kvdb/decoder/pb/system/system.pb | Bin 0 -> 81852 bytes cmd/kvdb/decoder/proto.go | 72 +++++++++++++++++++++------ cmd/kvdb/main.go | 1 + cmd/kvdb/read_get.go | 6 +-- cmd/kvdb/read_prefix.go | 62 +++++++++++++++++++++++ cmd/kvdb/read_scan.go | 5 +- 7 files changed, 133 insertions(+), 21 deletions(-) create mode 100644 cmd/kvdb/decoder/pb/system/system.go create mode 100644 cmd/kvdb/decoder/pb/system/system.pb create mode 100644 cmd/kvdb/read_prefix.go diff --git a/cmd/kvdb/decoder/pb/system/system.go b/cmd/kvdb/decoder/pb/system/system.go new file mode 100644 index 0000000..a96c048 --- /dev/null +++ b/cmd/kvdb/decoder/pb/system/system.go @@ -0,0 +1,8 @@ +package system + +import ( + _ "embed" +) + +//go:embed system.pb +var ProtobufDescriptors []byte diff --git a/cmd/kvdb/decoder/pb/system/system.pb b/cmd/kvdb/decoder/pb/system/system.pb new file mode 100644 index 0000000000000000000000000000000000000000..0ca8b3ac0978ee1a3a6d6f9ecf0570bfa0a3e36c GIT binary patch literal 81852 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\t%s\tNOT FOUND\n", key) return nil } return fmt.Errorf("failed to get key: %w", err) } fmt.Println("") - fmt.Printf("Key: %s\n", key) - fmt.Printf("Value: as hex: %s\n", outputDecoder.Decode(value)) + fmt.Printf("Key\t->\t%s\n", key) + fmt.Printf("Value\t->\t%s\n", outputDecoder.Decode(value)) return nil } diff --git a/cmd/kvdb/read_prefix.go b/cmd/kvdb/read_prefix.go new file mode 100644 index 0000000..05427f7 --- /dev/null +++ b/cmd/kvdb/read_prefix.go @@ -0,0 +1,62 @@ +package main + +import ( + "fmt" + + "github.com/streamingfast/kvdb/cmd/kvdb/decoder" + + "github.com/spf13/pflag" + "github.com/spf13/viper" + + "github.com/spf13/cobra" + . "github.com/streamingfast/cli" + "go.uber.org/zap" +) + +var ReadPrefixCmd = Command(readPrefixRunE, + "prefix ", + "Retrieve keys by prefix", + ExactArgs(1), + Flags(func(flags *pflag.FlagSet) { + flags.Uint64("limit", 100, "Number of value to return, 0 is unbounded") + }), +) + +func readPrefixRunE(cmd *cobra.Command, args []string) error { + ctx := cmd.Context() + + kvdb, err := getKV() + if err != nil { + return err + } + + outputDecoder, err := decoder.NewDecoder(viper.GetString("read-global-decoder")) + if err != nil { + return fmt.Errorf("decoder: %w", err) + } + + prefix := args[0] + limit := viper.GetUint64("read-prefix-limit") + zlog.Info("store prefix", + zap.String("prefix", prefix), + zap.Uint64("limit", limit), + ) + + itr := kvdb.Prefix(ctx, []byte(prefix), int(limit)) + + keyCount := 0 + fmt.Printf("keys with prefix: %s", prefix) + fmt.Println("") + for itr.Next() { + keyCount++ + it := itr.Item() + fmt.Printf("%s\t->\t%s\n", string(it.Key), outputDecoder.Decode(it.Value)) + } + if err := itr.Err(); err != nil { + return fmt.Errorf("iteration failed: %w", err) + } + fmt.Println("") + fmt.Printf("Found %d keys\n", keyCount) + + return nil +} diff --git a/cmd/kvdb/read_scan.go b/cmd/kvdb/read_scan.go index 7beb31d..bd57460 100644 --- a/cmd/kvdb/read_scan.go +++ b/cmd/kvdb/read_scan.go @@ -15,7 +15,7 @@ import ( var ReadScanCmd = Command(readScanRunE, "scan ", - "Retrieve a key", + "Scans for a given key range", ExactArgs(2), Flags(func(flags *pflag.FlagSet) { flags.Uint64("limit", 100, "Number of value to return, 0 is unbounded") @@ -48,12 +48,11 @@ func readScanRunE(cmd *cobra.Command, args []string) error { keyCount := 0 fmt.Printf("Scanning keys [%q,%q)\n", startKey, exclusivelyEndKey) - fmt.Println("> note: values are encoded as Hex") fmt.Println("") for itr.Next() { keyCount++ it := itr.Item() - fmt.Printf("%s -> %s\n", string(it.Key), outputDecoder.Decode(it.Value)) + fmt.Printf("%s\t->\t%s\n", string(it.Key), outputDecoder.Decode(it.Value)) } if err := itr.Err(); err != nil { return fmt.Errorf("iteration failed: %w", err)