mirror of
https://github.com/redis/go-redis.git
synced 2025-07-28 06:42:00 +03:00
add InfoMap command (#2665)
Add an extended version of Info() to parse the results from a call to redis.Info so that it’s simpler to operate on any given item in the result. Signed-off-by: Nic Gibson <nic.gibson@redis.com>
This commit is contained in:
83
command.go
83
command.go
@ -1,9 +1,11 @@
|
||||
package redis
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"context"
|
||||
"fmt"
|
||||
"net"
|
||||
"regexp"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
@ -5298,3 +5300,84 @@ type LibraryInfo struct {
|
||||
LibName *string
|
||||
LibVer *string
|
||||
}
|
||||
|
||||
// -------------------------------------------
|
||||
|
||||
type InfoCmd struct {
|
||||
baseCmd
|
||||
val map[string]map[string]string
|
||||
}
|
||||
|
||||
var _ Cmder = (*InfoCmd)(nil)
|
||||
|
||||
func NewInfoCmd(ctx context.Context, args ...interface{}) *InfoCmd {
|
||||
return &InfoCmd{
|
||||
baseCmd: baseCmd{
|
||||
ctx: ctx,
|
||||
args: args,
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func (cmd *InfoCmd) SetVal(val map[string]map[string]string) {
|
||||
cmd.val = val
|
||||
}
|
||||
|
||||
func (cmd *InfoCmd) Val() map[string]map[string]string {
|
||||
return cmd.val
|
||||
}
|
||||
|
||||
func (cmd *InfoCmd) Result() (map[string]map[string]string, error) {
|
||||
return cmd.Val(), cmd.Err()
|
||||
}
|
||||
|
||||
func (cmd *InfoCmd) String() string {
|
||||
return cmdString(cmd, cmd.val)
|
||||
}
|
||||
|
||||
func (cmd *InfoCmd) readReply(rd *proto.Reader) error {
|
||||
val, err := rd.ReadString()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
section := ""
|
||||
scanner := bufio.NewScanner(strings.NewReader(val))
|
||||
moduleRe := regexp.MustCompile(`module:name=(.+?),(.+)$`)
|
||||
|
||||
for scanner.Scan() {
|
||||
line := scanner.Text()
|
||||
if strings.HasPrefix(line, "#") {
|
||||
if cmd.val == nil {
|
||||
cmd.val = make(map[string]map[string]string)
|
||||
}
|
||||
section = strings.TrimPrefix(line, "# ")
|
||||
cmd.val[section] = make(map[string]string)
|
||||
} else if line != "" {
|
||||
if section == "Modules" {
|
||||
kv := moduleRe.FindStringSubmatch(line)
|
||||
if len(kv) == 3 {
|
||||
cmd.val[section][kv[1]] = kv[2]
|
||||
}
|
||||
} else {
|
||||
kv := strings.SplitN(line, ":", 2)
|
||||
if len(kv) == 2 {
|
||||
cmd.val[section][kv[0]] = kv[1]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
|
||||
}
|
||||
|
||||
func (cmd *InfoCmd) Item(section, key string) string {
|
||||
if cmd.val == nil {
|
||||
return ""
|
||||
} else if cmd.val[section] == nil {
|
||||
return ""
|
||||
} else {
|
||||
return cmd.val[section][key]
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user