internal/store/stats.go
50 lines · 1300 bytes
1package store
2
3// ListAllRepos returns every repository, for host-local admin tooling.
4func (s *Store) ListAllRepos() ([]Repo, error) {
5 rows, err := s.DB.Query(repoSelect + " ORDER BY 4, r.name")
6 if err != nil {
7 return nil, err
8 }
9 defer rows.Close()
10 var out []Repo
11 for rows.Next() {
12 r, err := scanRepo(rows)
13 if err != nil {
14 return nil, err
15 }
16 out = append(out, r)
17 }
18 return out, rows.Err()
19}
20
21type Counts struct {
22 Users int64 `json:"users"`
23 Orgs int64 `json:"orgs"`
24 Repos int64 `json:"repos"`
25 Issues int64 `json:"issues"`
26 OpenIssues int64 `json:"open_issues"`
27 MRs int64 `json:"mrs"`
28 OpenMRs int64 `json:"open_mrs"`
29}
30
31func (s *Store) InstanceCounts() (Counts, error) {
32 var c Counts
33 for _, q := range []struct {
34 dst *int64
35 query string
36 }{
37 {&c.Users, "SELECT COUNT(*) FROM users"},
38 {&c.Orgs, "SELECT COUNT(*) FROM orgs"},
39 {&c.Repos, "SELECT COUNT(*) FROM repos"},
40 {&c.Issues, "SELECT COUNT(*) FROM issues"},
41 {&c.OpenIssues, "SELECT COUNT(*) FROM issues WHERE state = 'open'"},
42 {&c.MRs, "SELECT COUNT(*) FROM merge_requests"},
43 {&c.OpenMRs, "SELECT COUNT(*) FROM merge_requests WHERE state IN ('open','source_gone')"},
44 } {
45 if err := s.DB.QueryRow(q.query).Scan(q.dst); err != nil {
46 return c, err
47 }
48 }
49 return c, nil
50}