You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

db.go 2.1KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. // Copyright 2021 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package common
  4. import (
  5. "context"
  6. "fmt"
  7. "time"
  8. "code.gitea.io/gitea/models/db"
  9. "code.gitea.io/gitea/models/migrations"
  10. system_model "code.gitea.io/gitea/models/system"
  11. "code.gitea.io/gitea/modules/log"
  12. "code.gitea.io/gitea/modules/setting"
  13. "code.gitea.io/gitea/modules/setting/config"
  14. "xorm.io/xorm"
  15. )
  16. // InitDBEngine In case of problems connecting to DB, retry connection. Eg, PGSQL in Docker Container on Synology
  17. func InitDBEngine(ctx context.Context) (err error) {
  18. log.Info("Beginning ORM engine initialization.")
  19. for i := 0; i < setting.Database.DBConnectRetries; i++ {
  20. select {
  21. case <-ctx.Done():
  22. return fmt.Errorf("Aborted due to shutdown:\nin retry ORM engine initialization")
  23. default:
  24. }
  25. log.Info("ORM engine initialization attempt #%d/%d...", i+1, setting.Database.DBConnectRetries)
  26. if err = db.InitEngineWithMigration(ctx, migrateWithSetting); err == nil {
  27. break
  28. } else if i == setting.Database.DBConnectRetries-1 {
  29. return err
  30. }
  31. log.Error("ORM engine initialization attempt #%d/%d failed. Error: %v", i+1, setting.Database.DBConnectRetries, err)
  32. log.Info("Backing off for %d seconds", int64(setting.Database.DBConnectBackoff/time.Second))
  33. time.Sleep(setting.Database.DBConnectBackoff)
  34. }
  35. config.SetDynGetter(system_model.NewDatabaseDynKeyGetter())
  36. return nil
  37. }
  38. func migrateWithSetting(x *xorm.Engine) error {
  39. if setting.Database.AutoMigration {
  40. return migrations.Migrate(x)
  41. }
  42. if current, err := migrations.GetCurrentDBVersion(x); err != nil {
  43. return err
  44. } else if current < 0 {
  45. // execute migrations when the database isn't initialized even if AutoMigration is false
  46. return migrations.Migrate(x)
  47. } else if expected := migrations.ExpectedVersion(); current != expected {
  48. log.Fatal(`"database.AUTO_MIGRATION" is disabled, but current database version %d is not equal to the expected version %d.`+
  49. `You can set "database.AUTO_MIGRATION" to true or migrate manually by running "gitea [--config /path/to/app.ini] migrate"`, current, expected)
  50. }
  51. return nil
  52. }