create sqlite package

This commit is contained in:
nkanaev
2026-06-07 23:14:16 +01:00
parent 14835660fb
commit f29ad0c20a
14 changed files with 2 additions and 1 deletions

157
src/storage/sqlite/feed.go Normal file
View File

@@ -0,0 +1,157 @@
package storage
import (
"database/sql"
"log"
)
type Feed struct {
Id int64 `json:"id"`
FolderId *int64 `json:"folder_id"`
Title string `json:"title"`
Description string `json:"description"`
Link string `json:"link"`
FeedLink string `json:"feed_link"`
Icon *[]byte `json:"icon,omitempty"`
HasIcon bool `json:"has_icon"`
}
type CreateFeedParams struct {
Title string
Description string
Link string
FeedLink string
FolderID *int64
}
func (s *Storage) CreateFeed(params CreateFeedParams) *Feed {
title := params.Title
if title == "" {
title = params.FeedLink
}
row := s.db.QueryRow(`
insert into feeds (title, description, link, feed_link, folder_id)
values (:title, :description, :link, :feed_link, :folder_id)
on conflict (feed_link) do update set folder_id = :folder_id
returning id`,
sql.Named("title", title),
sql.Named("description", params.Description),
sql.Named("link", params.Link),
sql.Named("feed_link", params.FeedLink),
sql.Named("folder_id", params.FolderID),
)
var id int64
err := row.Scan(&id)
if err != nil {
log.Print(err)
return nil
}
return &Feed{
Id: id,
Title: title,
Description: params.Description,
Link: params.Link,
FeedLink: params.FeedLink,
FolderId: params.FolderID,
}
}
func (s *Storage) DeleteFeed(feedId int64) bool {
result, err := s.db.Exec(`delete from feeds where id = :id`, sql.Named("id", feedId))
if err != nil {
log.Print(err)
return false
}
nrows, err := result.RowsAffected()
if err != nil {
if err != sql.ErrNoRows {
log.Print(err)
}
return false
}
return nrows == 1
}
type UpdateFeedParams struct {
Title *string
FeedLink *string
FolderID Nullable[int64]
Icon Nullable[[]byte]
}
func (s *Storage) UpdateFeed(feedId int64, params UpdateFeedParams) (bool, error) {
_, err := s.db.Exec(`
update feeds set
title = coalesce(:title, title),
feed_link = coalesce(:feed_link, feed_link),
folder_id = case when :update_folder_id then :folder_id else folder_id end,
icon = case when :update_icon then :icon else icon end
where id = :id
`,
sql.Named("id", feedId),
sql.Named("title", params.Title),
sql.Named("feed_link", params.FeedLink),
sql.Named("update_folder_id", params.FolderID.Set),
sql.Named("folder_id", params.FolderID.Value),
sql.Named("update_icon", params.Icon.Set),
sql.Named("icon", params.Icon.Value),
)
if err != nil {
log.Print(err)
return false, err
}
return true, nil
}
func (s *Storage) ListFeeds() []Feed {
result := make([]Feed, 0)
rows, err := s.db.Query(`
select id, folder_id, title, description, link, feed_link,
ifnull(length(icon), 0) > 0 as has_icon
from feeds
order by title collate nocase
`)
if err != nil {
log.Print(err)
return result
}
for rows.Next() {
var f Feed
err = rows.Scan(
&f.Id,
&f.FolderId,
&f.Title,
&f.Description,
&f.Link,
&f.FeedLink,
&f.HasIcon,
)
if err != nil {
log.Print(err)
return result
}
result = append(result, f)
}
return result
}
func (s *Storage) GetFeed(id int64) *Feed {
var f Feed
err := s.db.QueryRow(`
select
id, folder_id, title, link, feed_link,
icon, ifnull(icon, '') != '' as has_icon
from feeds where id = :id
`, sql.Named("id", id)).Scan(
&f.Id, &f.FolderId, &f.Title, &f.Link, &f.FeedLink,
&f.Icon, &f.HasIcon,
)
if err != nil {
if err != sql.ErrNoRows {
log.Print(err)
}
return nil
}
return &f
}