mirror of https://github.com/go-redis/redis.git
Support for CLIENT SETINFO (#2659)
* feat: merge master * feat: revert ring.go * feat: add ClientSetInfo command * fix: test and cmd: * fix: test and cmd * fix: test and cmd * fix: test and cmd * feat: redesigning the API * fix: panic test * fix: panic test --------- Co-authored-by: Anuragkillswitch <70265851+Anuragkillswitch@users.noreply.github.com> Co-authored-by: ofekshenawa <104765379+ofekshenawa@users.noreply.github.com>
This commit is contained in:
parent
017466b6cc
commit
3b0d10b4ed
|
@ -5292,3 +5292,9 @@ func (cmd *ACLLogCmd) readReply(rd *proto.Reader) error {
|
|||
|
||||
return nil
|
||||
}
|
||||
|
||||
// LibraryInfo holds the library info.
|
||||
type LibraryInfo struct {
|
||||
LibName *string
|
||||
LibVer *string
|
||||
}
|
||||
|
|
30
commands.go
30
commands.go
|
@ -517,6 +517,7 @@ type StatefulCmdable interface {
|
|||
Select(ctx context.Context, index int) *StatusCmd
|
||||
SwapDB(ctx context.Context, index1, index2 int) *StatusCmd
|
||||
ClientSetName(ctx context.Context, name string) *BoolCmd
|
||||
ClientSetInfo(ctx context.Context, info LibraryInfo) *StatusCmd
|
||||
Hello(ctx context.Context, ver int, username, password, clientName string) *MapStringInterfaceCmd
|
||||
}
|
||||
|
||||
|
@ -574,6 +575,35 @@ func (c statefulCmdable) ClientSetName(ctx context.Context, name string) *BoolCm
|
|||
return cmd
|
||||
}
|
||||
|
||||
// ClientSetInfo sends a CLIENT SETINFO command with the provided info.
|
||||
func (c statefulCmdable) ClientSetInfo(ctx context.Context, info LibraryInfo) *StatusCmd {
|
||||
err := info.Validate()
|
||||
if err != nil {
|
||||
panic(err.Error())
|
||||
}
|
||||
|
||||
var cmd *StatusCmd
|
||||
if info.LibName != nil {
|
||||
cmd = NewStatusCmd(ctx, "client", "setinfo", "LIB-NAME", *info.LibName)
|
||||
} else {
|
||||
cmd = NewStatusCmd(ctx, "client", "setinfo", "LIB-VER", *info.LibVer)
|
||||
}
|
||||
|
||||
_ = c(ctx, cmd)
|
||||
return cmd
|
||||
}
|
||||
|
||||
// Validate checks if only one field in the struct is non-nil.
|
||||
func (info LibraryInfo) Validate() error {
|
||||
if info.LibName != nil && info.LibVer != nil {
|
||||
return errors.New("both LibName and LibVer cannot be set at the same time")
|
||||
}
|
||||
if info.LibName == nil && info.LibVer == nil {
|
||||
return errors.New("at least one of LibName and LibVer should be set")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// Hello Set the resp protocol used.
|
||||
func (c statefulCmdable) Hello(ctx context.Context,
|
||||
ver int, username, password, clientName string) *MapStringInterfaceCmd {
|
||||
|
|
|
@ -231,6 +231,57 @@ var _ = Describe("Commands", func() {
|
|||
Expect(get.Val()).To(Equal("theclientname"))
|
||||
})
|
||||
|
||||
It("should ClientSetInfo", func() {
|
||||
|
||||
pipe := client.Pipeline()
|
||||
|
||||
// Test setting the libName
|
||||
libName := "go-redis"
|
||||
libInfo := redis.LibraryInfo{LibName: &libName}
|
||||
setInfo := pipe.ClientSetInfo(ctx, libInfo)
|
||||
_, err := pipe.Exec(ctx)
|
||||
|
||||
Expect(err).NotTo(HaveOccurred())
|
||||
Expect(setInfo.Err()).NotTo(HaveOccurred())
|
||||
Expect(setInfo.Val()).To(Equal("OK"))
|
||||
|
||||
// Test setting the libVer
|
||||
libVer := "vX.x"
|
||||
libInfo = redis.LibraryInfo{LibVer: &libVer}
|
||||
setInfo = pipe.ClientSetInfo(ctx, libInfo)
|
||||
_, err = pipe.Exec(ctx)
|
||||
|
||||
Expect(err).NotTo(HaveOccurred())
|
||||
Expect(setInfo.Err()).NotTo(HaveOccurred())
|
||||
Expect(setInfo.Val()).To(Equal("OK"))
|
||||
|
||||
// Test setting both fields, expect a panic
|
||||
libInfo = redis.LibraryInfo{LibName: &libName, LibVer: &libVer}
|
||||
|
||||
Expect(func() {
|
||||
defer func() {
|
||||
if r := recover(); r != nil {
|
||||
err := r.(error)
|
||||
Expect(err).To(MatchError("both LibName and LibVer cannot be set at the same time"))
|
||||
}
|
||||
}()
|
||||
pipe.ClientSetInfo(ctx, libInfo)
|
||||
}).To(Panic())
|
||||
|
||||
// Test setting neither field, expect a panic
|
||||
libInfo = redis.LibraryInfo{}
|
||||
|
||||
Expect(func() {
|
||||
defer func() {
|
||||
if r := recover(); r != nil {
|
||||
err := r.(error)
|
||||
Expect(err).To(MatchError("at least one of LibName and LibVer should be set"))
|
||||
}
|
||||
}()
|
||||
pipe.ClientSetInfo(ctx, libInfo)
|
||||
}).To(Panic())
|
||||
})
|
||||
|
||||
It("should ConfigGet", func() {
|
||||
val, err := client.ConfigGet(ctx, "*").Result()
|
||||
Expect(err).NotTo(HaveOccurred())
|
||||
|
|
Loading…
Reference in New Issue