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