From ee63ee32b080dfa9825759f35d2059498c98ffb8 Mon Sep 17 00:00:00 2001 From: Tim Van Baak Date: Tue, 18 Feb 2025 19:50:19 -0800 Subject: [PATCH] Add lastUpdated to sources --- core/source.go | 24 ++++++++++++++++++++++-- core/source_test.go | 28 ++++++++++++++++++++++++++++ core/sql/0001_initial_schema.sql | 1 + 3 files changed, 51 insertions(+), 2 deletions(-) diff --git a/core/source.go b/core/source.go index 4631529..0a7a71b 100644 --- a/core/source.go +++ b/core/source.go @@ -12,8 +12,8 @@ import ( func AddSource(db DB, name string) error { _, err := db.Exec(` - insert into sources (name) - values (?) + insert into sources (name, lastUpdated) + values (?, 0) `, name) return err @@ -70,6 +70,22 @@ func SetState(db DB, source string, state []byte) error { return err } +func GetLastUpdated(db DB, source string) (time.Time, error) { + row := db.QueryRow("select lastUpdated from sources where name = ?", source) + var updated int + err := row.Scan(&updated) + return time.Unix(int64(updated), 0).UTC(), err +} + +func BumpLastUpdated(db DB, source string, now time.Time) error { + _, err := db.Exec(` + update sources + set lastUpdated = ? + where name = ? + `, now.Unix(), source) + return err +} + func getSourceTtx(db DB, source string, env string) (int, error) { row := db.QueryRow(` select value @@ -268,5 +284,9 @@ func updateWithFetchedItemsTx( return 0, 0, err } + if err = BumpLastUpdated(db, source, now); err != nil { + return 0, 0, err + } + return len(newItems), len(idsToDelete), nil } diff --git a/core/source_test.go b/core/source_test.go index 5e0a88c..b39c76e 100644 --- a/core/source_test.go +++ b/core/source_test.go @@ -322,3 +322,31 @@ func TestSourceTtx(t *testing.T) { t.Fatalf("Missing value after postProcess: ttl = %d, ttd = %d, tts = %d", after.Ttl, after.Ttd, after.Tts) } } + +func TestSourceLastUpdated(t *testing.T) { + db := EphemeralDb(t) + if err := AddSource(db, "s"); err != nil { + t.Fatal(err) + } + updated, err := GetLastUpdated(db, "s") + if err != nil { + t.Fatalf("failed to get lastUpdated: %v", err) + } + if updated != time.Unix(0, 0).UTC() { + t.Fatalf("expected epoch time, got %v", updated) + } + + now := time.Now().UTC().Round(time.Second) + _, _, err = UpdateWithFetchedItems(db, "s", nil, nil, now) + if err != nil { + t.Fatal(err) + } + + updated, err = GetLastUpdated(db, "s") + if err != nil { + t.Fatalf("failed to get lastUpdated: %v", err) + } + if updated != now { + t.Fatalf("incorrect last updated time\nnow: %v\ngot: %v", now, updated) + } +} diff --git a/core/sql/0001_initial_schema.sql b/core/sql/0001_initial_schema.sql index c0089e3..1641210 100644 --- a/core/sql/0001_initial_schema.sql +++ b/core/sql/0001_initial_schema.sql @@ -1,6 +1,7 @@ create table sources( name text not null, state blob, + lastUpdated int not null, primary key (name) ) strict; create table actions(