Fix SQLite DB schema migration code

It now can safely run on bare databases, before any tables are
created.

Signed-off-by: Matthew Heon <matthew.heon@pm.me>
This commit is contained in:
Matthew Heon 2023-02-28 10:25:34 -05:00
parent f1bcd0d781
commit 94f905a503
2 changed files with 20 additions and 4 deletions

View File

@ -77,15 +77,16 @@ func NewSqliteState(runtime *Runtime) (_ State, defErr error) {
return nil, fmt.Errorf("setting full fsync mode in db: %w", err)
}
// Migrate schema (if necessary)
if err := state.migrateSchemaIfNecessary(); err != nil {
return nil, err
}
// Set up tables
if err := sqliteInitTables(state.conn); err != nil {
return nil, fmt.Errorf("creating tables: %w", err)
}
if err := state.migrateSchemaIfNecessary(); err != nil {
return nil, err
}
state.valid = true
state.runtime = runtime

View File

@ -16,6 +16,20 @@ import (
)
func (s *SQLiteState) migrateSchemaIfNecessary() (defErr error) {
// First, check if the DBConfig table exists
checkRow := s.conn.QueryRow("SELECT 1 FROM sqlite_master WHERE type='table' AND name='DBConfig';")
var check int
if err := checkRow.Scan(&check); err != nil {
if errors.Is(err, sql.ErrNoRows) {
return nil
}
return fmt.Errorf("checking if DB config table exists: %w", err)
}
if check != 1 {
// Table does not exist, fresh database, no need to migrate.
return nil
}
row := s.conn.QueryRow("SELECT SchemaVersion FROM DBConfig;")
var schemaVer int
if err := row.Scan(&schemaVer); err != nil {
@ -24,6 +38,7 @@ func (s *SQLiteState) migrateSchemaIfNecessary() (defErr error) {
// Schema was just created, so it has to be the latest.
return nil
}
return fmt.Errorf("scanning schema version from DB config: %w", err)
}
// If the schema version 0 or less, it's invalid