mirror of
https://github.com/nkanaev/yarr.git
synced 2026-04-30 14:27:45 +00:00
refactor: use sql named arg
This commit is contained in:
@@ -22,11 +22,14 @@ func (s *Storage) CreateFeed(title, description, link, feedLink string, folderId
|
|||||||
}
|
}
|
||||||
row := s.db.QueryRow(`
|
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 (:title, :description, :link, :feed_link, :folder_id)
|
||||||
on conflict (feed_link) do update set folder_id = ?
|
on conflict (feed_link) do update set folder_id = :folder_id
|
||||||
returning id`,
|
returning id`,
|
||||||
title, description, link, feedLink, folderId,
|
sql.Named("title", title),
|
||||||
folderId,
|
sql.Named("description", description),
|
||||||
|
sql.Named("link", link),
|
||||||
|
sql.Named("feed_link", feedLink),
|
||||||
|
sql.Named("folder_id", folderId),
|
||||||
)
|
)
|
||||||
|
|
||||||
var id int64
|
var id int64
|
||||||
@@ -46,7 +49,7 @@ func (s *Storage) CreateFeed(title, description, link, feedLink string, folderId
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (s *Storage) DeleteFeed(feedId int64) bool {
|
func (s *Storage) DeleteFeed(feedId int64) bool {
|
||||||
result, err := s.db.Exec(`delete from feeds where id = ?`, feedId)
|
result, err := s.db.Exec(`delete from feeds where id = :id`, sql.Named("id", feedId))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Print(err)
|
log.Print(err)
|
||||||
return false
|
return false
|
||||||
@@ -62,22 +65,34 @@ func (s *Storage) DeleteFeed(feedId int64) bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (s *Storage) RenameFeed(feedId int64, newTitle string) bool {
|
func (s *Storage) RenameFeed(feedId int64, newTitle string) bool {
|
||||||
_, err := s.db.Exec(`update feeds set title = ? where id = ?`, newTitle, feedId)
|
_, err := s.db.Exec(`update feeds set title = :title where id = :id`,
|
||||||
|
sql.Named("title", newTitle),
|
||||||
|
sql.Named("id", feedId),
|
||||||
|
)
|
||||||
return err == nil
|
return err == nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Storage) UpdateFeedFolder(feedId int64, newFolderId *int64) bool {
|
func (s *Storage) UpdateFeedFolder(feedId int64, newFolderId *int64) bool {
|
||||||
_, err := s.db.Exec(`update feeds set folder_id = ? where id = ?`, newFolderId, feedId)
|
_, err := s.db.Exec(`update feeds set folder_id = :folder_id where id = :id`,
|
||||||
|
sql.Named("folder_id", newFolderId),
|
||||||
|
sql.Named("id", feedId),
|
||||||
|
)
|
||||||
return err == nil
|
return err == nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Storage) UpdateFeedLink(feedId int64, newLink string) bool {
|
func (s *Storage) UpdateFeedLink(feedId int64, newLink string) bool {
|
||||||
_, err := s.db.Exec(`update feeds set feed_link = ? where id = ?`, newLink, feedId)
|
_, err := s.db.Exec(`update feeds set feed_link = :feed_link where id = :id`,
|
||||||
|
sql.Named("feed_link", newLink),
|
||||||
|
sql.Named("id", feedId),
|
||||||
|
)
|
||||||
return err == nil
|
return err == nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Storage) UpdateFeedIcon(feedId int64, icon *[]byte) bool {
|
func (s *Storage) UpdateFeedIcon(feedId int64, icon *[]byte) bool {
|
||||||
_, err := s.db.Exec(`update feeds set icon = ? where id = ?`, icon, feedId)
|
_, err := s.db.Exec(`update feeds set icon = :icon where id = :id`,
|
||||||
|
sql.Named("icon", icon),
|
||||||
|
sql.Named("id", feedId),
|
||||||
|
)
|
||||||
return err == nil
|
return err == nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -149,8 +164,8 @@ func (s *Storage) GetFeed(id int64) *Feed {
|
|||||||
select
|
select
|
||||||
id, folder_id, title, link, feed_link,
|
id, folder_id, title, link, feed_link,
|
||||||
icon, ifnull(icon, '') != '' as has_icon
|
icon, ifnull(icon, '') != '' as has_icon
|
||||||
from feeds where id = ?
|
from feeds where id = :id
|
||||||
`, id).Scan(
|
`, sql.Named("id", id)).Scan(
|
||||||
&f.Id, &f.FolderId, &f.Title, &f.Link, &f.FeedLink,
|
&f.Id, &f.FolderId, &f.Title, &f.Link, &f.FeedLink,
|
||||||
&f.Icon, &f.HasIcon,
|
&f.Icon, &f.HasIcon,
|
||||||
)
|
)
|
||||||
@@ -172,9 +187,10 @@ func (s *Storage) ResetFeedErrors() {
|
|||||||
func (s *Storage) SetFeedError(feedID int64, lastError error) {
|
func (s *Storage) SetFeedError(feedID int64, lastError error) {
|
||||||
_, err := s.db.Exec(`
|
_, err := s.db.Exec(`
|
||||||
insert into feed_errors (feed_id, error)
|
insert into feed_errors (feed_id, error)
|
||||||
values (?, ?)
|
values (:feed_id, :error)
|
||||||
on conflict (feed_id) do update set error = excluded.error`,
|
on conflict (feed_id) do update set error = excluded.error`,
|
||||||
feedID, lastError.Error(),
|
sql.Named("feed_id", feedID),
|
||||||
|
sql.Named("error", lastError.Error()),
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Print(err)
|
log.Print(err)
|
||||||
@@ -204,9 +220,10 @@ func (s *Storage) GetFeedErrors() map[int64]string {
|
|||||||
func (s *Storage) SetFeedSize(feedId int64, size int) {
|
func (s *Storage) SetFeedSize(feedId int64, size int) {
|
||||||
_, err := s.db.Exec(`
|
_, err := s.db.Exec(`
|
||||||
insert into feed_sizes (feed_id, size)
|
insert into feed_sizes (feed_id, size)
|
||||||
values (?, ?)
|
values (:feed_id, :size)
|
||||||
on conflict (feed_id) do update set size = excluded.size`,
|
on conflict (feed_id) do update set size = excluded.size`,
|
||||||
feedId, size,
|
sql.Named("feed_id", feedId),
|
||||||
|
sql.Named("size", size),
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Print(err)
|
log.Print(err)
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package storage
|
package storage
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"database/sql"
|
||||||
"log"
|
"log"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -13,12 +14,11 @@ type Folder struct {
|
|||||||
func (s *Storage) CreateFolder(title string) *Folder {
|
func (s *Storage) CreateFolder(title string) *Folder {
|
||||||
expanded := true
|
expanded := true
|
||||||
row := s.db.QueryRow(`
|
row := s.db.QueryRow(`
|
||||||
insert into folders (title, is_expanded) values (?, ?)
|
insert into folders (title, is_expanded) values (:title, :is_expanded)
|
||||||
on conflict (title) do update set title = ?
|
on conflict (title) do update set title = :title
|
||||||
returning id`,
|
returning id`,
|
||||||
title, expanded,
|
sql.Named("title", title),
|
||||||
// provide title again so that we can extract row id
|
sql.Named("is_expanded", expanded),
|
||||||
title,
|
|
||||||
)
|
)
|
||||||
var id int64
|
var id int64
|
||||||
err := row.Scan(&id)
|
err := row.Scan(&id)
|
||||||
@@ -31,7 +31,7 @@ func (s *Storage) CreateFolder(title string) *Folder {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (s *Storage) DeleteFolder(folderId int64) bool {
|
func (s *Storage) DeleteFolder(folderId int64) bool {
|
||||||
_, err := s.db.Exec(`delete from folders where id = ?`, folderId)
|
_, err := s.db.Exec(`delete from folders where id = :id`, sql.Named("id", folderId))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Print(err)
|
log.Print(err)
|
||||||
}
|
}
|
||||||
@@ -39,12 +39,18 @@ func (s *Storage) DeleteFolder(folderId int64) bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (s *Storage) RenameFolder(folderId int64, newTitle string) bool {
|
func (s *Storage) RenameFolder(folderId int64, newTitle string) bool {
|
||||||
_, err := s.db.Exec(`update folders set title = ? where id = ?`, newTitle, folderId)
|
_, err := s.db.Exec(`update folders set title = :title where id = :id`,
|
||||||
|
sql.Named("title", newTitle),
|
||||||
|
sql.Named("id", folderId),
|
||||||
|
)
|
||||||
return err == nil
|
return err == nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Storage) ToggleFolderExpanded(folderId int64, isExpanded bool) bool {
|
func (s *Storage) ToggleFolderExpanded(folderId int64, isExpanded bool) bool {
|
||||||
_, err := s.db.Exec(`update folders set is_expanded = ? where id = ?`, isExpanded, folderId)
|
_, err := s.db.Exec(`update folders set is_expanded = :is_expanded where id = :id`,
|
||||||
|
sql.Named("is_expanded", isExpanded),
|
||||||
|
sql.Named("id", folderId),
|
||||||
|
)
|
||||||
return err == nil
|
return err == nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package storage
|
package storage
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"database/sql"
|
||||||
"log"
|
"log"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
@@ -40,8 +41,8 @@ func (s *Storage) ListHTTPStates() map[int64]HTTPState {
|
|||||||
func (s *Storage) GetHTTPState(feedID int64) *HTTPState {
|
func (s *Storage) GetHTTPState(feedID int64) *HTTPState {
|
||||||
row := s.db.QueryRow(`
|
row := s.db.QueryRow(`
|
||||||
select feed_id, last_refreshed, last_modified, etag
|
select feed_id, last_refreshed, last_modified, etag
|
||||||
from http_states where feed_id = ?
|
from http_states where feed_id = :feed_id
|
||||||
`, feedID)
|
`, sql.Named("feed_id", feedID))
|
||||||
|
|
||||||
if row == nil {
|
if row == nil {
|
||||||
return nil
|
return nil
|
||||||
@@ -60,12 +61,11 @@ func (s *Storage) GetHTTPState(feedID int64) *HTTPState {
|
|||||||
func (s *Storage) SetHTTPState(feedID int64, lastModified, etag string) {
|
func (s *Storage) SetHTTPState(feedID int64, lastModified, etag string) {
|
||||||
_, err := s.db.Exec(`
|
_, err := s.db.Exec(`
|
||||||
insert into http_states (feed_id, last_modified, etag, last_refreshed)
|
insert into http_states (feed_id, last_modified, etag, last_refreshed)
|
||||||
values (?, ?, ?, datetime())
|
values (:feed_id, :last_modified, :etag, datetime())
|
||||||
on conflict (feed_id) do update set last_modified = ?, etag = ?, last_refreshed = datetime()`,
|
on conflict (feed_id) do update set last_modified = :last_modified, etag = :etag, last_refreshed = datetime()`,
|
||||||
// insert
|
sql.Named("feed_id", feedID),
|
||||||
feedID, lastModified, etag,
|
sql.Named("last_modified", lastModified),
|
||||||
// upsert
|
sql.Named("etag", etag),
|
||||||
lastModified, etag,
|
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Print(err)
|
log.Print(err)
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package storage
|
package storage
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"database/sql"
|
||||||
"database/sql/driver"
|
"database/sql/driver"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
@@ -137,14 +138,20 @@ func (s *Storage) CreateItems(items []Item) bool {
|
|||||||
date_arrived, status
|
date_arrived, status
|
||||||
)
|
)
|
||||||
values (
|
values (
|
||||||
?, ?, ?, ?, strftime('%Y-%m-%d %H:%M:%f', ?),
|
:guid, :feed_id, :title, :link, strftime('%Y-%m-%d %H:%M:%f', :date),
|
||||||
?, ?,
|
:content, :media_links,
|
||||||
?, ?
|
:date_arrived, :status
|
||||||
)
|
)
|
||||||
on conflict (feed_id, guid) do nothing`,
|
on conflict (feed_id, guid) do nothing`,
|
||||||
item.GUID, item.FeedId, item.Title, item.Link, item.Date,
|
sql.Named("guid", item.GUID),
|
||||||
item.Content, item.MediaLinks,
|
sql.Named("feed_id", item.FeedId),
|
||||||
now, UNREAD,
|
sql.Named("title", item.Title),
|
||||||
|
sql.Named("link", item.Link),
|
||||||
|
sql.Named("date", item.Date),
|
||||||
|
sql.Named("content", item.Content),
|
||||||
|
sql.Named("media_links", item.MediaLinks),
|
||||||
|
sql.Named("date_arrived", now),
|
||||||
|
sql.Named("status", UNREAD),
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Print(err)
|
log.Print(err)
|
||||||
@@ -166,16 +173,16 @@ func listQueryPredicate(filter ItemFilter, newestFirst bool) (string, []interfac
|
|||||||
cond := make([]string, 0)
|
cond := make([]string, 0)
|
||||||
args := make([]interface{}, 0)
|
args := make([]interface{}, 0)
|
||||||
if filter.FolderID != nil {
|
if filter.FolderID != nil {
|
||||||
cond = append(cond, "i.feed_id in (select id from feeds where folder_id = ?)")
|
cond = append(cond, "i.feed_id in (select id from feeds where folder_id = :folder_id)")
|
||||||
args = append(args, *filter.FolderID)
|
args = append(args, sql.Named("folder_id", *filter.FolderID))
|
||||||
}
|
}
|
||||||
if filter.FeedID != nil {
|
if filter.FeedID != nil {
|
||||||
cond = append(cond, "i.feed_id = ?")
|
cond = append(cond, "i.feed_id = :feed_id")
|
||||||
args = append(args, *filter.FeedID)
|
args = append(args, sql.Named("feed_id", *filter.FeedID))
|
||||||
}
|
}
|
||||||
if filter.Status != nil {
|
if filter.Status != nil {
|
||||||
cond = append(cond, "i.status = ?")
|
cond = append(cond, "i.status = :status")
|
||||||
args = append(args, *filter.Status)
|
args = append(args, sql.Named("status", *filter.Status))
|
||||||
}
|
}
|
||||||
if filter.Search != nil {
|
if filter.Search != nil {
|
||||||
words := strings.Fields(*filter.Search)
|
words := strings.Fields(*filter.Search)
|
||||||
@@ -184,38 +191,37 @@ func listQueryPredicate(filter ItemFilter, newestFirst bool) (string, []interfac
|
|||||||
terms[idx] = word + "*"
|
terms[idx] = word + "*"
|
||||||
}
|
}
|
||||||
|
|
||||||
cond = append(cond, "i.search_rowid in (select rowid from search where search match ?)")
|
cond = append(cond, "i.search_rowid in (select rowid from search where search match :search)")
|
||||||
args = append(args, strings.Join(terms, " "))
|
args = append(args, sql.Named("search", strings.Join(terms, " ")))
|
||||||
}
|
}
|
||||||
if filter.After != nil {
|
if filter.After != nil {
|
||||||
compare := ">"
|
compare := ">"
|
||||||
if newestFirst {
|
if newestFirst {
|
||||||
compare = "<"
|
compare = "<"
|
||||||
}
|
}
|
||||||
cond = append(cond, fmt.Sprintf("(i.date, i.id) %s (select date, id from items where id = ?)", compare))
|
cond = append(cond, fmt.Sprintf("(i.date, i.id) %s (select date, id from items where id = :after_id)", compare))
|
||||||
args = append(args, *filter.After)
|
args = append(args, sql.Named("after_id", *filter.After))
|
||||||
}
|
}
|
||||||
if filter.IDs != nil && len(*filter.IDs) > 0 {
|
if filter.IDs != nil && len(*filter.IDs) > 0 {
|
||||||
qmarks := make([]string, len(*filter.IDs))
|
qmarks := make([]string, len(*filter.IDs))
|
||||||
idargs := make([]interface{}, len(*filter.IDs))
|
|
||||||
for i, id := range *filter.IDs {
|
for i, id := range *filter.IDs {
|
||||||
qmarks[i] = "?"
|
name := fmt.Sprintf("id%d", i)
|
||||||
idargs[i] = id
|
qmarks[i] = ":" + name
|
||||||
|
args = append(args, sql.Named(name, id))
|
||||||
}
|
}
|
||||||
cond = append(cond, "i.id in ("+strings.Join(qmarks, ",")+")")
|
cond = append(cond, "i.id in ("+strings.Join(qmarks, ",")+")")
|
||||||
args = append(args, idargs...)
|
|
||||||
}
|
}
|
||||||
if filter.SinceID != nil {
|
if filter.SinceID != nil {
|
||||||
cond = append(cond, "i.id > ?")
|
cond = append(cond, "i.id > :since_id")
|
||||||
args = append(args, filter.SinceID)
|
args = append(args, sql.Named("since_id", filter.SinceID))
|
||||||
}
|
}
|
||||||
if filter.MaxID != nil {
|
if filter.MaxID != nil {
|
||||||
cond = append(cond, "i.id < ?")
|
cond = append(cond, "i.id < :max_id")
|
||||||
args = append(args, filter.MaxID)
|
args = append(args, sql.Named("max_id", filter.MaxID))
|
||||||
}
|
}
|
||||||
if filter.Before != nil {
|
if filter.Before != nil {
|
||||||
cond = append(cond, "i.date < ?")
|
cond = append(cond, "i.date < :before")
|
||||||
args = append(args, filter.Before)
|
args = append(args, sql.Named("before", filter.Before))
|
||||||
}
|
}
|
||||||
|
|
||||||
predicate := "1"
|
predicate := "1"
|
||||||
@@ -299,8 +305,8 @@ func (s *Storage) GetItem(id int64) *Item {
|
|||||||
i.id, i.guid, i.feed_id, i.title, i.link, i.content,
|
i.id, i.guid, i.feed_id, i.title, i.link, i.content,
|
||||||
i.date, i.status, i.media_links
|
i.date, i.status, i.media_links
|
||||||
from items i
|
from items i
|
||||||
where i.id = ?
|
where i.id = :id
|
||||||
`, id).Scan(
|
`, sql.Named("id", id)).Scan(
|
||||||
&i.Id, &i.GUID, &i.FeedId, &i.Title, &i.Link, &i.Content,
|
&i.Id, &i.GUID, &i.FeedId, &i.Title, &i.Link, &i.Content,
|
||||||
&i.Date, &i.Status, &i.MediaLinks,
|
&i.Date, &i.Status, &i.MediaLinks,
|
||||||
)
|
)
|
||||||
@@ -312,7 +318,10 @@ func (s *Storage) GetItem(id int64) *Item {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (s *Storage) UpdateItemStatus(item_id int64, status ItemStatus) bool {
|
func (s *Storage) UpdateItemStatus(item_id int64, status ItemStatus) bool {
|
||||||
_, err := s.db.Exec(`update items set status = ? where id = ?`, status, item_id)
|
_, err := s.db.Exec(`update items set status = :status where id = :id`,
|
||||||
|
sql.Named("status", status),
|
||||||
|
sql.Named("id", item_id),
|
||||||
|
)
|
||||||
return err == nil
|
return err == nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -381,8 +390,9 @@ func (s *Storage) SyncSearch() {
|
|||||||
|
|
||||||
for _, item := range items {
|
for _, item := range items {
|
||||||
result, err := s.db.Exec(`
|
result, err := s.db.Exec(`
|
||||||
insert into search (title, description, content) values (?, "", ?)`,
|
insert into search (title, description, content) values (:title, "", :content)`,
|
||||||
item.Title, htmlutil.ExtractText(item.Content),
|
sql.Named("title", item.Title),
|
||||||
|
sql.Named("content", htmlutil.ExtractText(item.Content)),
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Print(err)
|
log.Print(err)
|
||||||
@@ -391,8 +401,9 @@ func (s *Storage) SyncSearch() {
|
|||||||
if numrows, err := result.RowsAffected(); err == nil && numrows == 1 {
|
if numrows, err := result.RowsAffected(); err == nil && numrows == 1 {
|
||||||
if rowId, err := result.LastInsertId(); err == nil {
|
if rowId, err := result.LastInsertId(); err == nil {
|
||||||
s.db.Exec(
|
s.db.Exec(
|
||||||
`update items set search_rowid = ? where id = ?`,
|
`update items set search_rowid = :search_rowid where id = :id`,
|
||||||
rowId, item.Id,
|
sql.Named("search_rowid", rowId),
|
||||||
|
sql.Named("id", item.Id),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -416,13 +427,16 @@ func (s *Storage) DeleteOldItems() {
|
|||||||
rows, err := s.db.Query(`
|
rows, err := s.db.Query(`
|
||||||
select
|
select
|
||||||
i.feed_id,
|
i.feed_id,
|
||||||
max(coalesce(s.size, 0), ?) as max_items,
|
max(coalesce(s.size, 0), :keep_size) as max_items,
|
||||||
count(*) as num_items
|
count(*) as num_items
|
||||||
from items i
|
from items i
|
||||||
left outer join feed_sizes s on s.feed_id = i.feed_id
|
left outer join feed_sizes s on s.feed_id = i.feed_id
|
||||||
where status != ?
|
where status != :starred_status
|
||||||
group by i.feed_id
|
group by i.feed_id
|
||||||
`, itemsKeepSize, STARRED)
|
`,
|
||||||
|
sql.Named("keep_size", itemsKeepSize),
|
||||||
|
sql.Named("starred_status", STARRED),
|
||||||
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Print(err)
|
log.Print(err)
|
||||||
return
|
return
|
||||||
@@ -441,15 +455,15 @@ func (s *Storage) DeleteOldItems() {
|
|||||||
where id in (
|
where id in (
|
||||||
select i.id
|
select i.id
|
||||||
from items i
|
from items i
|
||||||
where i.feed_id = ? and status != ?
|
where i.feed_id = :feed_id and status != :starred_status
|
||||||
order by date desc
|
order by date desc
|
||||||
limit -1 offset ?
|
limit -1 offset :limit
|
||||||
) and date_arrived < ?
|
) and date_arrived < :date_limit
|
||||||
`,
|
`,
|
||||||
feedId,
|
sql.Named("feed_id", feedId),
|
||||||
STARRED,
|
sql.Named("starred_status", STARRED),
|
||||||
limit,
|
sql.Named("limit", limit),
|
||||||
time.Now().UTC().Add(-time.Hour*time.Duration(24*itemsKeepDays)),
|
sql.Named("date_limit", time.Now().UTC().Add(-time.Hour*time.Duration(24*itemsKeepDays))),
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Print(err)
|
log.Print(err)
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package storage
|
package storage
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"database/sql"
|
||||||
"log"
|
"log"
|
||||||
"reflect"
|
"reflect"
|
||||||
"strconv"
|
"strconv"
|
||||||
@@ -59,8 +60,8 @@ func testItemsSetup(db *Storage) testItemScope {
|
|||||||
{GUID: "item012", FeedId: feed01.Id, Title: "title012", Date: now.Add(time.Hour * 24 * 9)}, // read
|
{GUID: "item012", FeedId: feed01.Id, Title: "title012", Date: now.Add(time.Hour * 24 * 9)}, // read
|
||||||
{GUID: "item013", FeedId: feed01.Id, Title: "title013", Date: now.Add(time.Hour * 24 * 10)}, // starred
|
{GUID: "item013", FeedId: feed01.Id, Title: "title013", Date: now.Add(time.Hour * 24 * 10)}, // starred
|
||||||
})
|
})
|
||||||
db.db.Exec(`update items set status = ? where guid in ("item112", "item122", "item211", "item012")`, READ)
|
db.db.Exec(`update items set status = :status where guid in ("item112", "item122", "item211", "item012")`, sql.Named("status", READ))
|
||||||
db.db.Exec(`update items set status = ? where guid in ("item113", "item212", "item013")`, STARRED)
|
db.db.Exec(`update items set status = :status where guid in ("item113", "item212", "item013")`, sql.Named("status", STARRED))
|
||||||
|
|
||||||
return testItemScope{
|
return testItemScope{
|
||||||
feed11: feed11,
|
feed11: feed11,
|
||||||
@@ -79,8 +80,8 @@ func getItem(db *Storage, guid string) *Item {
|
|||||||
i.id, i.guid, i.feed_id, i.title, i.link, i.content,
|
i.id, i.guid, i.feed_id, i.title, i.link, i.content,
|
||||||
i.date, i.status, i.media_links
|
i.date, i.status, i.media_links
|
||||||
from items i
|
from items i
|
||||||
where i.guid = ?
|
where i.guid = :guid
|
||||||
`, guid).Scan(
|
`, sql.Named("guid", guid)).Scan(
|
||||||
&i.Id, &i.GUID, &i.FeedId, &i.Title, &i.Link, &i.Content,
|
&i.Id, &i.GUID, &i.FeedId, &i.Title, &i.Link, &i.Content,
|
||||||
&i.Date, &i.Status, &i.MediaLinks,
|
&i.Date, &i.Status, &i.MediaLinks,
|
||||||
)
|
)
|
||||||
@@ -295,7 +296,7 @@ func TestDeleteOldItems(t *testing.T) {
|
|||||||
db.SetFeedSize(feed.Id, itemsKeepSize)
|
db.SetFeedSize(feed.Id, itemsKeepSize)
|
||||||
var feedSize int
|
var feedSize int
|
||||||
err := db.db.QueryRow(
|
err := db.db.QueryRow(
|
||||||
`select size from feed_sizes where feed_id = ?`, feed.Id,
|
`select size from feed_sizes where feed_id = :feed_id`, sql.Named("feed_id", feed.Id),
|
||||||
).Scan(&feedSize)
|
).Scan(&feedSize)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
@@ -310,9 +311,9 @@ func TestDeleteOldItems(t *testing.T) {
|
|||||||
|
|
||||||
// expire only the first 3 articles
|
// expire only the first 3 articles
|
||||||
_, err = db.db.Exec(
|
_, err = db.db.Exec(
|
||||||
`update items set date_arrived = ?
|
`update items set date_arrived = :date_arrived
|
||||||
where id in (select id from items limit 3)`,
|
where id in (select id from items limit 3)`,
|
||||||
now.Add(-time.Hour*time.Duration(itemsKeepDays*24)),
|
sql.Named("date_arrived", now.Add(-time.Hour*time.Duration(itemsKeepDays*24))),
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
|
|||||||
@@ -290,7 +290,10 @@ func m08_normalize_datetime(tx *sql.Tx) error {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
_, err = tx.Exec(`update items set date_arrived = ? where id = ?;`, dateArrived.UTC(), id)
|
_, err = tx.Exec(`update items set date_arrived = :date_arrived where id = :id;`,
|
||||||
|
sql.Named("date_arrived", dateArrived.UTC()),
|
||||||
|
sql.Named("id", id),
|
||||||
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package storage
|
package storage
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"database/sql"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"log"
|
"log"
|
||||||
)
|
)
|
||||||
@@ -20,7 +21,7 @@ func settingsDefaults() map[string]interface{} {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (s *Storage) GetSettingsValue(key string) interface{} {
|
func (s *Storage) GetSettingsValue(key string) interface{} {
|
||||||
row := s.db.QueryRow(`select val from settings where key=?`, key)
|
row := s.db.QueryRow(`select val from settings where key=:key`, sql.Named("key", key))
|
||||||
if row == nil {
|
if row == nil {
|
||||||
return settingsDefaults()[key]
|
return settingsDefaults()[key]
|
||||||
}
|
}
|
||||||
@@ -81,9 +82,10 @@ func (s *Storage) UpdateSettings(kv map[string]interface{}) bool {
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
_, err = s.db.Exec(`
|
_, err = s.db.Exec(`
|
||||||
insert into settings (key, val) values (?, ?)
|
insert into settings (key, val) values (:key, :val)
|
||||||
on conflict (key) do update set val=?`,
|
on conflict (key) do update set val=:val`,
|
||||||
key, valEncoded, valEncoded,
|
sql.Named("key", key),
|
||||||
|
sql.Named("val", valEncoded),
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Print(err)
|
log.Print(err)
|
||||||
|
|||||||
Reference in New Issue
Block a user