forked from
tangled.org/core
Monorepo for Tangled
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 InsertRepoLanguages(e Execer, langs []models.RepoLanguage) error {
14 stmt, err := e.Prepare(
15 "insert or replace into repo_languages (repo_did, ref, is_default_ref, language, bytes) values (?, ?, ?, ?, ?)",
16 )
17 if err != nil {
18 return err
19 }
20
21 for _, l := range langs {
22 isDefaultRef := 0
23 if l.IsDefaultRef {
24 isDefaultRef = 1
25 }
26
27 _, err := stmt.Exec(l.RepoDid, l.Ref, isDefaultRef, l.Language, l.Bytes)
28 if err != nil {
29 return err
30 }
31 }
32
33 return nil
34}
35
36func DeleteRepoLanguages(e Execer, filters ...orm.Filter) error {
37 var conditions []string
38 var args []any
39 for _, filter := range filters {
40 conditions = append(conditions, filter.Condition())
41 args = append(args, filter.Arg()...)
42 }
43
44 whereClause := ""
45 if conditions != nil {
46 whereClause = " where " + strings.Join(conditions, " and ")
47 }
48
49 query := fmt.Sprintf(`delete from repo_languages %s`, whereClause)
50
51 _, err := e.Exec(query, args...)
52 return err
53}
54
55func GetRepoLanguages(e Execer, repoDid syntax.DID, ref string) (map[string]int64, error) {
56 rows, err := e.Query(
57 `select language, bytes from repo_languages where repo_did = ? and ref = ?`,
58 repoDid, ref,
59 )
60 if err != nil {
61 return nil, err
62 }
63 defer rows.Close()
64
65 out := make(map[string]int64)
66 for rows.Next() {
67 var language string
68 var bytes int64
69 if err := rows.Scan(&language, &bytes); err != nil {
70 return nil, err
71 }
72 out[language] = bytes
73 }
74
75 return out, rows.Err()
76}
77
78func UpdateRepoLanguages(tx *sql.Tx, repoDid syntax.DID, ref string, langs []models.RepoLanguage) error {
79 err := DeleteRepoLanguages(
80 tx,
81 orm.FilterEq("repo_did", repoDid),
82 orm.FilterEq("ref", ref),
83 )
84 if err != nil {
85 return fmt.Errorf("failed to delete existing languages: %w", err)
86 }
87
88 return InsertRepoLanguages(tx, langs)
89}