mirror of
https://github.com/Sagit-chu/flvx.git
synced 2026-10-05 17:46:37 +08:00
fix(backend): backfill legacy inx columns during sqlite migration
This commit is contained in:
@@ -123,6 +123,11 @@ func Open(path string) (*Repository, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if err := migrateSchema(db); err != nil {
|
||||||
|
_ = db.Close()
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
return &Repository{db: db}, nil
|
return &Repository{db: db}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1176,6 +1181,52 @@ func bootstrapSchema(db *sql.DB) error {
|
|||||||
return nil
|
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 {
|
var osMkdirAll = func(path string) error {
|
||||||
return os.MkdirAll(path, 0o755)
|
return os.MkdirAll(path, 0o755)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user