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