From 2acee481f0bbeaa48fba5015a78de2ba853edb3d Mon Sep 17 00:00:00 2001 From: sagit Date: Tue, 10 Feb 2026 03:14:08 +0000 Subject: [PATCH] fix(backend): backfill legacy inx columns during sqlite migration --- .../internal/store/sqlite/repository.go | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/go-backend/internal/store/sqlite/repository.go b/go-backend/internal/store/sqlite/repository.go index 54a806e..c65d17e 100644 --- a/go-backend/internal/store/sqlite/repository.go +++ b/go-backend/internal/store/sqlite/repository.go @@ -123,6 +123,11 @@ func Open(path string) (*Repository, error) { return nil, err } + if err := migrateSchema(db); err != nil { + _ = db.Close() + return nil, err + } + return &Repository{db: db}, nil } @@ -1176,6 +1181,52 @@ func bootstrapSchema(db *sql.DB) error { return nil } +func migrateSchema(db *sql.DB) error { + if db == nil { + return errors.New("nil db") + } + + ensureColumn := func(table, col, typ string) error { + var dummy interface{} + err := db.QueryRow(fmt.Sprintf("SELECT %s FROM %s LIMIT 1", col, table)).Scan(&dummy) + if err == nil || errors.Is(err, sql.ErrNoRows) { + return nil + } + if !strings.Contains(err.Error(), "no such column") { + return nil + } + if _, err := db.Exec(fmt.Sprintf("ALTER TABLE %s ADD COLUMN %s %s", table, col, typ)); err != nil { + return fmt.Errorf("add %s.%s: %w", table, col, err) + } + return nil + } + + columnsByTable := map[string]map[string]string{ + "node": { + "inx": "INTEGER NOT NULL DEFAULT 0", + }, + "tunnel": { + "inx": "INTEGER NOT NULL DEFAULT 0", + }, + "forward": { + "inx": "INTEGER NOT NULL DEFAULT 0", + }, + "chain_tunnel": { + "inx": "INTEGER", + }, + } + + for table, cols := range columnsByTable { + for col, typ := range cols { + if err := ensureColumn(table, col, typ); err != nil { + return err + } + } + } + + return nil +} + var osMkdirAll = func(path string) error { return os.MkdirAll(path, 0o755) }