fix sqlite conflict handling for feeds/folders

This commit is contained in:
Nazar Kanaev 2023-08-19 21:51:05 +01:00
parent 98934daee4
commit 6d16e93008
3 changed files with 34 additions and 31 deletions

View File

@ -20,18 +20,19 @@ func (s *Storage) CreateFeed(title, description, link, feedLink string, folderId
if title == "" { if title == "" {
title = feedLink title = feedLink
} }
result, err := s.db.Exec(` row := s.db.QueryRow(`
insert into feeds (title, description, link, feed_link, folder_id) insert into feeds (title, description, link, feed_link, folder_id)
values (?, ?, ?, ?, ?) values (?, ?, ?, ?, ?)
on conflict (feed_link) do update set folder_id=?`, on conflict (feed_link) do update set folder_id = ?
returning id`,
title, description, link, feedLink, folderId, title, description, link, feedLink, folderId,
folderId, folderId,
) )
var id int64
err := row.Scan(&id)
if err != nil { if err != nil {
return nil log.Print(err)
}
id, idErr := result.LastInsertId()
if idErr != nil {
return nil return nil
} }
return &Feed{ return &Feed{

View File

@ -17,6 +17,23 @@ func TestCreateFeed(t *testing.T) {
} }
} }
func TestCreateFeedSameLink(t *testing.T) {
db := testDB()
feed1 := db.CreateFeed("title", "", "", "http://example1.com/feed.xml", nil)
if feed1 == nil || feed1.Id == 0 {
t.Fatal("expected feed")
}
for i := 0; i < 10; i++ {
db.CreateFeed("title", "", "", "http://example2.com/feed.xml", nil)
}
feed2 := db.CreateFeed("title", "", "http://example.com", "http://example1.com/feed.xml", nil)
if feed1.Id != feed2.Id {
t.Fatalf("expected the same feed.\nwant: %#v\nhave: %#v", feed1, feed2)
}
}
func TestReadFeed(t *testing.T) { func TestReadFeed(t *testing.T) {
db := testDB() db := testDB()
if db.GetFeed(100500) != nil { if db.GetFeed(100500) != nil {

View File

@ -1,7 +1,6 @@
package storage package storage
import ( import (
"fmt"
"log" "log"
) )
@ -13,35 +12,21 @@ type Folder struct {
func (s *Storage) CreateFolder(title string) *Folder { func (s *Storage) CreateFolder(title string) *Folder {
expanded := true expanded := true
result, err := s.db.Exec(` row := s.db.QueryRow(`
insert into folders (title, is_expanded) values (?, ?) insert into folders (title, is_expanded) values (?, ?)
on conflict (title) do nothing`, on conflict (title) do update set title = ?
returning id`,
title, expanded, title, expanded,
// provide title again so that we can extract row id
title,
) )
if err != nil {
fmt.Println(err)
return nil
}
var id int64 var id int64
numrows, err := result.RowsAffected() err := row.Scan(&id)
if err != nil { if err != nil {
log.Print(err) log.Print(err)
return nil return nil
} }
if numrows == 1 {
id, err = result.LastInsertId()
if err != nil {
log.Print(err)
return nil
}
} else {
err = s.db.QueryRow(`select id, is_expanded from folders where title=?`, title).Scan(&id, &expanded)
if err != nil {
log.Print(err)
return nil
}
}
return &Folder{Id: id, Title: title, IsExpanded: expanded} return &Folder{Id: id, Title: title, IsExpanded: expanded}
} }