+15
appview/db/db.go
+15
appview/db/db.go
···
421
421
on delete cascade
422
422
);
423
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
+
424
439
create table if not exists migrations (
425
440
id integer primary key autoincrement,
426
441
name text unique
+81
appview/db/language.go
+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
+
}