mirror of
https://github.com/redis/go-redis.git
synced 2025-04-17 20:17:02 +03:00
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
|
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
|
Select(ctx context.Context, index int) *StatusCmd
|
||||||
SwapDB(ctx context.Context, index1, index2 int) *StatusCmd
|
SwapDB(ctx context.Context, index1, index2 int) *StatusCmd
|
||||||
ClientSetName(ctx context.Context, name string) *BoolCmd
|
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
|
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
|
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.
|
// Hello Set the resp protocol used.
|
||||||
func (c statefulCmdable) Hello(ctx context.Context,
|
func (c statefulCmdable) Hello(ctx context.Context,
|
||||||
ver int, username, password, clientName string) *MapStringInterfaceCmd {
|
ver int, username, password, clientName string) *MapStringInterfaceCmd {
|
||||||
|
@ -231,6 +231,57 @@ var _ = Describe("Commands", func() {
|
|||||||
Expect(get.Val()).To(Equal("theclientname"))
|
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() {
|
It("should ConfigGet", func() {
|
||||||
val, err := client.ConfigGet(ctx, "*").Result()
|
val, err := client.ConfigGet(ctx, "*").Result()
|
||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
|
Loading…
x
Reference in New Issue
Block a user