Monorepo for Tangled
tangled.org
1package db
2
3import (
4 "context"
5 "database/sql"
6 "fmt"
7
8 "github.com/bluesky-social/indigo/atproto/syntax"
9 "github.com/go-git/go-git/v5/plumbing"
10)
11
12func IsLanguageIndexed(ctx context.Context, e *sql.DB, repoId syntax.DID, commitId plumbing.Hash) (bool, error) {
13 var exists bool
14 err := e.QueryRow(`select exists(select 1 from repo_head_languages where repo = $1)`, repoId).Scan(&exists)
15 return exists, err
16}
17
18func InsertLanguages(ctx context.Context, e *sql.DB, repoId syntax.DID, commitId plumbing.Hash, langs map[string]int64) error {
19 tx, err := e.BeginTx(ctx, nil)
20 if err != nil {
21 return fmt.Errorf("BeginTx: %w", err)
22 }
23 defer tx.Rollback()
24
25 if _, err := tx.Exec(`delete from repo_head_languages where repo = $1`, repoId); err != nil {
26 return fmt.Errorf("deleting old languages: %w", err)
27 }
28
29 for lang, size := range langs {
30 if _, err := tx.Exec(
31 `insert into repo_head_languages (repo, commit, language, size)
32 values ($1, $2, $3, $4)`,
33 repoId, commitId.String(), lang, size,
34 ); err != nil {
35 return fmt.Errorf("inserting language: %w", err)
36 }
37 }
38
39 if err := tx.Commit(); err != nil {
40 return fmt.Errorf("tx.Commit: %w", err)
41 }
42 return nil
43}
44
45func ListLanguages(ctx context.Context, e *sql.DB, repoId syntax.DID, commitId plumbing.Hash) (map[string]int64, error) {
46 sizes := make(map[string]int64)
47
48 rows, err := e.Query(`select language, size from repo_head_languages where repo = $1 and commit = $2`, repoId, commitId.String())
49 if err != nil {
50 return nil, err
51 }
52 defer rows.Close()
53
54 for rows.Next() {
55 var lang string
56 var size int64
57 if err := rows.Scan(&lang, &size); err != nil {
58 return nil, err
59 }
60 sizes[lang] = size
61 }
62
63 if err := rows.Err(); err != nil {
64 return nil, err
65 }
66
67 return sizes, nil
68}