Monorepo for Tangled
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 "tangled.org/core/orm"
11)
12
13func GetRepoLanguages(e Execer, filters ...orm.Filter) ([]models.RepoLanguage, error) {
14 var conditions []string
15 var args []any
16 for _, filter := range filters {
17 conditions = append(conditions, filter.Condition())
18 args = append(args, filter.Arg()...)
19 }
20
21 whereClause := ""
22 if conditions != nil {
23 whereClause = " where " + strings.Join(conditions, " and ")
24 }
25
26 query := fmt.Sprintf(
27 `select id, repo_at, ref, is_default_ref, language, bytes, repo_did from repo_languages %s`,
28 whereClause,
29 )
30 rows, err := e.Query(query, args...)
31 if err != nil {
32 return nil, fmt.Errorf("failed to execute query: %w ", err)
33 }
34 defer rows.Close()
35
36 var langs []models.RepoLanguage
37 for rows.Next() {
38 var rl models.RepoLanguage
39 var isDefaultRef int
40 var langRepoDid sql.NullString
41
42 err := rows.Scan(
43 &rl.Id,
44 &rl.RepoAt,
45 &rl.Ref,
46 &isDefaultRef,
47 &rl.Language,
48 &rl.Bytes,
49 &langRepoDid,
50 )
51 if err != nil {
52 return nil, fmt.Errorf("failed to scan: %w ", err)
53 }
54
55 if isDefaultRef != 0 {
56 rl.IsDefaultRef = true
57 }
58 if langRepoDid.Valid {
59 rl.RepoDid = langRepoDid.String
60 }
61
62 langs = append(langs, rl)
63 }
64 if err = rows.Err(); err != nil {
65 return nil, fmt.Errorf("failed to scan rows: %w ", err)
66 }
67
68 return langs, nil
69}
70
71func InsertRepoLanguages(e Execer, langs []models.RepoLanguage) error {
72 stmt, err := e.Prepare(
73 "insert or replace into repo_languages (repo_at, ref, is_default_ref, language, bytes, repo_did) values (?, ?, ?, ?, ?, ?)",
74 )
75 if err != nil {
76 return err
77 }
78
79 for _, l := range langs {
80 isDefaultRef := 0
81 if l.IsDefaultRef {
82 isDefaultRef = 1
83 }
84
85 var repoDid *string
86 if l.RepoDid != "" {
87 repoDid = &l.RepoDid
88 }
89
90 _, err := stmt.Exec(l.RepoAt, l.Ref, isDefaultRef, l.Language, l.Bytes, repoDid)
91 if err != nil {
92 return err
93 }
94 }
95
96 return nil
97}
98
99func DeleteRepoLanguages(e Execer, filters ...orm.Filter) error {
100 var conditions []string
101 var args []any
102 for _, filter := range filters {
103 conditions = append(conditions, filter.Condition())
104 args = append(args, filter.Arg()...)
105 }
106
107 whereClause := ""
108 if conditions != nil {
109 whereClause = " where " + strings.Join(conditions, " and ")
110 }
111
112 query := fmt.Sprintf(`delete from repo_languages %s`, whereClause)
113
114 _, err := e.Exec(query, args...)
115 return err
116}
117
118func UpdateRepoLanguages(tx *sql.Tx, repoAt syntax.ATURI, ref string, langs []models.RepoLanguage) error {
119 err := DeleteRepoLanguages(
120 tx,
121 orm.FilterEq("repo_at", repoAt),
122 orm.FilterEq("ref", ref),
123 )
124 if err != nil {
125 return fmt.Errorf("failed to delete existing languages: %w", err)
126 }
127
128 return InsertRepoLanguages(tx, langs)
129}