smutok/internal/store/sqlite_articles.go(view raw)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
package store
import (
"context"
"fmt"
"strings"
)
func (s *Sqlite) UpsertArticle(
ctx context.Context,
timestampUsec, feedID, title, content, author, href string,
publishedAt int,
) error {
tx, err := s.db.BeginTx(ctx, nil)
if err != nil {
return err
}
defer tx.Rollback()
if _, err = tx.ExecContext(ctx,
`insert or ignore into articles (id, feed_id, title, content, author, href, published_at) values (?, ?, ?, ?, ?, ?, ?)`,
timestampUsec, feedID, title, content, author, href, publishedAt); err != nil {
return err
}
if _, err = tx.ExecContext(ctx, `insert or ignore into article_statuses (article_id) values (?)`, timestampUsec); err != nil {
return err
}
return tx.Commit()
}
func (s *Sqlite) SyncReadStatus(ctx context.Context, ids []string) error {
placeholders, args := buildPlaceholdersAndArgs(ids)
query := fmt.Sprintf(`--sql
update article_statuses
set is_read = case when article_id in (%s)
then false
else true
end`, placeholders)
_, err := s.db.ExecContext(ctx, query, args...)
return err
}
func (s *Sqlite) SyncStarredStatus(ctx context.Context, ids []string) error {
placeholders, args := buildPlaceholdersAndArgs(ids)
query := fmt.Sprintf(`--sql
update article_statuses
set is_starred = case when article_id in (%s)
then true
else false
end`, placeholders)
_, err := s.db.ExecContext(ctx, query, args...)
return err
}
func buildPlaceholdersAndArgs(in []string, prefixArgs ...any) (placeholders string, args []any) {
placeholders = strings.Repeat("?,", len(in))
placeholders = placeholders[:len(placeholders)-1] // trim trailing comma
args = make([]any, len(prefixArgs)+len(in))
copy(args, prefixArgs)
for i, v := range in {
args[len(prefixArgs)+i] = v
}
return placeholders, args
}
|