forked from
tangled.org/core
Mirror of @tangled.org/core. Running on a Raspberry Pi Zero 2 (Please be gentle).
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 "_busy_timeout=5000",
26 }
27
28 logger := log.FromContext(ctx)
29 logger = log.SubLogger(logger, "db")
30
31 db, err := sql.Open("sqlite3", dbPath+"?"+strings.Join(opts, "&"))
32 if err != nil {
33 return nil, err
34 }
35
36 conn, err := db.Conn(ctx)
37 if err != nil {
38 return nil, err
39 }
40 defer conn.Close()
41
42 _, err = conn.ExecContext(ctx, `
43 create table if not exists known_dids (
44 did text primary key
45 );
46
47 create table if not exists public_keys (
48 id integer primary key autoincrement,
49 did text not null,
50 key text not null,
51 created text not null default (strftime('%Y-%m-%dT%H:%M:%SZ', 'now')),
52 unique(did, key),
53 foreign key (did) references known_dids(did) on delete cascade
54 );
55
56 create table if not exists _jetstream (
57 id integer primary key autoincrement,
58 last_time_us integer not null
59 );
60
61 create table if not exists events (
62 rkey text not null,
63 nsid text not null,
64 event text not null, -- json
65 created integer not null default (strftime('%s', 'now')),
66 primary key (rkey, nsid)
67 );
68
69 create table if not exists migrations (
70 id integer primary key autoincrement,
71 name text unique
72 );
73 `)
74 if err != nil {
75 return nil, err
76 }
77
78 return &DB{
79 db: db,
80 logger: logger,
81 }, nil
82}