appview: add repo_languages table #316

merged
opened by oppi.li targeting master from push-snktzuwttuvu

and db helpers to set and get.

Signed-off-by: oppiliappan me@oppi.li

Changed files
+96
appview
+15
appview/db/db.go
··· 421 on delete cascade 422 ); 423 424 create table if not exists migrations ( 425 id integer primary key autoincrement, 426 name text unique
··· 421 on delete cascade 422 ); 423 424 + create table if not exists repo_languages ( 425 + -- identifiers 426 + id integer primary key autoincrement, 427 + 428 + -- repo identifiers 429 + repo_at text not null, 430 + ref text not null, 431 + 432 + -- language breakdown 433 + language text not null, 434 + bytes integer not null check (bytes >= 0), 435 + 436 + unique(repo_at, ref, language) 437 + ); 438 + 439 create table if not exists migrations ( 440 id integer primary key autoincrement, 441 name text unique
+81
appview/db/language.go
···
··· 1 + package db 2 + 3 + import ( 4 + "fmt" 5 + "strings" 6 + 7 + "github.com/bluesky-social/indigo/atproto/syntax" 8 + ) 9 + 10 + type RepoLanguage struct { 11 + Id int64 12 + RepoAt syntax.ATURI 13 + Ref string 14 + Language string 15 + Bytes int64 16 + } 17 + 18 + func 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 + 65 + func 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 + }