Monorepo for Tangled
0

Configure Feed

Select the types of activity you want to include in your feed.

core / appview / db / language.go
1.9 kB 89 lines
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}