forked from tangled.org/core
Monorepo for Tangled — https://tangled.org
at master 1.6 kB view raw
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}