1package db
2
3import (
4 "fmt"
5
6 "tangled.sh/tangled.sh/core/knotserver/notifier"
7)
8
9type Op struct {
10 Tid string // time based ID, easy to enumerate & monotonic
11 Did string // did of pusher
12 Repo string // <did/repo> fully qualified repo
13 OldSha string // old sha of reference being updated
14 NewSha string // new sha of reference being updated
15 Ref string // the reference being updated
16}
17
18func (d *DB) InsertOp(op Op, notifier *notifier.Notifier) error {
19 _, err := d.db.Exec(
20 `insert into oplog (tid, did, repo, old_sha, new_sha, ref) values (?, ?, ?, ?, ?, ?)`,
21 op.Tid,
22 op.Did,
23 op.Repo,
24 op.OldSha,
25 op.NewSha,
26 op.Ref,
27 )
28 if err != nil {
29 return err
30 }
31
32 notifier.NotifyAll()
33 return nil
34}
35
36func (d *DB) GetOps(cursor string) ([]Op, error) {
37 whereClause := ""
38 args := []any{}
39 if cursor != "" {
40 whereClause = "where tid > ?"
41 args = append(args, cursor)
42 }
43
44 query := fmt.Sprintf(`
45 select tid, did, repo, old_sha, new_sha, ref
46 from oplog
47 %s
48 order by tid asc
49 limit 100
50 `, whereClause)
51
52 rows, err := d.db.Query(query, args...)
53 if err != nil {
54 return nil, err
55 }
56 defer rows.Close()
57
58 var ops []Op
59 for rows.Next() {
60 var op Op
61 rows.Scan(&op.Tid, &op.Did, &op.Repo, &op.OldSha, &op.NewSha, &op.Ref)
62 ops = append(ops, op)
63 }
64
65 if err := rows.Err(); err != nil {
66 return nil, err
67 }
68
69 return ops, nil
70}