A vibe coded tangled fork which supports pijul.
1package db
2
3import (
4 "context"
5 "database/sql"
6 "log/slog"
7 "strings"
8
9 _ "github.com/mattn/go-sqlite3"
10 "tangled.org/core/log"
11)
12
13type DB struct {
14 db *sql.DB
15 logger *slog.Logger
16}
17
18func Setup(ctx context.Context, dbPath string) (*DB, error) {
19 // https://github.com/mattn/go-sqlite3#connection-string
20 opts := []string{
21 "_foreign_keys=1",
22 "_journal_mode=WAL",
23 "_synchronous=NORMAL",
24 "_auto_vacuum=incremental",
25 }
26
27 logger := log.FromContext(ctx)
28 logger = log.SubLogger(logger, "db")
29
30 db, err := sql.Open("sqlite3", dbPath+"?"+strings.Join(opts, "&"))
31 if err != nil {
32 return nil, err
33 }
34
35 // NOTE: If any other migration is added here, you MUST
36 // copy the pattern in appview: use a single sql.Conn
37 // for every migration.
38
39 _, err = db.Exec(`
40 create table if not exists known_dids (
41 did text primary key
42 );
43
44 create table if not exists public_keys (
45 id integer primary key autoincrement,
46 did text not null,
47 key text not null,
48 created text not null default (strftime('%Y-%m-%dT%H:%M:%SZ', 'now')),
49 unique(did, key),
50 foreign key (did) references known_dids(did) on delete cascade
51 );
52
53 create table if not exists _jetstream (
54 id integer primary key autoincrement,
55 last_time_us integer not null
56 );
57
58 create table if not exists events (
59 rkey text not null,
60 nsid text not null,
61 event text not null, -- json
62 created integer not null default (strftime('%s', 'now')),
63 primary key (rkey, nsid)
64 );
65 `)
66 if err != nil {
67 return nil, err
68 }
69
70 return &DB{
71 db: db,
72 logger: logger,
73 }, nil
74}