diff options
author | Unknwon <u@gogs.io> | 2019-10-23 23:03:17 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-10-23 23:03:17 -0700 |
commit | 613139e7bef81d3573e7988a47eb6765f3de347a (patch) | |
tree | 49de7277898d3ff47a122c072568edb8ed4c9ac9 /vendor/github.com/go-macaron/cache/file.go | |
parent | fb100dbf98f02e4c631d142ff0f52ec29ee2f00c (diff) |
Enable Go modules (#5835)
* Remove vendor
* Enable Go modules
* ci: add command to fetch dependencies
* ci: update setting
* ci: update settings
* Require Go 1.11
* Rename module name to gogs.io/gogs
Diffstat (limited to 'vendor/github.com/go-macaron/cache/file.go')
-rw-r--r-- | vendor/github.com/go-macaron/cache/file.go | 208 |
1 files changed, 0 insertions, 208 deletions
diff --git a/vendor/github.com/go-macaron/cache/file.go b/vendor/github.com/go-macaron/cache/file.go deleted file mode 100644 index d9a33dcf..00000000 --- a/vendor/github.com/go-macaron/cache/file.go +++ /dev/null @@ -1,208 +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 ( - "crypto/md5" - "encoding/hex" - "fmt" - "io/ioutil" - "log" - "os" - "path/filepath" - "sync" - "time" - - "github.com/Unknwon/com" - "gopkg.in/macaron.v1" -) - -// Item represents a cache item. -type Item struct { - Val interface{} - Created int64 - Expire int64 -} - -func (item *Item) hasExpired() bool { - return item.Expire > 0 && - (time.Now().Unix()-item.Created) >= item.Expire -} - -// FileCacher represents a file cache adapter implementation. -type FileCacher struct { - lock sync.Mutex - rootPath string - interval int // GC interval. -} - -// NewFileCacher creates and returns a new file cacher. -func NewFileCacher() *FileCacher { - return &FileCacher{} -} - -func (c *FileCacher) filepath(key string) string { - m := md5.Sum([]byte(key)) - hash := hex.EncodeToString(m[:]) - return filepath.Join(c.rootPath, string(hash[0]), string(hash[1]), hash) -} - -// Put puts value into cache with key and expire time. -// If expired is 0, it will not be deleted by GC. -func (c *FileCacher) Put(key string, val interface{}, expire int64) error { - filename := c.filepath(key) - item := &Item{val, time.Now().Unix(), expire} - data, err := EncodeGob(item) - if err != nil { - return err - } - - os.MkdirAll(filepath.Dir(filename), os.ModePerm) - return ioutil.WriteFile(filename, data, os.ModePerm) -} - -func (c *FileCacher) read(key string) (*Item, error) { - filename := c.filepath(key) - - data, err := ioutil.ReadFile(filename) - if err != nil { - return nil, err - } - - item := new(Item) - return item, DecodeGob(data, item) -} - -// Get gets cached value by given key. -func (c *FileCacher) Get(key string) interface{} { - item, err := c.read(key) - if err != nil { - return nil - } - - if item.hasExpired() { - os.Remove(c.filepath(key)) - return nil - } - return item.Val -} - -// Delete deletes cached value by given key. -func (c *FileCacher) Delete(key string) error { - return os.Remove(c.filepath(key)) -} - -// Incr increases cached int-type value by given key as a counter. -func (c *FileCacher) Incr(key string) error { - item, err := c.read(key) - if err != nil { - return err - } - - item.Val, err = Incr(item.Val) - if err != nil { - return err - } - - return c.Put(key, item.Val, item.Expire) -} - -// Decrease cached int value. -func (c *FileCacher) Decr(key string) error { - item, err := c.read(key) - if err != nil { - return err - } - - item.Val, err = Decr(item.Val) - if err != nil { - return err - } - - return c.Put(key, item.Val, item.Expire) -} - -// IsExist returns true if cached value exists. -func (c *FileCacher) IsExist(key string) bool { - return com.IsExist(c.filepath(key)) -} - -// Flush deletes all cached data. -func (c *FileCacher) Flush() error { - return os.RemoveAll(c.rootPath) -} - -func (c *FileCacher) startGC() { - c.lock.Lock() - defer c.lock.Unlock() - - if c.interval < 1 { - return - } - - if err := filepath.Walk(c.rootPath, func(path string, fi os.FileInfo, err error) error { - if err != nil { - return fmt.Errorf("Walk: %v", err) - } - - if fi.IsDir() { - return nil - } - - data, err := ioutil.ReadFile(path) - if err != nil && !os.IsNotExist(err) { - fmt.Errorf("ReadFile: %v", err) - } - - item := new(Item) - if err = DecodeGob(data, item); err != nil { - return err - } - if item.hasExpired() { - if err = os.Remove(path); err != nil && !os.IsNotExist(err) { - return fmt.Errorf("Remove: %v", err) - } - } - return nil - }); err != nil { - log.Printf("error garbage collecting cache files: %v", err) - } - - time.AfterFunc(time.Duration(c.interval)*time.Second, func() { c.startGC() }) -} - -// StartAndGC starts GC routine based on config string settings. -func (c *FileCacher) StartAndGC(opt Options) error { - c.lock.Lock() - c.rootPath = opt.AdapterConfig - c.interval = opt.Interval - - if !filepath.IsAbs(c.rootPath) { - c.rootPath = filepath.Join(macaron.Root, c.rootPath) - } - c.lock.Unlock() - - if err := os.MkdirAll(c.rootPath, os.ModePerm); err != nil { - return err - } - - go c.startGC() - return nil -} - -func init() { - Register("file", NewFileCacher()) -} |