Monorepo for Tangled tangled.org

knotserver: add ability to run migrations on knots

Signed-off-by: oppiliappan <me@oppi.li>

oppi.li ff1bfb3f 6ae8074c

verified
Changed files
+17 -5
knotserver
db
+17 -5
knotserver/db/db.go
··· 1 package db 2 3 import ( 4 "database/sql" 5 "log/slog" 6 "strings" 7 8 _ "github.com/mattn/go-sqlite3" 9 ) 10 11 type DB struct { ··· 13 logger *slog.Logger 14 } 15 16 - func Setup(dbPath string, logger *slog.Logger) (*DB, error) { 17 // https://github.com/mattn/go-sqlite3#connection-string 18 opts := []string{ 19 "_foreign_keys=1", ··· 22 "_auto_vacuum=incremental", 23 } 24 25 db, err := sql.Open("sqlite3", dbPath+"?"+strings.Join(opts, "&")) 26 if err != nil { 27 return nil, err 28 } 29 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. 33 34 - _, err = db.Exec(` 35 create table if not exists known_dids ( 36 did text primary key 37 ); ··· 56 event text not null, -- json 57 created integer not null default (strftime('%s', 'now')), 58 primary key (rkey, nsid) 59 ); 60 `) 61 if err != nil {
··· 1 package db 2 3 import ( 4 + "context" 5 "database/sql" 6 "log/slog" 7 "strings" 8 9 _ "github.com/mattn/go-sqlite3" 10 + "tangled.org/core/log" 11 ) 12 13 type DB struct { ··· 15 logger *slog.Logger 16 } 17 18 + func Setup(ctx context.Context, dbPath string) (*DB, error) { 19 // https://github.com/mattn/go-sqlite3#connection-string 20 opts := []string{ 21 "_foreign_keys=1", ··· 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 ); ··· 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 {