mirror of https://github.com/go-redis/redis.git
Merge pull request #646 from go-redis/feature/export-cmd-args
Export Cmder.Args
This commit is contained in:
commit
34ce349cb7
|
@ -535,13 +535,13 @@ func (c *ClusterClient) cmdInfo(name string) *CommandInfo {
|
|||
|
||||
func (c *ClusterClient) cmdSlot(cmd Cmder) int {
|
||||
cmdInfo := c.cmdInfo(cmd.Name())
|
||||
firstKey := cmd.arg(cmdFirstKeyPos(cmd, cmdInfo))
|
||||
firstKey := cmd.stringArg(cmdFirstKeyPos(cmd, cmdInfo))
|
||||
return hashtag.Slot(firstKey)
|
||||
}
|
||||
|
||||
func (c *ClusterClient) cmdSlotAndNode(state *clusterState, cmd Cmder) (int, *clusterNode, error) {
|
||||
cmdInfo := c.cmdInfo(cmd.Name())
|
||||
firstKey := cmd.arg(cmdFirstKeyPos(cmd, cmdInfo))
|
||||
firstKey := cmd.stringArg(cmdFirstKeyPos(cmd, cmdInfo))
|
||||
slot := hashtag.Slot(firstKey)
|
||||
|
||||
if cmdInfo != nil && cmdInfo.ReadOnly && c.opt.ReadOnly {
|
||||
|
|
72
command.go
72
command.go
|
@ -12,28 +12,10 @@ import (
|
|||
"github.com/go-redis/redis/internal/proto"
|
||||
)
|
||||
|
||||
var (
|
||||
_ Cmder = (*Cmd)(nil)
|
||||
_ Cmder = (*SliceCmd)(nil)
|
||||
_ Cmder = (*StatusCmd)(nil)
|
||||
_ Cmder = (*IntCmd)(nil)
|
||||
_ Cmder = (*DurationCmd)(nil)
|
||||
_ Cmder = (*BoolCmd)(nil)
|
||||
_ Cmder = (*StringCmd)(nil)
|
||||
_ Cmder = (*FloatCmd)(nil)
|
||||
_ Cmder = (*StringSliceCmd)(nil)
|
||||
_ Cmder = (*BoolSliceCmd)(nil)
|
||||
_ Cmder = (*StringStringMapCmd)(nil)
|
||||
_ Cmder = (*StringIntMapCmd)(nil)
|
||||
_ Cmder = (*ZSliceCmd)(nil)
|
||||
_ Cmder = (*ScanCmd)(nil)
|
||||
_ Cmder = (*ClusterSlotsCmd)(nil)
|
||||
)
|
||||
|
||||
type Cmder interface {
|
||||
args() []interface{}
|
||||
arg(int) string
|
||||
Name() string
|
||||
Args() []interface{}
|
||||
stringArg(int) string
|
||||
|
||||
readReply(*pool.Conn) error
|
||||
setErr(error)
|
||||
|
@ -64,7 +46,7 @@ func firstCmdsErr(cmds []Cmder) error {
|
|||
func writeCmd(cn *pool.Conn, cmds ...Cmder) error {
|
||||
cn.Wb.Reset()
|
||||
for _, cmd := range cmds {
|
||||
if err := cn.Wb.Append(cmd.args()); err != nil {
|
||||
if err := cn.Wb.Append(cmd.Args()); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
@ -75,7 +57,7 @@ func writeCmd(cn *pool.Conn, cmds ...Cmder) error {
|
|||
|
||||
func cmdString(cmd Cmder, val interface{}) string {
|
||||
var ss []string
|
||||
for _, arg := range cmd.args() {
|
||||
for _, arg := range cmd.Args() {
|
||||
ss = append(ss, fmt.Sprint(arg))
|
||||
}
|
||||
s := strings.Join(ss, " ")
|
||||
|
@ -97,7 +79,7 @@ func cmdString(cmd Cmder, val interface{}) string {
|
|||
func cmdFirstKeyPos(cmd Cmder, info *CommandInfo) int {
|
||||
switch cmd.Name() {
|
||||
case "eval", "evalsha":
|
||||
if cmd.arg(2) != "0" {
|
||||
if cmd.stringArg(2) != "0" {
|
||||
return 3
|
||||
} else {
|
||||
return -1
|
||||
|
@ -120,15 +102,17 @@ type baseCmd struct {
|
|||
_readTimeout *time.Duration
|
||||
}
|
||||
|
||||
var _ Cmder = (*Cmd)(nil)
|
||||
|
||||
func (cmd *baseCmd) Err() error {
|
||||
return cmd.err
|
||||
}
|
||||
|
||||
func (cmd *baseCmd) args() []interface{} {
|
||||
func (cmd *baseCmd) Args() []interface{} {
|
||||
return cmd._args
|
||||
}
|
||||
|
||||
func (cmd *baseCmd) arg(pos int) string {
|
||||
func (cmd *baseCmd) stringArg(pos int) string {
|
||||
if pos < 0 || pos >= len(cmd._args) {
|
||||
return ""
|
||||
}
|
||||
|
@ -139,7 +123,7 @@ func (cmd *baseCmd) arg(pos int) string {
|
|||
func (cmd *baseCmd) Name() string {
|
||||
if len(cmd._args) > 0 {
|
||||
// Cmd name must be lower cased.
|
||||
s := internal.ToLower(cmd.arg(0))
|
||||
s := internal.ToLower(cmd.stringArg(0))
|
||||
cmd._args[0] = s
|
||||
return s
|
||||
}
|
||||
|
@ -204,6 +188,8 @@ type SliceCmd struct {
|
|||
val []interface{}
|
||||
}
|
||||
|
||||
var _ Cmder = (*SliceCmd)(nil)
|
||||
|
||||
func NewSliceCmd(args ...interface{}) *SliceCmd {
|
||||
return &SliceCmd{
|
||||
baseCmd: baseCmd{_args: args},
|
||||
|
@ -240,6 +226,8 @@ type StatusCmd struct {
|
|||
val string
|
||||
}
|
||||
|
||||
var _ Cmder = (*StatusCmd)(nil)
|
||||
|
||||
func NewStatusCmd(args ...interface{}) *StatusCmd {
|
||||
return &StatusCmd{
|
||||
baseCmd: baseCmd{_args: args},
|
||||
|
@ -271,6 +259,8 @@ type IntCmd struct {
|
|||
val int64
|
||||
}
|
||||
|
||||
var _ Cmder = (*IntCmd)(nil)
|
||||
|
||||
func NewIntCmd(args ...interface{}) *IntCmd {
|
||||
return &IntCmd{
|
||||
baseCmd: baseCmd{_args: args},
|
||||
|
@ -303,6 +293,8 @@ type DurationCmd struct {
|
|||
precision time.Duration
|
||||
}
|
||||
|
||||
var _ Cmder = (*DurationCmd)(nil)
|
||||
|
||||
func NewDurationCmd(precision time.Duration, args ...interface{}) *DurationCmd {
|
||||
return &DurationCmd{
|
||||
baseCmd: baseCmd{_args: args},
|
||||
|
@ -340,6 +332,8 @@ type TimeCmd struct {
|
|||
val time.Time
|
||||
}
|
||||
|
||||
var _ Cmder = (*TimeCmd)(nil)
|
||||
|
||||
func NewTimeCmd(args ...interface{}) *TimeCmd {
|
||||
return &TimeCmd{
|
||||
baseCmd: baseCmd{_args: args},
|
||||
|
@ -376,6 +370,8 @@ type BoolCmd struct {
|
|||
val bool
|
||||
}
|
||||
|
||||
var _ Cmder = (*BoolCmd)(nil)
|
||||
|
||||
func NewBoolCmd(args ...interface{}) *BoolCmd {
|
||||
return &BoolCmd{
|
||||
baseCmd: baseCmd{_args: args},
|
||||
|
@ -431,6 +427,8 @@ type StringCmd struct {
|
|||
val []byte
|
||||
}
|
||||
|
||||
var _ Cmder = (*StringCmd)(nil)
|
||||
|
||||
func NewStringCmd(args ...interface{}) *StringCmd {
|
||||
return &StringCmd{
|
||||
baseCmd: baseCmd{_args: args},
|
||||
|
@ -494,6 +492,8 @@ type FloatCmd struct {
|
|||
val float64
|
||||
}
|
||||
|
||||
var _ Cmder = (*FloatCmd)(nil)
|
||||
|
||||
func NewFloatCmd(args ...interface{}) *FloatCmd {
|
||||
return &FloatCmd{
|
||||
baseCmd: baseCmd{_args: args},
|
||||
|
@ -525,6 +525,8 @@ type StringSliceCmd struct {
|
|||
val []string
|
||||
}
|
||||
|
||||
var _ Cmder = (*StringSliceCmd)(nil)
|
||||
|
||||
func NewStringSliceCmd(args ...interface{}) *StringSliceCmd {
|
||||
return &StringSliceCmd{
|
||||
baseCmd: baseCmd{_args: args},
|
||||
|
@ -565,6 +567,8 @@ type BoolSliceCmd struct {
|
|||
val []bool
|
||||
}
|
||||
|
||||
var _ Cmder = (*BoolSliceCmd)(nil)
|
||||
|
||||
func NewBoolSliceCmd(args ...interface{}) *BoolSliceCmd {
|
||||
return &BoolSliceCmd{
|
||||
baseCmd: baseCmd{_args: args},
|
||||
|
@ -601,6 +605,8 @@ type StringStringMapCmd struct {
|
|||
val map[string]string
|
||||
}
|
||||
|
||||
var _ Cmder = (*StringStringMapCmd)(nil)
|
||||
|
||||
func NewStringStringMapCmd(args ...interface{}) *StringStringMapCmd {
|
||||
return &StringStringMapCmd{
|
||||
baseCmd: baseCmd{_args: args},
|
||||
|
@ -637,6 +643,8 @@ type StringIntMapCmd struct {
|
|||
val map[string]int64
|
||||
}
|
||||
|
||||
var _ Cmder = (*StringIntMapCmd)(nil)
|
||||
|
||||
func NewStringIntMapCmd(args ...interface{}) *StringIntMapCmd {
|
||||
return &StringIntMapCmd{
|
||||
baseCmd: baseCmd{_args: args},
|
||||
|
@ -673,6 +681,8 @@ type ZSliceCmd struct {
|
|||
val []Z
|
||||
}
|
||||
|
||||
var _ Cmder = (*ZSliceCmd)(nil)
|
||||
|
||||
func NewZSliceCmd(args ...interface{}) *ZSliceCmd {
|
||||
return &ZSliceCmd{
|
||||
baseCmd: baseCmd{_args: args},
|
||||
|
@ -712,6 +722,8 @@ type ScanCmd struct {
|
|||
process func(cmd Cmder) error
|
||||
}
|
||||
|
||||
var _ Cmder = (*ScanCmd)(nil)
|
||||
|
||||
func NewScanCmd(process func(cmd Cmder) error, args ...interface{}) *ScanCmd {
|
||||
return &ScanCmd{
|
||||
baseCmd: baseCmd{_args: args},
|
||||
|
@ -762,6 +774,8 @@ type ClusterSlotsCmd struct {
|
|||
val []ClusterSlot
|
||||
}
|
||||
|
||||
var _ Cmder = (*ClusterSlotsCmd)(nil)
|
||||
|
||||
func NewClusterSlotsCmd(args ...interface{}) *ClusterSlotsCmd {
|
||||
return &ClusterSlotsCmd{
|
||||
baseCmd: baseCmd{_args: args},
|
||||
|
@ -821,6 +835,8 @@ type GeoLocationCmd struct {
|
|||
locations []GeoLocation
|
||||
}
|
||||
|
||||
var _ Cmder = (*GeoLocationCmd)(nil)
|
||||
|
||||
func NewGeoLocationCmd(q *GeoRadiusQuery, args ...interface{}) *GeoLocationCmd {
|
||||
args = append(args, q.Radius)
|
||||
if q.Unit != "" {
|
||||
|
@ -891,6 +907,8 @@ type GeoPosCmd struct {
|
|||
positions []*GeoPos
|
||||
}
|
||||
|
||||
var _ Cmder = (*GeoPosCmd)(nil)
|
||||
|
||||
func NewGeoPosCmd(args ...interface{}) *GeoPosCmd {
|
||||
return &GeoPosCmd{
|
||||
baseCmd: baseCmd{_args: args},
|
||||
|
@ -937,6 +955,8 @@ type CommandsInfoCmd struct {
|
|||
val map[string]*CommandInfo
|
||||
}
|
||||
|
||||
var _ Cmder = (*CommandsInfoCmd)(nil)
|
||||
|
||||
func NewCommandsInfoCmd(args ...interface{}) *CommandsInfoCmd {
|
||||
return &CommandsInfoCmd{
|
||||
baseCmd: baseCmd{_args: args},
|
||||
|
|
4
ring.go
4
ring.go
|
@ -343,7 +343,7 @@ func (c *Ring) shardByName(name string) (*ringShard, error) {
|
|||
|
||||
func (c *Ring) cmdShard(cmd Cmder) (*ringShard, error) {
|
||||
cmdInfo := c.cmdInfo(cmd.Name())
|
||||
firstKey := cmd.arg(cmdFirstKeyPos(cmd, cmdInfo))
|
||||
firstKey := cmd.stringArg(cmdFirstKeyPos(cmd, cmdInfo))
|
||||
return c.shardByKey(firstKey)
|
||||
}
|
||||
|
||||
|
@ -443,7 +443,7 @@ func (c *Ring) pipelineExec(cmds []Cmder) error {
|
|||
cmdsMap := make(map[string][]Cmder)
|
||||
for _, cmd := range cmds {
|
||||
cmdInfo := c.cmdInfo(cmd.Name())
|
||||
name := cmd.arg(cmdFirstKeyPos(cmd, cmdInfo))
|
||||
name := cmd.stringArg(cmdFirstKeyPos(cmd, cmdInfo))
|
||||
if name != "" {
|
||||
name = c.hash.Get(hashtag.Key(name))
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue