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}