aboutsummaryrefslogtreecommitdiff
path: root/ride
diff options
context:
space:
mode:
Diffstat (limited to 'ride')
-rw-r--r--ride/store.go12
-rw-r--r--ride/store_test.go14
2 files changed, 24 insertions, 2 deletions
diff --git a/ride/store.go b/ride/store.go
index 162b912..56cd087 100644
--- a/ride/store.go
+++ b/ride/store.go
@@ -91,7 +91,10 @@ func Save(db *sql.DB, r StoredRide) error {
return err
}
-func Backfill(db *sql.DB) (int, error) {
+// Backfill recomputes and persists stored ride values for every ride. An
+// optional reporter is invoked with the number of rides processed and the
+// total, so callers (e.g. the CLI) can render progress.
+func Backfill(db *sql.DB, reporters ...func(current, total int)) (int, error) {
rows, err := db.Query("SELECT " + columns + " FROM rides ORDER BY id")
if err != nil {
return 0, err
@@ -113,7 +116,12 @@ func Backfill(db *sql.DB) (int, error) {
return 0, err
}
backfilled := 0
- for _, item := range pending {
+ report := func(int, int) {}
+ if len(reporters) > 0 {
+ report = reporters[0]
+ }
+ for i, item := range pending {
+ report(i+1, len(pending))
if err := Save(db, item); err != nil {
slog.Warn("Failed to backfill ride values", "ride", item.ExternalID, "file", item.GPXPath, "error", err)
continue
diff --git a/ride/store_test.go b/ride/store_test.go
index 877f4e5..89c4830 100644
--- a/ride/store_test.go
+++ b/ride/store_test.go
@@ -197,6 +197,20 @@ func TestBackfill(t *testing.T) {
assert.Equal(t, 1, count)
}
+func TestBackfillReportsProgress(t *testing.T) {
+ db := newTestDB(t)
+ require.NoError(t, Save(db, sampleRide(t)))
+
+ var calls [][2]int
+ count, err := Backfill(db, func(current, total int) {
+ calls = append(calls, [2]int{current, total})
+ })
+ require.NoError(t, err)
+ assert.Equal(t, 1, count)
+ require.Len(t, calls, 1)
+ assert.Equal(t, [2]int{1, 1}, calls[0])
+}
+
func TestBackfillSkipsInvalidRide(t *testing.T) {
db := newTestDB(t)
_, err := db.Exec(`