Skip to content

Commit

Permalink
Fix SQLite DB schema migration code
Browse files Browse the repository at this point in the history
It now can safely run on bare databases, before any tables are
created.

Signed-off-by: Matthew Heon <[email protected]>
  • Loading branch information
mheon committed Mar 17, 2023
1 parent f1bcd0d commit 94f905a
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 4 deletions.
9 changes: 5 additions & 4 deletions libpod/sqlite_state.go
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
15 changes: 15 additions & 0 deletions libpod/sqlite_state_internal.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -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
Expand Down

0 comments on commit 94f905a

Please sign in to comment.