76 lines
2.0 kB
1
package db
2
3
import (
4
"database/sql"
5
6
_ "github.com/mattn/go-sqlite3"
7
)
8
9
type DB struct {
10
db *sql.DB
11
}
12
13
func Make(dbPath string) (*DB, error) {
14
db, err := sql.Open("sqlite3", dbPath)
15
if err != nil {
16
return nil, err
17
}
18
_, err = db.Exec(`
19
pragma journal_mode = WAL;
20
pragma synchronous = normal;
21
pragma foreign_keys = on;
22
pragma temp_store = memory;
23
pragma mmap_size = 30000000000;
24
pragma page_size = 32768;
25
pragma auto_vacuum = incremental;
26
pragma busy_timeout = 5000;
27
28
create table if not exists registrations (
29
id integer primary key autoincrement,
30
domain text not null unique,
31
did text not null,
32
secret text not null,
33
created text not null default (strftime('%Y-%m-%dT%H:%M:%SZ', 'now')),
34
registered text
35
);
36
create table if not exists public_keys (
37
id integer primary key autoincrement,
38
did text not null,
39
name text not null,
40
key text not null,
41
created text not null default (strftime('%Y-%m-%dT%H:%M:%SZ', 'now')),
42
unique(did, name, key)
43
);
44
create table if not exists repos (
45
id integer primary key autoincrement,
46
did text not null,
47
name text not null,
48
knot text not null,
49
rkey text not null,
50
created text not null default (strftime('%Y-%m-%dT%H:%M:%SZ', 'now')),
51
unique(did, name, knot, rkey)
52
);
53
create table if not exists collaborators (
54
id integer primary key autoincrement,
55
did text not null,
56
repo integer not null,
57
foreign key (repo) references repos(id) on delete cascade
58
);
59
create table if not exists follows (
60
user_did text not null,
61
subject_did text not null,
62
at_uri text not null,
63
followed_at text not null default (strftime('%Y-%m-%dT%H:%M:%SZ', 'now')),
64
primary key (user_did, subject_did),
65
check (user_did <> subject_did)
66
);
67
create table if not exists _jetstream (
68
id integer primary key autoincrement,
69
last_time_us integer not null
70
);
71
`)
72
if err != nil {
73
return nil, err
74
}
75
return &DB{db: db}, nil
76
}
77