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