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