From 0dc2c042e2e0437fceee443fd4b53d6ca1dcb2f5 Mon Sep 17 00:00:00 2001 From: Seongmin Lee Date: Wed, 17 Dec 2025 13:12:17 +0900 Subject: [PATCH] spindle: recreate repos table This new db migration won't migrate existing records in repos table. Instead, it will simply rename the legacy table to `repos_old` and create a new one with same name. repo backfill will be done with tap Signed-off-by: Seongmin Lee --- spindle/db/db.go | 49 +++++++++++++++++++++++++++++++++++++++++++---- spindle/server.go | 2 +- 2 files changed, 46 insertions(+), 5 deletions(-) diff --git a/spindle/db/db.go b/spindle/db/db.go index 78121a63..942e5c92 100644 --- a/spindle/db/db.go +++ b/spindle/db/db.go @@ -1,17 +1,20 @@ package db import ( + "context" "database/sql" "strings" _ "github.com/mattn/go-sqlite3" + "tangled.org/core/log" + "tangled.org/core/orm" ) type DB struct { *sql.DB } -func Make(dbPath string) (*DB, error) { +func Make(ctx context.Context, dbPath string) (*DB, error) { // https://github.com/mattn/go-sqlite3#connection-string opts := []string{ "_foreign_keys=1", @@ -20,14 +23,19 @@ func Make(dbPath string) (*DB, error) { "_auto_vacuum=incremental", } + logger := log.FromContext(ctx) + logger = log.SubLogger(logger, "db") + db, err := sql.Open("sqlite3", dbPath+"?"+strings.Join(opts, "&")) if err != nil { return nil, err } - // NOTE: If any other migration is added here, you MUST - // copy the pattern in appview: use a single sql.Conn - // for every migration. + conn, err := db.Conn(ctx) + if err != nil { + return nil, err + } + defer conn.Close() _, err = db.Exec(` create table if not exists _jetstream ( @@ -76,6 +84,39 @@ func Make(dbPath string) (*DB, error) { return nil, err } + // run migrations + + // NOTE: this won't migrate existing records + // they will be fetched again with tap instead + orm.RunMigration(conn, logger, "add-rkey-to-repos", func(tx *sql.Tx) error { + // archive legacy repos (just in case) + _, err = tx.Exec(`alter table repos rename to repos_old`) + if err != nil { + return err + } + + _, err := tx.Exec(` + create table repos ( + -- identifiers + id integer primary key autoincrement, + did text not null, + rkey text not null, + at_uri text generated always as ('at://' || did || '/' || 'sh.tangled.repo' || '/' || rkey) stored, + + name text not null, + knot text not null, + + addedAt text not null default (strftime('%Y-%m-%dT%H:%M:%SZ', 'now')), + unique(did, rkey) + ); + `) + if err != nil { + return err + } + + return nil + }) + return &DB{db}, nil } diff --git a/spindle/server.go b/spindle/server.go index 10fd66eb..e9863194 100644 --- a/spindle/server.go +++ b/spindle/server.go @@ -53,7 +53,7 @@ type Spindle struct { func New(ctx context.Context, cfg *config.Config, engines map[string]models.Engine) (*Spindle, error) { logger := log.FromContext(ctx) - d, err := db.Make(cfg.Server.DBPath) + d, err := db.Make(ctx, cfg.Server.DBPath) if err != nil { return nil, fmt.Errorf("failed to setup db: %w", err) } -- 2.51.2