]> git.lizzy.rs Git - go-anidb.git/blobdiff - cache.go
anidb: Handle invalid AID HTTP API response
[go-anidb.git] / cache.go
index 64cae67f451d6f4845af248635d2b5349befd67c..bdbe6f8973596bf6a970b35cb8930fd5c848d6d2 100644 (file)
--- a/cache.go
+++ b/cache.go
@@ -7,7 +7,6 @@ import (
        "errors"
        "fmt"
        "io"
-       "log"
        "os"
        "path"
        "reflect"
@@ -16,8 +15,6 @@ import (
        "time"
 )
 
-var _ log.Logger
-
 type Cacheable interface {
        // Updates the last modified time
        Touch()
@@ -142,33 +139,46 @@ func (c *cacheDir) DeleteAll(keys ...cacheKey) (err error) {
 }
 
 func (c *cacheDir) Get(v Cacheable, keys ...cacheKey) (err error) {
-       defer func() {
-               log.Println("Got entry", keys, "(error", err, ")")
-       }()
-       if flock := lockFile(cachePath(keys...)); flock != nil {
+
+       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 flock.Unlock()
        }
+       defer func() {
+               if flock != nil {
+                       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
        }
@@ -178,12 +188,6 @@ func (c *cacheDir) Get(v Cacheable, keys ...cacheKey) (err error) {
                }
        }()
 
-       // defer func() {
-       //      if err == io.EOF {
-       //              err = nil
-       //      }
-       // }()
-
        switch f := gz.Header.Comment; f {
        case "encoding/gob":
                dec := gob.NewDecoder(gz)
@@ -203,9 +207,6 @@ func (c *cacheDir) Set(v Cacheable, keys ...cacheKey) (n int64, err error) {
                        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{}