]> git.lizzy.rs Git - go-anidb.git/commitdiff
anidb: Return the previously available data if API refresh failed
authorDiogo Franco (Kovensky) <diogomfranco@gmail.com>
Mon, 15 Jul 2013 04:06:01 +0000 (01:06 -0300)
committerDiogo Franco (Kovensky) <diogomfranco@gmail.com>
Mon, 15 Jul 2013 04:06:01 +0000 (01:06 -0300)
Makes the GetObjectByKey family of methods behave better if the API
is somehow unavailable.

animecache.go
episodecache.go
filecache.go
groupcache.go

index 2fd104428079a3418290e5fd77690472b63ef26e..f185867ca384017826b20b6b4670820cb35a5950 100644 (file)
@@ -107,7 +107,7 @@ func (adb *AniDB) AnimeByID(aid AID) <-chan *Anime {
                                        ok = false
                                        break Loop
                                }
-                               if a := anime.populateFromHTTP(resp.anime); a == nil {
+                               if !anime.populateFromHTTP(resp.anime) {
                                        // HTTP ok but parsing not ok
                                        if anime.PrimaryTitle == "" {
                                                cache.MarkInvalid(keys...)
@@ -115,13 +115,15 @@ func (adb *AniDB) AnimeByID(aid AID) <-chan *Anime {
 
                                        ok = false
                                        break Loop
-                               } else {
-                                       anime = a
                                }
+
                                httpChan = nil
                        case reply := <-udpChan:
                                if reply.Code() == 330 {
                                        cache.MarkInvalid(keys...)
+
+                                       ok = false
+                                       break Loop
                                } else {
                                        anime.Incomplete = !anime.populateFromUDP(reply)
                                }
@@ -140,9 +142,9 @@ func (adb *AniDB) AnimeByID(aid AID) <-chan *Anime {
        return ch
 }
 
-func (a *Anime) populateFromHTTP(reply httpapi.Anime) *Anime {
+func (a *Anime) populateFromHTTP(reply httpapi.Anime) bool {
        if reply.Error != "" {
-               return (*Anime)(nil)
+               return false
        }
 
        if a.AID != AID(reply.ID) {
@@ -254,7 +256,7 @@ func (a *Anime) populateFromHTTP(reply httpapi.Anime) *Anime {
                }
        }
 
-       return a
+       return true
 }
 
 func (a *Anime) populateResources(list []httpapi.Resource) {
index cfc44d98ffebbb41bbcd6491d95f00f3574ea552..0ed142e262b4f2062bb0a78132f0a82a3d92d5c3 100644 (file)
@@ -55,7 +55,8 @@ func (adb *AniDB) EpisodeByID(eid EID) <-chan *Episode {
                return ch
        }
 
-       if e := eid.Episode(); !e.IsStale() {
+       e := eid.Episode()
+       if !e.IsStale() {
                intentMap.Notify(e, keys...)
                return ch
        }
@@ -69,7 +70,6 @@ func (adb *AniDB) EpisodeByID(eid EID) <-chan *Episode {
 
                udpDone := false
 
-               var e *Episode
                for i := 0; i < 2; i++ {
                        if !ok && udpDone {
                                // couldn't get anime and we already ran the EPISODE query
@@ -94,10 +94,11 @@ func (adb *AniDB) EpisodeByID(eid EID) <-chan *Episode {
                                }
                                udpDone = true
                        }
-                       <-adb.AnimeByID(AID(aid)) // this caches episodes...
-                       e = eid.Episode()         // ...so this is now a cache hit
+                       a := <-adb.AnimeByID(AID(aid)) // this caches episodes...
+                       ep := eid.Episode()            // ...so this is now a cache hit
 
-                       if e != nil {
+                       if !ep.IsStale() {
+                               e = ep
                                break
                        } else {
                                // if this is somehow still a miss, then the EID<->AID map broke
index 10ba2ab7e6d47b43f67ea10ca5e5b3126b02dbd5..1814b6f3c54891c5d4382c1b35e65d122105c659 100644 (file)
@@ -97,7 +97,8 @@ func (adb *AniDB) FileByID(fid FID) <-chan *File {
                return ch
        }
 
-       if f := fid.File(); !f.IsStale() {
+       f := fid.File()
+       if !f.IsStale() {
                intentMap.Notify(f, keys...)
                return ch
        }
@@ -110,16 +111,15 @@ func (adb *AniDB) FileByID(fid FID) <-chan *File {
                                "amask": fileAmask,
                        })
 
-               var f *File
                if reply.Error() == nil {
                        f = parseFileResponse(reply)
-               } else if reply.Code() == 320 {
-                       cache.MarkInvalid(keys...)
-               }
-               if f != nil {
+
                        cache.Set(&ed2kCache{FID: f.FID}, "fid", "by-ed2k", f.Ed2kHash, f.Filesize)
                        cache.Set(f, keys...)
+               } else if reply.Code() == 320 {
+                       cache.MarkInvalid(keys...)
                }
+
                intentMap.Notify(f, keys...)
        }()
        return ch
@@ -148,11 +148,14 @@ func (adb *AniDB) FileByEd2kSize(ed2k string, size int64) <-chan *File {
                return ch
        }
 
+       fid := FID(0)
+
        var ec ed2kCache
-       if cache.Get(&ec, keys...) == nil {
+       if cache.Get(&ec, keys...) == nil; !ec.IsStale() {
                intentMap.Notify(ec.FID, keys...)
                return ch
        }
+       fid = ec.FID
 
        go func() {
                reply := <-adb.udp.SendRecv("FILE",
@@ -163,7 +166,6 @@ func (adb *AniDB) FileByEd2kSize(ed2k string, size int64) <-chan *File {
                                "amask": fileAmask,
                        })
 
-               fid := FID(0)
                var f *File
                if reply.Error() == nil {
                        f = parseFileResponse(reply)
index 6cee34857ce210155a9b8f7ae4b08eb7e87c50b1..65fe3339110d91ed34f54c8e336d6c03078e299f 100644 (file)
@@ -72,7 +72,8 @@ func (adb *AniDB) GroupByID(gid GID) <-chan *Group {
                return ch
        }
 
-       if g := gid.Group(); !g.IsStale() {
+       g := gid.Group()
+       if !g.IsStale() {
                intentMap.Notify(g, keys...)
                return ch
        }
@@ -81,16 +82,14 @@ func (adb *AniDB) GroupByID(gid GID) <-chan *Group {
                reply := <-adb.udp.SendRecv("GROUP",
                        paramMap{"gid": gid})
 
-               var g *Group
                if reply.Error() == nil {
                        g = parseGroupReply(reply)
-               } else if reply.Code() == 350 {
-                       cache.MarkInvalid(keys...)
-               }
-               if g != nil {
+
                        cache.Set(&gidCache{GID: g.GID}, "gid", "by-name", g.Name)
                        cache.Set(&gidCache{GID: g.GID}, "gid", "by-shortname", g.ShortName)
                        cache.Set(g, keys...)
+               } else if reply.Code() == 350 {
+                       cache.MarkInvalid(keys...)
                }
 
                intentMap.Notify(g, keys...)
@@ -121,15 +120,21 @@ func (adb *AniDB) GroupByName(gname string) <-chan *Group {
                return ch
        }
 
+       gid := GID(0)
+
        var gc gidCache
-       if cache.Get(&gc, keys...) == nil {
+       if cache.Get(&gc, keys...) == nil; !gc.IsStale() {
                intentMap.Notify(gc.GID, keys...)
                return ch
        }
+       gid = gc.GID
 
-       if cache.Get(&gc, altKeys...) == nil {
-               intentMap.Notify(gc.GID, keys...)
-               return ch
+       if gid == 0 {
+               if cache.Get(&gc, altKeys...) == nil; !gc.IsStale() {
+                       intentMap.Notify(gc.GID, keys...)
+                       return ch
+               }
+               gid = gc.GID
        }
 
        go func() {
@@ -139,18 +144,16 @@ func (adb *AniDB) GroupByName(gname string) <-chan *Group {
                var g *Group
                if reply.Error() == nil {
                        g = parseGroupReply(reply)
-               } else if reply.Code() == 350 {
-                       cache.MarkInvalid(keys...)
-               }
 
-               gid := GID(0)
-               if g != nil {
                        gid = g.GID
 
                        cache.Set(&gidCache{GID: gid}, keys...)
                        cache.Set(&gidCache{GID: gid}, altKeys...)
                        cache.Set(g, "gid", gid)
+               } else if reply.Code() == 350 {
+                       cache.MarkInvalid(keys...)
                }
+
                intentMap.Notify(gid, keys...)
        }()
        return ch