Monorepo for Tangled
tangled.org
1package db
2
3import (
4 "database/sql"
5 "errors"
6)
7
8type RepoAlias struct {
9 OwnerDid string
10 Rkey string
11 RepoDid string
12 Rev string
13}
14
15func (d *DB) UpsertRepoAlias(a RepoAlias) error {
16 _, err := d.db.Exec(
17 `insert into repo_aliases (owner_did, rkey, repo_did, rev)
18 values (?, ?, ?, ?)
19 on conflict(owner_did, rkey) do update set
20 repo_did = excluded.repo_did,
21 rev = excluded.rev
22 where excluded.rev > repo_aliases.rev`,
23 a.OwnerDid, a.Rkey, a.RepoDid, a.Rev,
24 )
25 return err
26}
27
28func (d *DB) ResolveAlias(ownerDid, rkey string) (*RepoAlias, error) {
29 var a RepoAlias
30 err := d.db.QueryRow(
31 `select owner_did, rkey, repo_did, rev from repo_aliases where owner_did = ? and rkey = ?`,
32 ownerDid, rkey,
33 ).Scan(&a.OwnerDid, &a.Rkey, &a.RepoDid, &a.Rev)
34 if errors.Is(err, sql.ErrNoRows) {
35 return nil, nil
36 }
37 if err != nil {
38 return nil, err
39 }
40 return &a, nil
41}
42
43func (d *DB) CurrentRkey(repoDid string) (ownerDid string, rkey string, err error) {
44 err = d.db.QueryRow(
45 `select owner_did, rkey from repo_aliases
46 where repo_did = ?
47 order by rev desc
48 limit 1`,
49 repoDid,
50 ).Scan(&ownerDid, &rkey)
51 return
52}