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 Language string
15 Bytes int64
16}
17
18func GetRepoLanguages(e Execer, filters ...filter) ([]RepoLanguage, error) {
19 var conditions []string
20 var args []any
21 for _, filter := range filters {
22 conditions = append(conditions, filter.Condition())
23 args = append(args, filter.Arg()...)
24 }
25
26 whereClause := ""
27 if conditions != nil {
28 whereClause = " where " + strings.Join(conditions, " and ")
29 }
30
31 query := fmt.Sprintf(
32 `select id, repo_at, ref, language, bytes from repo_languages %s`,
33 whereClause,
34 )
35 rows, err := e.Query(query, args...)
36
37 if err != nil {
38 return nil, fmt.Errorf("failed to execute query: %w ", err)
39 }
40
41 var langs []RepoLanguage
42 for rows.Next() {
43 var rl RepoLanguage
44
45 err := rows.Scan(
46 &rl.Id,
47 &rl.RepoAt,
48 &rl.Ref,
49 &rl.Language,
50 &rl.Bytes,
51 )
52 if err != nil {
53 return nil, fmt.Errorf("failed to scan: %w ", err)
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 []RepoLanguage) error {
66 stmt, err := e.Prepare(
67 "insert or replace into repo_languages (repo_at, ref, language, bytes) values (?, ?, ?, ?)",
68 )
69 if err != nil {
70 return err
71 }
72
73 for _, l := range langs {
74 _, err := stmt.Exec(l.RepoAt, l.Ref, l.Language, l.Bytes)
75 if err != nil {
76 return err
77 }
78 }
79
80 return nil
81}