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