瀏覽代碼

perf(storage): factorize away a query

In InsertEntryForFeed, there is no need to check if an entry exists and then
get its hash. Instead, try to get its hash, and consider the ErrNoRows error as
an existence check.
jvoisin 3 月之前
父節點
當前提交
5f3049d1ce
共有 1 個文件被更改,包括 7 次插入7 次删除
  1. 7 7
      internal/storage/entry.go

+ 7 - 7
internal/storage/entry.go

@@ -245,6 +245,9 @@ func (s *Storage) getEntryIDByHash(tx *sql.Tx, feedID int64, entryHash string) (
 		entryHash,
 		entryHash,
 	).Scan(&entryID)
 	).Scan(&entryID)
 
 
+	if err == sql.ErrNoRows {
+		return 0, nil
+	}
 	if err != nil {
 	if err != nil {
 		return 0, fmt.Errorf(`store: unable to fetch entry ID: %v`, err)
 		return 0, fmt.Errorf(`store: unable to fetch entry ID: %v`, err)
 	}
 	}
@@ -264,16 +267,13 @@ func (s *Storage) InsertEntryForFeed(userID, feedID int64, entry *model.Entry) (
 	}
 	}
 	defer tx.Rollback()
 	defer tx.Rollback()
 
 
-	exists, err := s.entryExists(tx, entry)
+	entryID, err := s.getEntryIDByHash(tx, entry.FeedID, entry.Hash)
 	if err != nil {
 	if err != nil {
 		return false, err
 		return false, err
 	}
 	}
+	alreadyExistingEntry := entryID > 0
 
 
-	if exists {
-		entryID, err := s.getEntryIDByHash(tx, entry.FeedID, entry.Hash)
-		if err != nil {
-			return false, err
-		}
+	if alreadyExistingEntry {
 		entry.ID = entryID
 		entry.ID = entryID
 	} else {
 	} else {
 		if err := s.createEntry(tx, entry); err != nil {
 		if err := s.createEntry(tx, entry); err != nil {
@@ -285,7 +285,7 @@ func (s *Storage) InsertEntryForFeed(userID, feedID int64, entry *model.Entry) (
 		return false, err
 		return false, err
 	}
 	}
 
 
-	return !exists, nil
+	return !alreadyExistingEntry, nil
 }
 }
 
 
 func (s *Storage) IsNewEntry(feedID int64, entryHash string) bool {
 func (s *Storage) IsNewEntry(feedID int64, entryHash string) bool {