From 8ec137084522b9552a7abc68c9349a1fb9487ee6 Mon Sep 17 00:00:00 2001 From: Nazar Kanaev Date: Tue, 11 Aug 2020 10:55:42 +0100 Subject: [PATCH] change item cleanup logic --- storage/item.go | 60 +++++++++++++++++++++++++++++++++++----------- storage/storage.go | 1 + 2 files changed, 47 insertions(+), 14 deletions(-) diff --git a/storage/item.go b/storage/item.go index a917210..48b162e 100644 --- a/storage/item.go +++ b/storage/item.go @@ -70,18 +70,24 @@ func (s *Storage) CreateItems(items []Item) bool { s.log.Print(err) return false } + now := time.Now() for _, item := range items { _, err = tx.Exec(` insert into items ( guid, feed_id, title, link, description, - content, author, date, date_updated, status, image + content, author, + date, date_updated, date_arrived, + status, image ) - values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) - on conflict (guid) do update set date_updated=?`, + values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + on conflict (guid) do update set + date_updated = ?, date_arrived = ?`, item.GUID, item.FeedId, html.UnescapeString(item.Title), item.Link, item.Description, - item.Content, item.Author, item.Date, item.DateUpdated, UNREAD, item.Image, + item.Content, item.Author, + item.Date, item.DateUpdated, now, + UNREAD, item.Image, // upsert values - item.DateUpdated, + item.DateUpdated, now, ) if err != nil { s.log.Print(err) @@ -316,19 +322,45 @@ func (s *Storage) SyncSearch() { } func (s *Storage) DeleteOldItems() { - result, err := s.db.Exec( - `delete from items where status = ? and date < ?`, - READ, time.Now().Add(-time.Hour*24*90) /* 90 days */) + rows, err := s.db.Query(fmt.Sprintf(` + select feed_id, count(*) as num_items + from items + where status != %d + group by feed_id + having num_items > 50 + `, STARRED)) + if err != nil { s.log.Print(err) return } - num, err := result.RowsAffected() - if err != nil { - s.log.Print(err) - return + + feedIds := make([]int64, 0) + for rows.Next() { + var id int64 + rows.Scan(&id, nil) + feedIds = append(feedIds, id) } - if num > 0 { - s.log.Printf("Deleted %d old items\n", num) + s.log.Print(feedIds) + + for _, feedId := range feedIds { + result, err := s.db.Exec(` + delete from items where feed_id = ? and status != ? and date_arrived < ?`, + feedId, + STARRED, + time.Now().Add(-time.Hour*24*90), // 90 days + ) + if err != nil { + s.log.Print(err) + return + } + num, err := result.RowsAffected() + if err != nil { + s.log.Print(err) + return + } + if num > 0 { + s.log.Printf("Deleted %d old items (%d)", num, feedId) + } } } diff --git a/storage/storage.go b/storage/storage.go index 6c19c7e..38ba92b 100644 --- a/storage/storage.go +++ b/storage/storage.go @@ -40,6 +40,7 @@ create table if not exists items ( author text, date datetime, date_updated datetime, + date_arrived datetime, status integer, image text, search_rowid integer