/cache/file.go

http://github.com/petar/GoHTTP · Go · 56 lines · 43 code · 8 blank · 5 comment · 10 complexity · 5d65ce9b2c4de36adb16d42118e323d3 MD5 · raw file

  1. // Copyright 2011 The Go Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. package cache
  5. import (
  6. "io/ioutil"
  7. "os"
  8. "sync"
  9. )
  10. // CachedFile is responsible for returning the contents of a single file.
  11. // It remembers the contents in memory, and updates it as necessary.
  12. type CachedFile struct {
  13. sync.Mutex
  14. fname string
  15. data []byte
  16. mtime int64
  17. }
  18. func NewCachedFile(filename string) *CachedFile {
  19. return &CachedFile{fname: filename}
  20. }
  21. func (c *CachedFile) Get() (data []byte, err error) {
  22. c.Lock()
  23. defer c.Unlock()
  24. if c.data == nil {
  25. return c.readFile()
  26. }
  27. fi, err := os.Stat(c.fname)
  28. if err != nil {
  29. return nil, err
  30. }
  31. if fi.ModTime().UnixNano() > c.mtime {
  32. return c.readFile()
  33. }
  34. return c.data, nil
  35. }
  36. func (c *CachedFile) readFile() (data []byte, err error) {
  37. fi, err := os.Stat(c.fname)
  38. if err != nil {
  39. return nil, err
  40. }
  41. data, err = ioutil.ReadFile(c.fname)
  42. if err != nil {
  43. return nil, err
  44. }
  45. c.data = data
  46. c.mtime = fi.ModTime().UnixNano()
  47. return data, nil
  48. }