this repo has no description
1package db
2
3import (
4 "database/sql"
5
6 _ "github.com/mattn/go-sqlite3"
7)
8
9type DB struct {
10 db *sql.DB
11}
12
13func 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 at_uri text not null unique,
51 created text not null default (strftime('%Y-%m-%dT%H:%M:%SZ', 'now')),
52 unique(did, name, knot, rkey)
53 );
54 create table if not exists collaborators (
55 id integer primary key autoincrement,
56 did text not null,
57 repo integer not null,
58 foreign key (repo) references repos(id) on delete cascade
59 );
60 create table if not exists follows (
61 user_did text not null,
62 subject_did text not null,
63 at_uri text not null unique,
64 rkey text not null,
65 followed_at text not null default (strftime('%Y-%m-%dT%H:%M:%SZ', 'now')),
66 primary key (user_did, subject_did),
67 check (user_did <> subject_did)
68 );
69 create table if not exists issues (
70 id integer primary key autoincrement,
71 owner_did text not null,
72 repo_at text not null,
73 issue_id integer not null unique,
74 title text not null,
75 body text not null,
76 created text not null default (strftime('%Y-%m-%dT%H:%M:%SZ', 'now')),
77 unique(repo_at, issue_id),
78 foreign key (repo_at) references repos(at_uri) on delete cascade
79 );
80 create table if not exists comments (
81 id integer primary key autoincrement,
82 owner_did text not null,
83 issue_id integer not null,
84 repo_at text not null,
85 comment_id integer not null,
86 body text not null,
87 created text not null default (strftime('%Y-%m-%dT%H:%M:%SZ', 'now')),
88 unique(issue_id, comment_id),
89 foreign key (issue_id) references issues(issue_id) on delete cascade
90 );
91 create table if not exists _jetstream (
92 id integer primary key autoincrement,
93 last_time_us integer not null
94 );
95
96 create table if not exists repo_issue_seqs (
97 repo_at text primary key,
98 next_issue_id integer not null default 1
99 );
100
101 `)
102 if err != nil {
103 return nil, err
104 }
105 return &DB{db: db}, nil
106}