+17
-5
knotserver/db/db.go
+17
-5
knotserver/db/db.go
···
1
1
package db
2
2
3
3
import (
4
+
"context"
4
5
"database/sql"
5
6
"log/slog"
6
7
"strings"
7
8
8
9
_ "github.com/mattn/go-sqlite3"
10
+
"tangled.org/core/log"
9
11
)
10
12
11
13
type DB struct {
···
13
15
logger *slog.Logger
14
16
}
15
17
16
-
func Setup(dbPath string, logger *slog.Logger) (*DB, error) {
18
+
func Setup(ctx context.Context, dbPath string) (*DB, error) {
17
19
// https://github.com/mattn/go-sqlite3#connection-string
18
20
opts := []string{
19
21
"_foreign_keys=1",
···
22
24
"_auto_vacuum=incremental",
23
25
}
24
26
27
+
logger := log.FromContext(ctx)
28
+
logger = log.SubLogger(logger, "db")
29
+
25
30
db, err := sql.Open("sqlite3", dbPath+"?"+strings.Join(opts, "&"))
26
31
if err != nil {
27
32
return nil, err
28
33
}
29
34
30
-
// NOTE: If any other migration is added here, you MUST
31
-
// copy the pattern in appview: use a single sql.Conn
32
-
// for every migration.
35
+
conn, err := db.Conn(ctx)
36
+
if err != nil {
37
+
return nil, err
38
+
}
39
+
defer conn.Close()
33
40
34
-
_, err = db.Exec(`
41
+
_, err = conn.ExecContext(ctx, `
35
42
create table if not exists known_dids (
36
43
did text primary key
37
44
);
···
56
63
event text not null, -- json
57
64
created integer not null default (strftime('%s', 'now')),
58
65
primary key (rkey, nsid)
66
+
);
67
+
68
+
create table if not exists migrations (
69
+
id integer primary key autoincrement,
70
+
name text unique
59
71
);
60
72
`)
61
73
if err != nil {