forked from tangled.org/core
Monorepo for Tangled — https://tangled.org
1package db 2 3import ( 4 "fmt" 5 "strings" 6 7 "github.com/bluesky-social/indigo/atproto/syntax" 8) 9 10type RepoLanguage struct { 11 Id int64 12 RepoAt syntax.ATURI 13 Ref string 14 Language string 15 Bytes int64 16} 17 18func GetRepoLanguages(e Execer, filters ...filter) ([]RepoLanguage, error) { 19 var conditions []string 20 var args []any 21 for _, filter := range filters { 22 conditions = append(conditions, filter.Condition()) 23 args = append(args, filter.Arg()...) 24 } 25 26 whereClause := "" 27 if conditions != nil { 28 whereClause = " where " + strings.Join(conditions, " and ") 29 } 30 31 query := fmt.Sprintf( 32 `select id, repo_at, ref, language, bytes from repo_languages %s`, 33 whereClause, 34 ) 35 rows, err := e.Query(query, args...) 36 37 if err != nil { 38 return nil, fmt.Errorf("failed to execute query: %w ", err) 39 } 40 41 var langs []RepoLanguage 42 for rows.Next() { 43 var rl RepoLanguage 44 45 err := rows.Scan( 46 &rl.Id, 47 &rl.RepoAt, 48 &rl.Ref, 49 &rl.Language, 50 &rl.Bytes, 51 ) 52 if err != nil { 53 return nil, fmt.Errorf("failed to scan: %w ", err) 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 []RepoLanguage) error { 66 stmt, err := e.Prepare( 67 "insert or replace into repo_languages (repo_at, ref, language, bytes) values (?, ?, ?, ?)", 68 ) 69 if err != nil { 70 return err 71 } 72 73 for _, l := range langs { 74 _, err := stmt.Exec(l.RepoAt, l.Ref, l.Language, l.Bytes) 75 if err != nil { 76 return err 77 } 78 } 79 80 return nil 81}