forked from
tangled.org/core
fork
Configure Feed
Select the types of activity you want to include in your feed.
Monorepo for Tangled
fork
Configure Feed
Select the types of activity you want to include in your feed.
1package db
2
3import (
4 "database/sql"
5 "fmt"
6 "strings"
7
8 "github.com/bluesky-social/indigo/atproto/syntax"
9 "tangled.org/core/appview/models"
10)
11
12func GetRepoLanguages(e Execer, filters ...filter) ([]models.RepoLanguage, error) {
13 var conditions []string
14 var args []any
15 for _, filter := range filters {
16 conditions = append(conditions, filter.Condition())
17 args = append(args, filter.Arg()...)
18 }
19
20 whereClause := ""
21 if conditions != nil {
22 whereClause = " where " + strings.Join(conditions, " and ")
23 }
24
25 query := fmt.Sprintf(
26 `select id, repo_at, ref, is_default_ref, language, bytes from repo_languages %s`,
27 whereClause,
28 )
29 rows, err := e.Query(query, args...)
30
31 if err != nil {
32 return nil, fmt.Errorf("failed to execute query: %w ", err)
33 }
34
35 var langs []models.RepoLanguage
36 for rows.Next() {
37 var rl models.RepoLanguage
38 var isDefaultRef int
39
40 err := rows.Scan(
41 &rl.Id,
42 &rl.RepoAt,
43 &rl.Ref,
44 &isDefaultRef,
45 &rl.Language,
46 &rl.Bytes,
47 )
48 if err != nil {
49 return nil, fmt.Errorf("failed to scan: %w ", err)
50 }
51
52 if isDefaultRef != 0 {
53 rl.IsDefaultRef = true
54 }
55
56 langs = append(langs, rl)
57 }
58 if err = rows.Err(); err != nil {
59 return nil, fmt.Errorf("failed to scan rows: %w ", err)
60 }
61
62 return langs, nil
63}
64
65func InsertRepoLanguages(e Execer, langs []models.RepoLanguage) error {
66 stmt, err := e.Prepare(
67 "insert or replace into repo_languages (repo_at, ref, is_default_ref, language, bytes) values (?, ?, ?, ?, ?)",
68 )
69 if err != nil {
70 return err
71 }
72
73 for _, l := range langs {
74 isDefaultRef := 0
75 if l.IsDefaultRef {
76 isDefaultRef = 1
77 }
78
79 _, err := stmt.Exec(l.RepoAt, l.Ref, isDefaultRef, l.Language, l.Bytes)
80 if err != nil {
81 return err
82 }
83 }
84
85 return nil
86}
87
88func DeleteRepoLanguages(e Execer, filters ...filter) error {
89 var conditions []string
90 var args []any
91 for _, filter := range filters {
92 conditions = append(conditions, filter.Condition())
93 args = append(args, filter.Arg()...)
94 }
95
96 whereClause := ""
97 if conditions != nil {
98 whereClause = " where " + strings.Join(conditions, " and ")
99 }
100
101 query := fmt.Sprintf(`delete from repo_languages %s`, whereClause)
102
103 _, err := e.Exec(query, args...)
104 return err
105}
106
107func UpdateRepoLanguages(tx *sql.Tx, repoAt syntax.ATURI, ref string, langs []models.RepoLanguage) error {
108 err := DeleteRepoLanguages(
109 tx,
110 FilterEq("repo_at", repoAt),
111 FilterEq("ref", ref),
112 )
113 if err != nil {
114 return fmt.Errorf("failed to delete existing languages: %w", err)
115 }
116
117 return InsertRepoLanguages(tx, langs)
118}