1package db
2
3import (
4 "fmt"
5 "strings"
6
7 "tangled.org/core/appview/models"
8)
9
10func GetRepoLanguages(e Execer, filters ...filter) ([]models.RepoLanguage, error) {
11 var conditions []string
12 var args []any
13 for _, filter := range filters {
14 conditions = append(conditions, filter.Condition())
15 args = append(args, filter.Arg()...)
16 }
17
18 whereClause := ""
19 if conditions != nil {
20 whereClause = " where " + strings.Join(conditions, " and ")
21 }
22
23 query := fmt.Sprintf(
24 `select id, repo_at, ref, is_default_ref, language, bytes from repo_languages %s`,
25 whereClause,
26 )
27 rows, err := e.Query(query, args...)
28
29 if err != nil {
30 return nil, fmt.Errorf("failed to execute query: %w ", err)
31 }
32
33 var langs []models.RepoLanguage
34 for rows.Next() {
35 var rl models.RepoLanguage
36 var isDefaultRef int
37
38 err := rows.Scan(
39 &rl.Id,
40 &rl.RepoAt,
41 &rl.Ref,
42 &isDefaultRef,
43 &rl.Language,
44 &rl.Bytes,
45 )
46 if err != nil {
47 return nil, fmt.Errorf("failed to scan: %w ", err)
48 }
49
50 if isDefaultRef != 0 {
51 rl.IsDefaultRef = true
52 }
53
54 langs = append(langs, rl)
55 }
56 if err = rows.Err(); err != nil {
57 return nil, fmt.Errorf("failed to scan rows: %w ", err)
58 }
59
60 return langs, nil
61}
62
63func InsertRepoLanguages(e Execer, langs []models.RepoLanguage) error {
64 stmt, err := e.Prepare(
65 "insert or replace into repo_languages (repo_at, ref, is_default_ref, language, bytes) values (?, ?, ?, ?, ?)",
66 )
67 if err != nil {
68 return err
69 }
70
71 for _, l := range langs {
72 isDefaultRef := 0
73 if l.IsDefaultRef {
74 isDefaultRef = 1
75 }
76
77 _, err := stmt.Exec(l.RepoAt, l.Ref, isDefaultRef, l.Language, l.Bytes)
78 if err != nil {
79 return err
80 }
81 }
82
83 return nil
84}