From d610d091fed6dbac3a7ae7e6a67e6e8455b77755 Mon Sep 17 00:00:00 2001 From: Frédéric Guillot Date: Wed, 18 Sep 2019 22:41:33 -0700 Subject: Avoid constraint error when having duplicate entries During feed creation, duplicated entries will generate an SQL contraint error. This change ignore the duplicated entry to avoid showing an error. --- storage/entry.go | 6 +++--- storage/feed.go | 9 ++++++--- 2 files changed, 9 insertions(+), 6 deletions(-) (limited to 'storage') diff --git a/storage/entry.go b/storage/entry.go index d3d16bb..f36bcbe 100644 --- a/storage/entry.go +++ b/storage/entry.go @@ -84,7 +84,7 @@ func (s *Storage) createEntry(entry *model.Entry) error { ).Scan(&entry.ID, &entry.Status) if err != nil { - return fmt.Errorf("unable to create entry %q (feed #%d): %v", entry.URL, entry.FeedID, err) + return fmt.Errorf("Unable to create entry %q (feed #%d): %v", entry.URL, entry.FeedID, err) } for i := 0; i < len(entry.Enclosures); i++ { @@ -137,9 +137,9 @@ func (s *Storage) updateEntry(entry *model.Entry) error { // entryExists checks if an entry already exists based on its hash when refreshing a feed. func (s *Storage) entryExists(entry *model.Entry) bool { var result int - query := `SELECT count(*) as c FROM entries WHERE user_id=$1 AND feed_id=$2 AND hash=$3` + query := `SELECT 1 FROM entries WHERE user_id=$1 AND feed_id=$2 AND hash=$3` s.db.QueryRow(query, entry.UserID, entry.FeedID, entry.Hash).Scan(&result) - return result >= 1 + return result == 1 } // cleanupEntries deletes from the database entries marked as "removed" and not visible anymore in the feed. diff --git a/storage/feed.go b/storage/feed.go index 17b37ff..5b98b82 100644 --- a/storage/feed.go +++ b/storage/feed.go @@ -216,9 +216,12 @@ func (s *Storage) CreateFeed(feed *model.Feed) error { for i := 0; i < len(feed.Entries); i++ { feed.Entries[i].FeedID = feed.ID feed.Entries[i].UserID = feed.UserID - err := s.createEntry(feed.Entries[i]) - if err != nil { - return err + + if !s.entryExists(feed.Entries[i]) { + err := s.createEntry(feed.Entries[i]) + if err != nil { + return err + } } } -- cgit v1.2.3