Migration 0002 added fsid column with DEFAULT 0 but never
populated existing rows. Now PopulateLegacyFSIDs() runs after 0002
to extract fsid from legacy options string or generate random.
Also: move generateRandomFSID to internal/system to avoid import
cycles. Migration 0004 drops the legacy options column.
Version: 0.3.1 -> 0.3.2
The previous SAVEPOINT approach failed because Go's tx.Exec() stops at
the first error and never reaches the ROLLBACK TO statements. This caused
every subsequent startup to re-run migration 0002, fail on the first
ALTER (column already exists from a prior partial run), and crash.
Fix runMigration() to:
- Execute migrations without a wrapping transaction (DDL in SQLite is
auto-commit anyway)
- Treat "duplicate column name" / "already exists" errors as success
and record the migration anyway, covering cases where a previous
failed attempt already partially modified the schema
Also simplify 0002_nfs_structured.sql back to plain ALTER TABLE
statements (no SAVEPOINT needed with the new Go-level tolerance).
Bump VERSION 0.1.9 -> 0.1.10
- Add schema_migrations table to track applied migrations
- Migrate() now checks if a migration was already applied before running
- 0002 rewritten to use SAVEPOINT+ROLLBACK per column, making it safe
to run even if some columns were partially added previously
- Each migration runs in its own transaction; INSERT into schema_migrations
only happens if the SQL executes without error
- Bump VERSION 0.1.8 -> 0.1.9