database.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. // SPDX-FileCopyrightText: Copyright The Miniflux Authors. All rights reserved.
  2. // SPDX-License-Identifier: Apache-2.0
  3. package database // import "miniflux.app/v2/internal/database"
  4. import (
  5. "database/sql"
  6. "fmt"
  7. "log/slog"
  8. )
  9. // Migrate executes database migrations.
  10. func Migrate(db *sql.DB) error {
  11. var currentVersion int
  12. db.QueryRow(`SELECT version FROM schema_version`).Scan(&currentVersion)
  13. driver := getDriverStr()
  14. slog.Info("Running database migrations",
  15. slog.Int("current_version", currentVersion),
  16. slog.Int("latest_version", schemaVersion),
  17. slog.String("driver", driver),
  18. )
  19. for version := currentVersion; version < schemaVersion; version++ {
  20. newVersion := version + 1
  21. tx, err := db.Begin()
  22. if err != nil {
  23. return fmt.Errorf("[Migration v%d] %v", newVersion, err)
  24. }
  25. if err := migrations[version](tx, driver); err != nil {
  26. tx.Rollback()
  27. return fmt.Errorf("[Migration v%d] %v", newVersion, err)
  28. }
  29. if _, err := tx.Exec(`TRUNCATE schema_version`); err != nil {
  30. tx.Rollback()
  31. return fmt.Errorf("[Migration v%d] %v", newVersion, err)
  32. }
  33. if _, err := tx.Exec(`INSERT INTO schema_version (version) VALUES ($1)`, newVersion); err != nil {
  34. tx.Rollback()
  35. return fmt.Errorf("[Migration v%d] %v", newVersion, err)
  36. }
  37. if err := tx.Commit(); err != nil {
  38. return fmt.Errorf("[Migration v%d] %v", newVersion, err)
  39. }
  40. }
  41. return nil
  42. }
  43. // IsSchemaUpToDate checks if the database schema is up to date.
  44. func IsSchemaUpToDate(db *sql.DB) error {
  45. var currentVersion int
  46. db.QueryRow(`SELECT version FROM schema_version`).Scan(&currentVersion)
  47. if currentVersion < schemaVersion {
  48. return fmt.Errorf(`the database schema is not up to date: current=v%d expected=v%d`, currentVersion, schemaVersion)
  49. }
  50. return nil
  51. }