Monorepo for Tangled
tangled.org
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 UpdateRepoLanguages(tx *sql.Tx, repoDid syntax.DID, ref string, langs []models.RepoLanguage) error {
56 err := DeleteRepoLanguages(
57 tx,
58 orm.FilterEq("repo_did", repoDid),
59 orm.FilterEq("ref", ref),
60 )
61 if err != nil {
62 return fmt.Errorf("failed to delete existing languages: %w", err)
63 }
64
65 return InsertRepoLanguages(tx, langs)
66}