|
@@ -135,6 +135,100 @@ func TestCachedConn_QueryRowIndex_HasCache(t *testing.T) {
|
|
assert.Equal(t, `"xin"`, val)
|
|
assert.Equal(t, `"xin"`, val)
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+func TestCachedConn_QueryRowIndex_HasCache_IntPrimary(t *testing.T) {
|
|
|
|
+ const (
|
|
|
|
+ primaryInt8 int8 = 100
|
|
|
|
+ primaryInt16 int16 = 10000
|
|
|
|
+ primaryInt32 int32 = 10000000
|
|
|
|
+ primaryInt64 int64 = 10000000
|
|
|
|
+ primaryUint8 uint8 = 100
|
|
|
|
+ primaryUint16 uint16 = 10000
|
|
|
|
+ primaryUint32 uint32 = 10000000
|
|
|
|
+ primaryUint64 uint64 = 10000000
|
|
|
|
+ )
|
|
|
|
+ tests := []struct {
|
|
|
|
+ name string
|
|
|
|
+ primary interface{}
|
|
|
|
+ primaryCache string
|
|
|
|
+ }{
|
|
|
|
+ {
|
|
|
|
+ name: "int8 primary",
|
|
|
|
+ primary: primaryInt8,
|
|
|
|
+ primaryCache: fmt.Sprint(primaryInt8),
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ name: "int16 primary",
|
|
|
|
+ primary: primaryInt16,
|
|
|
|
+ primaryCache: fmt.Sprint(primaryInt16),
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ name: "int32 primary",
|
|
|
|
+ primary: primaryInt32,
|
|
|
|
+ primaryCache: fmt.Sprint(primaryInt32),
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ name: "int64 primary",
|
|
|
|
+ primary: primaryInt64,
|
|
|
|
+ primaryCache: fmt.Sprint(primaryInt64),
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ name: "uint8 primary",
|
|
|
|
+ primary: primaryUint8,
|
|
|
|
+ primaryCache: fmt.Sprint(primaryUint8),
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ name: "uint16 primary",
|
|
|
|
+ primary: primaryUint16,
|
|
|
|
+ primaryCache: fmt.Sprint(primaryUint16),
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ name: "uint32 primary",
|
|
|
|
+ primary: primaryUint32,
|
|
|
|
+ primaryCache: fmt.Sprint(primaryUint32),
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ name: "uint64 primary",
|
|
|
|
+ primary: primaryUint64,
|
|
|
|
+ primaryCache: fmt.Sprint(primaryUint64),
|
|
|
|
+ },
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ for _, test := range tests {
|
|
|
|
+ t.Run(test.name, func(t *testing.T) {
|
|
|
|
+ resetStats()
|
|
|
|
+ s, err := miniredis.Run()
|
|
|
|
+ if err != nil {
|
|
|
|
+ t.Error(err)
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ r := redis.NewRedis(s.Addr(), redis.NodeType)
|
|
|
|
+ c := NewNodeConn(dummySqlConn{}, r, cache.WithExpiry(time.Second*10),
|
|
|
|
+ cache.WithNotFoundExpiry(time.Second))
|
|
|
|
+
|
|
|
|
+ var str string
|
|
|
|
+ r.Set("index", test.primaryCache)
|
|
|
|
+ err = c.QueryRowIndex(&str, "index", func(s interface{}) string {
|
|
|
|
+ return fmt.Sprintf("%v/1234", s)
|
|
|
|
+ }, func(conn sqlx.SqlConn, v interface{}) (interface{}, error) {
|
|
|
|
+ assert.Fail(t, "should not go here")
|
|
|
|
+ return test.primary, nil
|
|
|
|
+ }, func(conn sqlx.SqlConn, v, primary interface{}) error {
|
|
|
|
+ *v.(*string) = "xin"
|
|
|
|
+ assert.Equal(t, primary, primary)
|
|
|
|
+ return nil
|
|
|
|
+ })
|
|
|
|
+ assert.Nil(t, err)
|
|
|
|
+ assert.Equal(t, "xin", str)
|
|
|
|
+ val, err := r.Get("index")
|
|
|
|
+ assert.Nil(t, err)
|
|
|
|
+ assert.Equal(t, test.primaryCache, val)
|
|
|
|
+ val, err = r.Get(test.primaryCache + "/1234")
|
|
|
|
+ assert.Nil(t, err)
|
|
|
|
+ assert.Equal(t, `"xin"`, val)
|
|
|
|
+ })
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
func TestCachedConn_QueryRowIndex_HasWrongCache(t *testing.T) {
|
|
func TestCachedConn_QueryRowIndex_HasWrongCache(t *testing.T) {
|
|
caches := map[string]string{
|
|
caches := map[string]string{
|
|
"index": "primary",
|
|
"index": "primary",
|