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...)
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)
}
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) {
}
}
- return a
+ return true
}
func (a *Anime) populateResources(list []httpapi.Resource) {
return ch
}
- if e := eid.Episode(); !e.IsStale() {
+ e := eid.Episode()
+ if !e.IsStale() {
intentMap.Notify(e, keys...)
return ch
}
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
}
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
return ch
}
- if f := fid.File(); !f.IsStale() {
+ f := fid.File()
+ if !f.IsStale() {
intentMap.Notify(f, keys...)
return ch
}
"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
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",
"amask": fileAmask,
})
- fid := FID(0)
var f *File
if reply.Error() == nil {
f = parseFileResponse(reply)
return ch
}
- if g := gid.Group(); !g.IsStale() {
+ g := gid.Group()
+ if !g.IsStale() {
intentMap.Notify(g, keys...)
return ch
}
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...)
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() {
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