cache: Add total torrent count and fixes
Cette révision appartient à :
Parent
5d40d02820
révision
58ca34132c
4 fichiers modifiés avec 22 ajouts et 14 suppressions
24
cache/cache.go
externe
24
cache/cache.go
externe
|
@ -35,13 +35,13 @@ type store struct {
|
|||
lastFetched time.Time
|
||||
key common.SearchParam
|
||||
data []model.Torrent
|
||||
size int
|
||||
count, size int
|
||||
}
|
||||
|
||||
// Check the cache for and existing record. If miss, run fn to retrieve fresh
|
||||
// values.
|
||||
func Get(key common.SearchParam, fn func() ([]model.Torrent, error)) (
|
||||
[]model.Torrent, error,
|
||||
func Get(key common.SearchParam, fn func() ([]model.Torrent, int, error)) (
|
||||
data []model.Torrent, count int, err error,
|
||||
) {
|
||||
s := getStore(key)
|
||||
|
||||
|
@ -51,15 +51,15 @@ func Get(key common.SearchParam, fn func() ([]model.Torrent, error)) (
|
|||
defer s.Unlock()
|
||||
|
||||
if s.isFresh() {
|
||||
return s.data, nil
|
||||
return s.data, s.count, nil
|
||||
}
|
||||
|
||||
data, err := fn()
|
||||
data, count, err = fn()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
return
|
||||
}
|
||||
s.update(data)
|
||||
return data, nil
|
||||
s.update(data, count)
|
||||
return
|
||||
}
|
||||
|
||||
// Retrieve a store from the cache or create a new one
|
||||
|
@ -103,17 +103,21 @@ func updateUsedSize(delta int) {
|
|||
|
||||
// Return, if the data can still be considered fresh, without querying the DB
|
||||
func (s *store) isFresh() bool {
|
||||
return s.lastFetched.Add(expiryTime).Before(time.Now())
|
||||
if s.lastFetched.IsZero() { // New store
|
||||
return false
|
||||
}
|
||||
return s.lastFetched.Add(expiryTime).After(time.Now())
|
||||
}
|
||||
|
||||
// Stores the new values of s. Calculates and stores the new size. Passes the
|
||||
// delta to the central cache to fire eviction checks.
|
||||
func (s *store) update(data []model.Torrent) {
|
||||
func (s *store) update(data []model.Torrent, count int) {
|
||||
newSize := 0
|
||||
for _, d := range data {
|
||||
newSize += d.Size()
|
||||
}
|
||||
s.data = data
|
||||
s.count = count
|
||||
delta := newSize - s.size
|
||||
s.size = newSize
|
||||
s.lastFetched = time.Now()
|
||||
|
|
|
@ -41,6 +41,7 @@ type SearchParam struct {
|
|||
Status Status
|
||||
Sort SortMode
|
||||
Category Category
|
||||
Page int
|
||||
Max uint
|
||||
Query string
|
||||
}
|
||||
|
|
|
@ -52,7 +52,9 @@ func (t Torrent) Size() (s int) {
|
|||
2*2 // array pointers
|
||||
s *= 8 // Assume 64 bit OS
|
||||
|
||||
s += t.Uploader.Size()
|
||||
if t.Uploader != nil {
|
||||
s += t.Uploader.Size()
|
||||
}
|
||||
for _, c := range t.OldComments {
|
||||
s += c.Size()
|
||||
}
|
||||
|
|
|
@ -36,6 +36,7 @@ func searchByQuery(r *http.Request, pagenum int, countAll bool) (
|
|||
}
|
||||
search.Max = uint(max)
|
||||
|
||||
search.Page = pagenum
|
||||
search.Query = r.URL.Query().Get("q")
|
||||
|
||||
switch s := r.URL.Query().Get("s"); s {
|
||||
|
@ -94,7 +95,7 @@ func searchByQuery(r *http.Request, pagenum int, countAll bool) (
|
|||
orderBy += "desc"
|
||||
}
|
||||
|
||||
tor, err = cache.Get(search, func() (tor []model.Torrent, err error) {
|
||||
tor, count, err = cache.Get(search, func() (tor []model.Torrent, count int, err error) {
|
||||
parameters := torrentService.WhereParams{
|
||||
Params: make([]interface{}, 0, 64),
|
||||
}
|
||||
|
@ -144,9 +145,9 @@ func searchByQuery(r *http.Request, pagenum int, countAll bool) (
|
|||
parameters.Conditions = strings.Join(conditions[:], " AND ")
|
||||
log.Infof("SQL query is :: %s\n", parameters.Conditions)
|
||||
if countAll {
|
||||
tor, count, err = torrentService.GetTorrentsOrderBy(¶meters, orderBy, int(search.Max), int(search.Max)*(pagenum-1))
|
||||
tor, count, err = torrentService.GetTorrentsOrderBy(¶meters, orderBy, int(search.Max), int(search.Max)*(search.Page-1))
|
||||
} else {
|
||||
tor, err = torrentService.GetTorrentsOrderByNoCount(¶meters, orderBy, int(search.Max), int(search.Max)*(pagenum-1))
|
||||
tor, err = torrentService.GetTorrentsOrderByNoCount(¶meters, orderBy, int(search.Max), int(search.Max)*(search.Page-1))
|
||||
}
|
||||
|
||||
return
|
||||
|
|
Référencer dans un nouveau ticket