Add missing error checks and support for MGET in Scan()

This commit is contained in:
Kailash Nadh 2021-02-03 13:37:27 +05:30
parent e113512c18
commit 600f1665a0
2 changed files with 52 additions and 3 deletions

View File

@ -375,9 +375,21 @@ func (cmd *SliceCmd) String() string {
// Scan scans the results from the map into a destination struct. The map keys // Scan scans the results from the map into a destination struct. The map keys
// are matched in the Redis struct fields by the `redis:"field"` tag. // are matched in the Redis struct fields by the `redis:"field"` tag.
func (cmd *SliceCmd) Scan(dest interface{}) error { func (cmd *SliceCmd) Scan(dest interface{}) error {
// Pass the list of keys and values. Skip the first to args (command, key), if cmd.err != nil {
// eg: HMGET map. return cmd.err
return hscan.Scan(cmd.args[2:], cmd.val, dest) }
// Pass the list of keys and values.
// Skip the first two args for: HMGET key
var args []interface{}
if cmd.args[0] == "hmget" {
args = cmd.args[2:]
} else {
// Otherwise, it's: MGET field field ...
args = cmd.args[1:]
}
return hscan.Scan(args, cmd.val, dest)
} }
func (cmd *SliceCmd) readReply(rd *proto.Reader) error { func (cmd *SliceCmd) readReply(rd *proto.Reader) error {
@ -929,6 +941,10 @@ func (cmd *StringStringMapCmd) String() string {
// Scan scans the results from the map into a destination struct. The map keys // Scan scans the results from the map into a destination struct. The map keys
// are matched in the Redis struct fields by the `redis:"field"` tag. // are matched in the Redis struct fields by the `redis:"field"` tag.
func (cmd *StringStringMapCmd) Scan(dest interface{}) error { func (cmd *StringStringMapCmd) Scan(dest interface{}) error {
if cmd.err != nil {
return cmd.err
}
// Pass the list of keys and values. Skip the first to args (command, key), // Pass the list of keys and values. Skip the first to args (command, key),
// eg: HGETALL map. // eg: HGETALL map.
var ( var (

View File

@ -310,6 +310,39 @@ func ExampleStringStringMapCmd_Scan() {
// Output: {hello 123 true} // Output: {hello 123 true}
} }
// ExampleSliceCmd_Scan shows how to scan the results of a multi key fetch
// into a struct.
func ExampleSliceCmd_Scan() {
rdb.FlushDB(ctx)
err := rdb.MSet(ctx,
"name", "hello",
"count", 123,
"correct", true).Err()
if err != nil {
panic(err)
}
res := rdb.MGet(ctx, "name", "count", "empty", "correct")
if res.Err() != nil {
panic(err)
}
type data struct {
Name string `redis:"name"`
Count int `redis:"count"`
Correct bool `redis:"correct"`
}
// Scan the results into the struct.
var d data
if err := res.Scan(&d); err != nil {
panic(err)
}
fmt.Println(d)
// Output: {hello 123 true}
}
func ExampleClient_Pipelined() { func ExampleClient_Pipelined() {
var incr *redis.IntCmd var incr *redis.IntCmd
_, err := rdb.Pipelined(ctx, func(pipe redis.Pipeliner) error { _, err := rdb.Pipelined(ctx, func(pipe redis.Pipeliner) error {