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