bulk-insert items

This commit is contained in:
Nazar Kanaev 2020-06-22 23:14:06 +01:00 committed by nkanaev
parent 61ed9aabf9
commit 7abe2a8c05
3 changed files with 82 additions and 3 deletions

46
main.go
View File

@ -6,10 +6,11 @@ import (
) )
func main() { func main() {
storage, err := storage.New() store, err := storage.New()
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
} }
log.Print(store)
/* /*
folder := storage.CreateFolder("foo") folder := storage.CreateFolder("foo")
storage.RenameFolder(folder.Id, "bar") storage.RenameFolder(folder.Id, "bar")
@ -20,4 +21,47 @@ func main() {
"title", "description", "link", "feedlink", "icon", 1) "title", "description", "link", "feedlink", "icon", 1)
storage.RenameFeed(feed.Id, "newtitle") storage.RenameFeed(feed.Id, "newtitle")
*/ */
/*
items := make([]storage.Item, 3, 3)
items = append(items, storage.Item{
Id: "id",
FeedId: 0,
Title: "title",
Link: "link",
Description: "description",
Content: "content",
Author: "author",
Date: 1,
DateUpdated: 1,
Status: storage.UNREAD,
Image: "image",
})
items = append(items, storage.Item{
Id: "id2",
FeedId: 0,
Title: "title",
Link: "link",
Description: "description",
Content: "content",
Author: "author",
Date: 1,
DateUpdated: 50,
Status: storage.UNREAD,
Image: "image",
})
items = append(items, storage.Item{
Id: "id",
FeedId: 0,
Title: "title",
Link: "link",
Description: "description",
Content: "content",
Author: "author",
Date: 1,
DateUpdated: 100,
Status: storage.UNREAD,
Image: "image",
})
log.Print(store.CreateItems(items))
*/
} }

View File

@ -9,7 +9,7 @@ const (
) )
type Item struct { type Item struct {
Id int64 Id string
FeedId int64 FeedId int64
Title string Title string
Link string Link string
@ -23,5 +23,36 @@ type Item struct {
} }
func (s *Storage) CreateItems(items []Item) bool { func (s *Storage) CreateItems(items []Item) bool {
tx, err := s.db.Begin()
if err != nil {
s.log.Print(err)
return false
}
for _, item := range items {
_, err = tx.Exec(`
insert into items (
id, feed_id, title, link, description,
content, author, date, date_updated, status, image
)
values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
on conflict (id) do update set date_updated=?`,
item.Id, item.FeedId, item.Title, item.Link, item.Description,
item.Content, item.Author, item.Date, item.DateUpdated, UNREAD, item.Image,
// upsert values
item.DateUpdated,
)
if err != nil {
s.log.Print(err)
if err = tx.Rollback(); err != nil {
s.log.Print(err)
return false
}
return false
}
}
if err = tx.Commit(); err != nil {
s.log.Print(err)
return false
}
return true return true
} }

View File

@ -1,6 +1,8 @@
package storage package storage
import ( import (
"os"
"log"
"database/sql" "database/sql"
_ "github.com/mattn/go-sqlite3" _ "github.com/mattn/go-sqlite3"
) )
@ -44,6 +46,7 @@ create index if not exists idx_item_status on items(status);
type Storage struct { type Storage struct {
db *sql.DB db *sql.DB
log *log.Logger
} }
func New() (*Storage, error) { func New() (*Storage, error) {
@ -56,7 +59,8 @@ func New() (*Storage, error) {
if err != nil { if err != nil {
return nil, err return nil, err
} }
return &Storage{db: db}, nil logger := log.New(os.Stdout, "storage: ", log.Ldate | log.Ltime | log.Lshortfile)
return &Storage{db: db, log: logger}, nil
} }
func intOrNil(id int64) interface{} { func intOrNil(id int64) interface{} {