initial work for smarter database cleanup

This commit is contained in:
Nazar Kanaev 2022-02-08 16:29:12 +00:00
parent de3decbffd
commit d0b83babd2
5 changed files with 93 additions and 6 deletions

View File

@ -194,3 +194,15 @@ func (s *Storage) GetFeedErrors() map[int64]string {
} }
return errors return errors
} }
func (s *Storage) SetFeedSize(feedId int64, size int) {
_, err := s.db.Exec(`
insert into feed_sizes (feed_id, size)
values (?, ?)
on conflict (feed_id) do update set size = excluded.size`,
feedId, size,
)
if err != nil {
log.Print(err)
}
}

View File

@ -292,6 +292,13 @@ func (s *Storage) SyncSearch() {
} }
} }
// TODO: better naming
var (
itemsKeepSize = 100
itemsKeepDays = 90
)
func (s *Storage) DeleteOldItems() { func (s *Storage) DeleteOldItems() {
rows, err := s.db.Query(fmt.Sprintf(` rows, err := s.db.Query(fmt.Sprintf(`
select feed_id, count(*) as num_items select feed_id, count(*) as num_items
@ -318,7 +325,7 @@ func (s *Storage) DeleteOldItems() {
delete from items where feed_id = ? and status != ? and date_arrived < ?`, delete from items where feed_id = ? and status != ? and date_arrived < ?`,
feedId, feedId,
STARRED, STARRED,
time.Now().Add(-time.Hour*24*90), // 90 days time.Now().Add(-time.Hour*time.Duration(24*itemsKeepDays)),
) )
if err != nil { if err != nil {
log.Print(err) log.Print(err)

View File

@ -3,6 +3,7 @@ package storage
import ( import (
"log" "log"
"reflect" "reflect"
"strconv"
"testing" "testing"
"time" "time"
) )
@ -271,3 +272,57 @@ func TestMarkItemsRead(t *testing.T) {
t.Fail() t.Fail()
} }
} }
func TestDeleteOldItems(t *testing.T) {
extraItems := 10
now := time.Now()
db := testDB()
feed := db.CreateFeed("feed", "", "", "http://test.com/feed11.xml", nil)
items := make([]Item, 0)
for i := 0; i < itemsKeepSize+extraItems; i++ {
istr := strconv.Itoa(i)
items = append(items, Item{
GUID: istr,
FeedId: feed.Id,
Title: istr,
Date: now.Add(time.Hour * time.Duration(i)),
})
}
db.CreateItems(items)
db.SetFeedSize(feed.Id, len(items))
var feedSize int
err := db.db.QueryRow(
`select size from feed_sizes where feed_id = ?`, feed.Id,
).Scan(&feedSize)
if err != nil {
t.Fatal(err)
}
if feedSize != itemsKeepSize+extraItems {
t.Fatalf(
"expected feed size to get updated\nwant: %d\nhave: %d",
itemsKeepSize+extraItems,
feedSize,
)
}
_, err = db.db.Exec(
`update items set date_arrived = ?`,
now.Add(-time.Hour*time.Duration(itemsKeepDays*24)),
)
if err != nil {
t.Fatal(err)
}
db.DeleteOldItems()
feedItems := db.ListItems(ItemFilter{FeedID: &feed.Id}, 1000, false)
if len(feedItems) != itemsKeepSize {
t.Fatalf(
"invalid number of old items kept\nwant: %d\nhave: %d",
itemsKeepSize,
len(feedItems),
)
}
}

View File

@ -13,6 +13,7 @@ var migrations = []func(*sql.Tx) error{
m04_item_podcasturl, m04_item_podcasturl,
m05_move_description_to_content, m05_move_description_to_content,
m06_fill_missing_dates, m06_fill_missing_dates,
m07_add_feed_size,
} }
var maxVersion = int64(len(migrations)) var maxVersion = int64(len(migrations))
@ -259,3 +260,14 @@ func m06_fill_missing_dates(tx *sql.Tx) error {
_, err := tx.Exec(sql) _, err := tx.Exec(sql)
return err return err
} }
func m07_add_feed_size(tx *sql.Tx) error {
sql := `
create table if not exists feed_sizes (
feed_id references feeds(id) unique,
size integer not null default 0
);
`
_, err := tx.Exec(sql)
return err
}

View File

@ -11,6 +11,7 @@ func testDB() *Storage {
log.SetOutput(io.Discard) log.SetOutput(io.Discard)
db, _ := New(":memory:") db, _ := New(":memory:")
log.SetOutput(os.Stderr) log.SetOutput(os.Stderr)
log.SetFlags(log.Ldate | log.Ltime | log.Lshortfile)
return db return db
} }