knotserver: add ability to run migrations on knots #878

deleted
opened by oppi.li targeting master from op/wonqmpyrknoq
Changed files
+17 -5
knotserver
db
+17 -5
knotserver/db/db.go
··· 1 1 package db 2 2 3 3 import ( 4 + "context" 4 5 "database/sql" 5 6 "log/slog" 6 7 "strings" 7 8 8 9 _ "github.com/mattn/go-sqlite3" 10 + "tangled.org/core/log" 9 11 ) 10 12 11 13 type DB struct { ··· 13 15 logger *slog.Logger 14 16 } 15 17 16 - func Setup(dbPath string, logger *slog.Logger) (*DB, error) { 18 + func Setup(ctx context.Context, dbPath string) (*DB, error) { 17 19 // https://github.com/mattn/go-sqlite3#connection-string 18 20 opts := []string{ 19 21 "_foreign_keys=1", ··· 22 24 "_auto_vacuum=incremental", 23 25 } 24 26 27 + logger := log.FromContext(ctx) 28 + logger = log.SubLogger(logger, "db") 29 + 25 30 db, err := sql.Open("sqlite3", dbPath+"?"+strings.Join(opts, "&")) 26 31 if err != nil { 27 32 return nil, err 28 33 } 29 34 30 - // NOTE: If any other migration is added here, you MUST 31 - // copy the pattern in appview: use a single sql.Conn 32 - // for every migration. 35 + conn, err := db.Conn(ctx) 36 + if err != nil { 37 + return nil, err 38 + } 39 + defer conn.Close() 33 40 34 - _, err = db.Exec(` 41 + _, err = conn.ExecContext(ctx, ` 35 42 create table if not exists known_dids ( 36 43 did text primary key 37 44 ); ··· 57 64 created integer not null default (strftime('%s', 'now')), 58 65 primary key (rkey, nsid) 59 66 ); 67 + 68 + create table if not exists migrations ( 69 + id integer primary key autoincrement, 70 + name text unique 71 + ); 60 72 `) 61 73 if err != nil { 62 74 return nil, err