aboutsummaryrefslogtreecommitdiff
path: root/vendor/github.com/go-macaron/cache/memory.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/go-macaron/cache/memory.go')
-rw-r--r--vendor/github.com/go-macaron/cache/memory.go179
1 files changed, 0 insertions, 179 deletions
diff --git a/vendor/github.com/go-macaron/cache/memory.go b/vendor/github.com/go-macaron/cache/memory.go
deleted file mode 100644
index 2d5a8fac..00000000
--- a/vendor/github.com/go-macaron/cache/memory.go
+++ /dev/null
@@ -1,179 +0,0 @@
-// Copyright 2013 Beego Authors
-// Copyright 2014 The Macaron Authors
-//
-// Licensed under the Apache License, Version 2.0 (the "License"): you may
-// not use this file except in compliance with the License. You may obtain
-// a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations
-// under the License.
-
-package cache
-
-import (
- "errors"
- "sync"
- "time"
-)
-
-// MemoryItem represents a memory cache item.
-type MemoryItem struct {
- val interface{}
- created int64
- expire int64
-}
-
-func (item *MemoryItem) hasExpired() bool {
- return item.expire > 0 &&
- (time.Now().Unix()-item.created) >= item.expire
-}
-
-// MemoryCacher represents a memory cache adapter implementation.
-type MemoryCacher struct {
- lock sync.RWMutex
- items map[string]*MemoryItem
- interval int // GC interval.
-}
-
-// NewMemoryCacher creates and returns a new memory cacher.
-func NewMemoryCacher() *MemoryCacher {
- return &MemoryCacher{items: make(map[string]*MemoryItem)}
-}
-
-// Put puts value into cache with key and expire time.
-// If expired is 0, it will be deleted by next GC operation.
-func (c *MemoryCacher) Put(key string, val interface{}, expire int64) error {
- c.lock.Lock()
- defer c.lock.Unlock()
-
- c.items[key] = &MemoryItem{
- val: val,
- created: time.Now().Unix(),
- expire: expire,
- }
- return nil
-}
-
-// Get gets cached value by given key.
-func (c *MemoryCacher) Get(key string) interface{} {
- c.lock.RLock()
- defer c.lock.RUnlock()
-
- item, ok := c.items[key]
- if !ok {
- return nil
- }
- if item.hasExpired() {
- go c.Delete(key)
- return nil
- }
- return item.val
-}
-
-// Delete deletes cached value by given key.
-func (c *MemoryCacher) Delete(key string) error {
- c.lock.Lock()
- defer c.lock.Unlock()
-
- delete(c.items, key)
- return nil
-}
-
-// Incr increases cached int-type value by given key as a counter.
-func (c *MemoryCacher) Incr(key string) (err error) {
- c.lock.RLock()
- defer c.lock.RUnlock()
-
- item, ok := c.items[key]
- if !ok {
- return errors.New("key not exist")
- }
- item.val, err = Incr(item.val)
- return err
-}
-
-// Decr decreases cached int-type value by given key as a counter.
-func (c *MemoryCacher) Decr(key string) (err error) {
- c.lock.RLock()
- defer c.lock.RUnlock()
-
- item, ok := c.items[key]
- if !ok {
- return errors.New("key not exist")
- }
-
- item.val, err = Decr(item.val)
- return err
-}
-
-// IsExist returns true if cached value exists.
-func (c *MemoryCacher) IsExist(key string) bool {
- c.lock.RLock()
- defer c.lock.RUnlock()
-
- _, ok := c.items[key]
- return ok
-}
-
-// Flush deletes all cached data.
-func (c *MemoryCacher) Flush() error {
- c.lock.Lock()
- defer c.lock.Unlock()
-
- c.items = make(map[string]*MemoryItem)
- return nil
-}
-
-func (c *MemoryCacher) checkRawExpiration(key string) {
- item, ok := c.items[key]
- if !ok {
- return
- }
-
- if item.hasExpired() {
- delete(c.items, key)
- }
-}
-
-func (c *MemoryCacher) checkExpiration(key string) {
- c.lock.Lock()
- defer c.lock.Unlock()
-
- c.checkRawExpiration(key)
-}
-
-func (c *MemoryCacher) startGC() {
- c.lock.Lock()
- defer c.lock.Unlock()
-
- if c.interval < 1 {
- return
- }
-
- if c.items != nil {
- for key, _ := range c.items {
- c.checkRawExpiration(key)
- }
- }
-
- time.AfterFunc(time.Duration(c.interval)*time.Second, func() { c.startGC() })
-}
-
-// StartAndGC starts GC routine based on config string settings.
-func (c *MemoryCacher) StartAndGC(opt Options) error {
- c.lock.Lock()
- c.interval = opt.Interval
- c.lock.Unlock()
-
- go c.startGC()
- return nil
-}
-
-func init() {
- Register("memory", NewMemoryCacher())
-}