mirror of
https://github.com/astaxie/beego.git
synced 2024-11-23 18:20:55 +00:00
fix issue #4331
1. Modify Incr&Decr for file cache 2. Add different type of integer testcases for Incr&Decr
This commit is contained in:
parent
54ab211f00
commit
db785479ab
70
client/cache/cache_test.go
vendored
70
client/cache/cache_test.go
vendored
@ -72,21 +72,9 @@ func TestCache(t *testing.T) {
|
|||||||
t.Error("set Error", err)
|
t.Error("set Error", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err = bm.Incr(context.Background(), "astaxie"); err != nil {
|
// test different integer type for incr & decr
|
||||||
t.Error("Incr Error", err)
|
testMultiIncrDecr(t, bm, timeoutDuration)
|
||||||
}
|
|
||||||
|
|
||||||
if v, _ := bm.Get(context.Background(), "astaxie"); v.(int) != 2 {
|
|
||||||
t.Error("get err")
|
|
||||||
}
|
|
||||||
|
|
||||||
if err = bm.Decr(context.Background(), "astaxie"); err != nil {
|
|
||||||
t.Error("Decr Error", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
if v, _ := bm.Get(context.Background(), "astaxie"); v.(int) != 1 {
|
|
||||||
t.Error("get err")
|
|
||||||
}
|
|
||||||
bm.Delete(context.Background(), "astaxie")
|
bm.Delete(context.Background(), "astaxie")
|
||||||
if res, _ := bm.IsExist(context.Background(), "astaxie"); res {
|
if res, _ := bm.IsExist(context.Background(), "astaxie"); res {
|
||||||
t.Error("delete err")
|
t.Error("delete err")
|
||||||
@ -153,21 +141,9 @@ func TestFileCache(t *testing.T) {
|
|||||||
t.Error("get err")
|
t.Error("get err")
|
||||||
}
|
}
|
||||||
|
|
||||||
if err = bm.Incr(context.Background(), "astaxie"); err != nil {
|
// test different integer type for incr & decr
|
||||||
t.Error("Incr Error", err)
|
testMultiIncrDecr(t, bm, timeoutDuration)
|
||||||
}
|
|
||||||
|
|
||||||
if v, _ := bm.Get(context.Background(), "astaxie"); v.(int) != 2 {
|
|
||||||
t.Error("get err")
|
|
||||||
}
|
|
||||||
|
|
||||||
if err = bm.Decr(context.Background(), "astaxie"); err != nil {
|
|
||||||
t.Error("Decr Error", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
if v, _ := bm.Get(context.Background(), "astaxie"); v.(int) != 1 {
|
|
||||||
t.Error("get err")
|
|
||||||
}
|
|
||||||
bm.Delete(context.Background(), "astaxie")
|
bm.Delete(context.Background(), "astaxie")
|
||||||
if res, _ := bm.IsExist(context.Background(), "astaxie"); res {
|
if res, _ := bm.IsExist(context.Background(), "astaxie"); res {
|
||||||
t.Error("delete err")
|
t.Error("delete err")
|
||||||
@ -219,3 +195,41 @@ func TestFileCache(t *testing.T) {
|
|||||||
|
|
||||||
os.RemoveAll("cache")
|
os.RemoveAll("cache")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func testMultiIncrDecr(t *testing.T, c Cache, timeout time.Duration) {
|
||||||
|
testIncrDecr(t, c, 1, 2, timeout)
|
||||||
|
testIncrDecr(t, c, int32(1), int32(2), timeout)
|
||||||
|
testIncrDecr(t, c, int64(1), int64(2), timeout)
|
||||||
|
testIncrDecr(t, c, uint(1), uint(2), timeout)
|
||||||
|
testIncrDecr(t, c, uint32(1), uint32(2), timeout)
|
||||||
|
testIncrDecr(t, c, uint64(1), uint64(2), timeout)
|
||||||
|
}
|
||||||
|
|
||||||
|
func testIncrDecr(t *testing.T, c Cache, beforeIncr interface{}, afterIncr interface{}, timeout time.Duration) {
|
||||||
|
var err error
|
||||||
|
ctx := context.Background()
|
||||||
|
key := "incDecKey"
|
||||||
|
if err = c.Put(ctx, key, beforeIncr, timeout); err != nil {
|
||||||
|
t.Error("Get Error", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err = c.Incr(ctx, key); err != nil {
|
||||||
|
t.Error("Incr Error", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if v, _ := c.Get(ctx, key); v != afterIncr {
|
||||||
|
t.Error("Get Error")
|
||||||
|
}
|
||||||
|
|
||||||
|
if err = c.Decr(ctx, key); err != nil {
|
||||||
|
t.Error("Decr Error", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if v, _ := c.Get(ctx, key); v != beforeIncr {
|
||||||
|
t.Error("Get Error")
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := c.Delete(ctx, key); err != nil {
|
||||||
|
t.Error("Delete Error")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
75
client/cache/file.go
vendored
75
client/cache/file.go
vendored
@ -26,7 +26,6 @@ import (
|
|||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"reflect"
|
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
@ -195,28 +194,70 @@ func (fc *FileCache) Delete(ctx context.Context, key string) error {
|
|||||||
// Incr increases cached int value.
|
// Incr increases cached int value.
|
||||||
// fc value is saved forever unless deleted.
|
// fc value is saved forever unless deleted.
|
||||||
func (fc *FileCache) Incr(ctx context.Context, key string) error {
|
func (fc *FileCache) Incr(ctx context.Context, key string) error {
|
||||||
data, _ := fc.Get(context.Background(), key)
|
data, err := fc.Get(context.Background(), key)
|
||||||
var incr int
|
if err != nil {
|
||||||
if reflect.TypeOf(data).Name() != "int" {
|
return err
|
||||||
incr = 0
|
|
||||||
} else {
|
|
||||||
incr = data.(int) + 1
|
|
||||||
}
|
}
|
||||||
fc.Put(context.Background(), key, incr, time.Duration(fc.EmbedExpiry))
|
|
||||||
return nil
|
var res interface{}
|
||||||
|
switch val := data.(type) {
|
||||||
|
case int:
|
||||||
|
res = val + 1
|
||||||
|
case int32:
|
||||||
|
res = val + 1
|
||||||
|
case int64:
|
||||||
|
res = val + 1
|
||||||
|
case uint:
|
||||||
|
res = val + 1
|
||||||
|
case uint32:
|
||||||
|
res = val + 1
|
||||||
|
case uint64:
|
||||||
|
res = val + 1
|
||||||
|
default:
|
||||||
|
return errors.Errorf("data is not (u)int (u)int32 (u)int64")
|
||||||
|
}
|
||||||
|
|
||||||
|
return fc.Put(context.Background(), key, res, time.Duration(fc.EmbedExpiry))
|
||||||
}
|
}
|
||||||
|
|
||||||
// Decr decreases cached int value.
|
// Decr decreases cached int value.
|
||||||
func (fc *FileCache) Decr(ctx context.Context, key string) error {
|
func (fc *FileCache) Decr(ctx context.Context, key string) error {
|
||||||
data, _ := fc.Get(context.Background(), key)
|
data, err := fc.Get(context.Background(), key)
|
||||||
var decr int
|
if err != nil {
|
||||||
if reflect.TypeOf(data).Name() != "int" || data.(int)-1 <= 0 {
|
return err
|
||||||
decr = 0
|
|
||||||
} else {
|
|
||||||
decr = data.(int) - 1
|
|
||||||
}
|
}
|
||||||
fc.Put(context.Background(), key, decr, time.Duration(fc.EmbedExpiry))
|
|
||||||
return nil
|
var res interface{}
|
||||||
|
switch val := data.(type) {
|
||||||
|
case int:
|
||||||
|
res = val - 1
|
||||||
|
case int32:
|
||||||
|
res = val - 1
|
||||||
|
case int64:
|
||||||
|
res = val - 1
|
||||||
|
case uint:
|
||||||
|
if val > 0 {
|
||||||
|
res = val - 1
|
||||||
|
} else {
|
||||||
|
return errors.New("data val is less than 0")
|
||||||
|
}
|
||||||
|
case uint32:
|
||||||
|
if val > 0 {
|
||||||
|
res = val - 1
|
||||||
|
} else {
|
||||||
|
return errors.New("data val is less than 0")
|
||||||
|
}
|
||||||
|
case uint64:
|
||||||
|
if val > 0 {
|
||||||
|
res = val - 1
|
||||||
|
} else {
|
||||||
|
return errors.New("data val is less than 0")
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
return errors.Errorf("data is not (u)int (u)int32 (u)int64")
|
||||||
|
}
|
||||||
|
|
||||||
|
return fc.Put(context.Background(), key, res, time.Duration(fc.EmbedExpiry))
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsExist checks if value exists.
|
// IsExist checks if value exists.
|
||||||
|
Loading…
Reference in New Issue
Block a user