diff --git a/.claude/settings.local.json b/.claude/settings.local.json deleted file mode 100644 index 67401c0..0000000 --- a/.claude/settings.local.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "permissions": { - "allow": [ - "Bash(rtk grep *)", - "Bash(rtk read *)", - "Bash(rtk git *)" - ], - "additionalDirectories": [ - "/config/.claude/skills/security-audit", - "/config/security-audit-skill", - "/config/.cargo/registry" - ] - } -} diff --git a/CHANGELOG.md b/CHANGELOG.md index 6447e00..6faeb08 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -48,6 +48,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed +- With no limit on new downloads per check (`max_new_per_check = 0`), downloads work on Postgres; they failed. - Checking a feed with a long history is much quicker: items already stored are no longer written again on every check. - A scan no longer asks a feed's website for its icon every time; it asks again when the artwork changes or you refresh the feed. - The feed list loads several times faster: it was asking the database six questions per feed. diff --git a/src/db.rs b/src/db.rs index cea91f8..dfd48a5 100644 --- a/src/db.rs +++ b/src/db.rs @@ -635,7 +635,9 @@ impl Db { WHERE x.feed_id = $1 AND x.state = 'pending' ORDER BY coalesce(e.published, e.first_seen) DESC, x.id DESC LIMIT $2", - vec![feed_id.into(), (limit as i64).into()], + // Unlimited is usize::MAX, which `as i64` makes -1: SQLite reads LIMIT -1 as no + // limit, Postgres refuses it, and the feed's downloads failed (#98). + vec![feed_id.into(), (limit.min(i64::MAX as usize) as i64).into()], ) .await? .iter() @@ -1934,6 +1936,17 @@ mod tests { assert_eq!((list["f"].unread, list["g"].unread), (1, 1)); // a read, c hidden; sam's read is sam's } + #[tokio::test] + async fn an_unlimited_queue_takes_everything_waiting() { + let db = Db::memory().await.unwrap(); + db.exec_for_test( + "INSERT INTO entries (feed_id, guid, first_seen) VALUES ('f','a',0),('f','b',0); + INSERT INTO enclosures (id, feed_id, guid, url, state) VALUES (1,'f','a','u1','pending'),(2,'f','b','u2','pending');", + ).await + .unwrap(); + assert_eq!(db.pending("f", usize::MAX).await.unwrap().len(), 2); + } + #[tokio::test] async fn a_scan_knows_a_feeds_stored_items_and_files() { let db = Db::memory().await.unwrap();