"errors"
"fmt"
"io"
- "log"
"os"
"path"
"reflect"
"time"
)
-var _ log.Logger
-
type Cacheable interface {
// Updates the last modified time
Touch()
}
func (c *cacheDir) Get(v Cacheable, keys ...cacheKey) (err error) {
+
+ val := reflect.ValueOf(v)
+ if k := val.Kind(); k == reflect.Ptr || k == reflect.Interface {
+ val = val.Elem()
+ }
+ if !val.CanSet() {
+ // panic because this is an internal coding mistake
+ panic("(*cacheDir).Get(): given Cacheable is not setable")
+ }
+
+ flock := lockFile(cachePath(keys...))
+ if flock != nil {
+ flock.Lock()
+ }
defer func() {
- log.Println("Got entry", keys, "(error", err, ")")
+ if flock != nil {
+ flock.Unlock()
+ }
}()
- flock := lockFile(cachePath(keys...))
- flock.Lock()
- defer flock.Unlock()
fh, err := c.Open(keys...)
if err != nil {
return err
}
- defer func() {
- if e := fh.Close(); err == nil {
- err = e
- }
- }()
- val := reflect.ValueOf(v)
- if k := val.Kind(); k == reflect.Ptr || k == reflect.Interface {
- val = val.Elem()
+ buf := bytes.Buffer{}
+ if _, err = io.Copy(&buf, fh); err != nil {
+ fh.Close()
+ return err
}
- if !val.CanSet() {
- // panic because this is an internal coding mistake
- panic("(*cacheDir).Get(): given Cacheable is not setable")
+ if err = fh.Close(); err != nil {
+ return err
+ }
+
+ if flock != nil {
+ flock.Unlock()
+ flock = nil
}
- gz, err := gzip.NewReader(fh)
+
+ gz, err := gzip.NewReader(&buf)
if err != nil {
return err
}
}
}()
- // defer func() {
- // if err == io.EOF {
- // err = nil
- // }
- // }()
-
switch f := gz.Header.Comment; f {
case "encoding/gob":
dec := gob.NewDecoder(gz)
return // no point in saving nil
}
}
- defer func() {
- log.Println("Set entry", keys, "(error", err, ")")
- }()
// First we encode to memory -- we don't want to create/truncate a file and put bad data in it.
buf := bytes.Buffer{}
}
// We have good data, time to actually put it in the cache
- flock := lockFile(cachePath(keys...))
- flock.Lock()
- defer flock.Unlock()
+ if flock := lockFile(cachePath(keys...)); flock != nil {
+ flock.Lock()
+ defer flock.Unlock()
+ }
fh, err := c.Create(keys...)
if err != nil {