forked from tangled.org/core
Monorepo for Tangled — https://tangled.org
at master 2.6 kB view raw
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 GetRepoLanguages(e Execer, filters ...orm.Filter) ([]models.RepoLanguage, error) { 14 var conditions []string 15 var args []any 16 for _, filter := range filters { 17 conditions = append(conditions, filter.Condition()) 18 args = append(args, filter.Arg()...) 19 } 20 21 whereClause := "" 22 if conditions != nil { 23 whereClause = " where " + strings.Join(conditions, " and ") 24 } 25 26 query := fmt.Sprintf( 27 `select id, repo_at, ref, is_default_ref, language, bytes from repo_languages %s`, 28 whereClause, 29 ) 30 rows, err := e.Query(query, args...) 31 32 if err != nil { 33 return nil, fmt.Errorf("failed to execute query: %w ", err) 34 } 35 36 var langs []models.RepoLanguage 37 for rows.Next() { 38 var rl models.RepoLanguage 39 var isDefaultRef int 40 41 err := rows.Scan( 42 &rl.Id, 43 &rl.RepoAt, 44 &rl.Ref, 45 &isDefaultRef, 46 &rl.Language, 47 &rl.Bytes, 48 ) 49 if err != nil { 50 return nil, fmt.Errorf("failed to scan: %w ", err) 51 } 52 53 if isDefaultRef != 0 { 54 rl.IsDefaultRef = true 55 } 56 57 langs = append(langs, rl) 58 } 59 if err = rows.Err(); err != nil { 60 return nil, fmt.Errorf("failed to scan rows: %w ", err) 61 } 62 63 return langs, nil 64} 65 66func InsertRepoLanguages(e Execer, langs []models.RepoLanguage) error { 67 stmt, err := e.Prepare( 68 "insert or replace into repo_languages (repo_at, ref, is_default_ref, language, bytes) values (?, ?, ?, ?, ?)", 69 ) 70 if err != nil { 71 return err 72 } 73 74 for _, l := range langs { 75 isDefaultRef := 0 76 if l.IsDefaultRef { 77 isDefaultRef = 1 78 } 79 80 _, err := stmt.Exec(l.RepoAt, l.Ref, isDefaultRef, l.Language, l.Bytes) 81 if err != nil { 82 return err 83 } 84 } 85 86 return nil 87} 88 89func DeleteRepoLanguages(e Execer, filters ...orm.Filter) error { 90 var conditions []string 91 var args []any 92 for _, filter := range filters { 93 conditions = append(conditions, filter.Condition()) 94 args = append(args, filter.Arg()...) 95 } 96 97 whereClause := "" 98 if conditions != nil { 99 whereClause = " where " + strings.Join(conditions, " and ") 100 } 101 102 query := fmt.Sprintf(`delete from repo_languages %s`, whereClause) 103 104 _, err := e.Exec(query, args...) 105 return err 106} 107 108func UpdateRepoLanguages(tx *sql.Tx, repoAt syntax.ATURI, ref string, langs []models.RepoLanguage) error { 109 err := DeleteRepoLanguages( 110 tx, 111 orm.FilterEq("repo_at", repoAt), 112 orm.FilterEq("ref", ref), 113 ) 114 if err != nil { 115 return fmt.Errorf("failed to delete existing languages: %w", err) 116 } 117 118 return InsertRepoLanguages(tx, langs) 119}