use nullable for field updates

This commit is contained in:
nkanaev
2026-05-11 10:27:50 +01:00
parent 450f64605e
commit 31274d17a5
6 changed files with 28 additions and 22 deletions

View File

@@ -65,30 +65,28 @@ func (s *Storage) DeleteFeed(feedId int64) bool {
}
type UpdateFeedParams struct {
Title *string
FeedLink *string
FolderID *int64
UpdateFolderID bool
Icon *[]byte
UpdateIcon bool
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),
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
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.UpdateFolderID),
sql.Named("folder_id", params.FolderID),
sql.Named("update_icon", params.UpdateIcon),
sql.Named("icon", params.Icon),
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)

View File

@@ -56,11 +56,9 @@ func TestUpdateFeed(t *testing.T) {
title := "newtitle"
db.UpdateFeed(feed1.Id, UpdateFeedParams{
Title: &title,
FolderID: &folder.Id,
UpdateFolderID: true,
Icon: &icon,
UpdateIcon: true,
Title: &title,
FolderID: SetNullable(&folder.Id),
Icon: SetNullable(&icon),
})
feed2 := db.GetFeed(feed1.Id)

View File

@@ -12,6 +12,15 @@ type Storage struct {
db *sql.DB
}
type Nullable[T any] struct {
Set bool
Value *T
}
func SetNullable[T any](v *T) Nullable[T] {
return Nullable[T]{Set: true, Value: v}
}
func New(path string) (*Storage, error) {
if pos := strings.IndexRune(path, '?'); pos == -1 {
params := "_journal=WAL&_sync=NORMAL&_busy_timeout=5000&cache=shared"