75 lines
1.9 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
created text not null default (strftime('%Y-%m-%dT%H:%M:%SZ', 'now')),
50
unique(did, name, knot)
51
);
52
create table if not exists collaborators (
53
id integer primary key autoincrement,
54
did text not null,
55
repo integer not null,
56
foreign key (repo) references repos(id) on delete cascade
57
);
58
create table if not exists follows (
59
user_did text not null,
60
subject_did text not null,
61
at_uri text not null,
62
followed_at text not null default (strftime('%Y-%m-%dT%H:%M:%SZ', 'now')),
63
primary key (user_did, subject_did),
64
check (user_did <> subject_did)
65
);
66
create table if not exists _jetstream (
67
id integer primary key autoincrement,
68
last_time_us integer not null
69
);
70
`)
71
if err != nil {
72
return nil, err
73
}
74
return &DB{db: db}, nil
75
}
76