code.gitea.io/gitea@v1.21.7/routers/common/db.go (about)

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