diff --git a/cache.go b/cache.go index 30b1ea2..1ce4eeb 100644 --- a/cache.go +++ b/cache.go @@ -115,6 +115,22 @@ func (c *cache) Replace(k string, x interface{}, d time.Duration) error { return nil } +// Update only if it is already existing, keep same ttl +// Set new expiry time which is now - its expiration +func (c *cache) Update(k string, x interface{}) error { + c.mu.Lock() + _, found := c.get(k) + if !found { + c.mu.Unlock() + return fmt.Errorf("Item %s doesn't exist", k) + } + newTtl := time.Unix(0, c.items[k].Expiration) + c.set(k, x, newTtl.Sub(time.Now())) + c.mu.Unlock() + return nil +} + + // Get an item from the cache. Returns the item or nil, and a bool indicating // whether the key was found. func (c *cache) Get(k string) (interface{}, bool) { diff --git a/cache_test.go b/cache_test.go index 47a3d53..e71e02b 100644 --- a/cache_test.go +++ b/cache_test.go @@ -1137,6 +1137,25 @@ func TestReplace(t *testing.T) { } } +func TestUpdate(t *testing.T) { + tc := New(75*time.Millisecond, 1*time.Millisecond) + tc.Set("a", 1, DefaultExpiration) + + <-time.After(50 * time.Millisecond) + _, found := tc.Get("a") + if !found { + t.Error("error in update; didnt find value that was expected") + } + + tc.Update("a", 2) + <-time.After(26 * time.Millisecond) + + a, found := tc.Get("a") + if found || a != nil { + t.Error("Getting A found value that shouldn't exist:", a) + } +} + func TestDelete(t *testing.T) { tc := New(DefaultExpiration, 0) tc.Set("foo", "bar", DefaultExpiration)