Skip to content

Commit f169894

Browse files
authored
Fix/issue 1384 (#1529)
Add support for scanning time.TIme
1 parent 36223c9 commit f169894

File tree

2 files changed

+41
-3
lines changed

2 files changed

+41
-3
lines changed

internal/proto/scan.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,13 @@ import (
44
"encoding"
55
"fmt"
66
"reflect"
7+
"time"
78

89
"github.com/go-redis/redis/v8/internal/util"
910
)
1011

12+
// Scan parses bytes `b` to `v` with appropriate type.
13+
// nolint: gocyclo
1114
func Scan(b []byte, v interface{}) error {
1215
switch v := v.(type) {
1316
case nil:
@@ -99,6 +102,10 @@ func Scan(b []byte, v interface{}) error {
99102
case *bool:
100103
*v = len(b) == 1 && b[0] == '1'
101104
return nil
105+
case *time.Time:
106+
var err error
107+
*v, err = time.Parse(time.RFC3339Nano, util.BytesToString(b))
108+
return err
102109
case encoding.BinaryUnmarshaler:
103110
return v.UnmarshalBinary(b)
104111
default:

internal/proto/scan_test.go

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,14 @@
1-
package proto
1+
package proto_test
22

33
import (
4+
"context"
45
"encoding/json"
6+
"errors"
7+
"testing"
8+
"time"
59

10+
"github.com/go-redis/redis/v8"
11+
"github.com/go-redis/redis/v8/internal/proto"
612
. "github.com/onsi/ginkgo"
713
. "github.com/onsi/gomega"
814
)
@@ -28,7 +34,7 @@ var _ = Describe("ScanSlice", func() {
2834

2935
It("[]testScanSliceStruct", func() {
3036
var slice []testScanSliceStruct
31-
err := ScanSlice(data, &slice)
37+
err := proto.ScanSlice(data, &slice)
3238
Expect(err).NotTo(HaveOccurred())
3339
Expect(slice).To(Equal([]testScanSliceStruct{
3440
{-1, "Back Yu"},
@@ -38,11 +44,36 @@ var _ = Describe("ScanSlice", func() {
3844

3945
It("var testContainer []*testScanSliceStruct", func() {
4046
var slice []*testScanSliceStruct
41-
err := ScanSlice(data, &slice)
47+
err := proto.ScanSlice(data, &slice)
4248
Expect(err).NotTo(HaveOccurred())
4349
Expect(slice).To(Equal([]*testScanSliceStruct{
4450
{-1, "Back Yu"},
4551
{1, "szyhf"},
4652
}))
4753
})
4854
})
55+
56+
func TestScan(t *testing.T) {
57+
t.Parallel()
58+
59+
t.Run("time", func(t *testing.T) {
60+
t.Parallel()
61+
62+
ctx := context.Background()
63+
64+
rdb := redis.NewClient(&redis.Options{
65+
Addr: ":6379",
66+
})
67+
68+
tm := time.Now()
69+
rdb.Set(ctx, "now", tm, 0)
70+
71+
var tm2 time.Time
72+
rdb.Get(ctx, "now").Scan(&tm2)
73+
74+
if !tm2.Equal(tm) {
75+
t.Fatal(errors.New("tm2 and tm are not equal"))
76+
}
77+
})
78+
79+
}

0 commit comments

Comments
 (0)