2021-06-09 02:33:54 +03:00
// Copyright 2021 The Gitea Authors. All rights reserved.
2022-11-27 21:20:29 +03:00
// SPDX-License-Identifier: MIT
2021-06-09 02:33:54 +03:00
package common
import (
"context"
"fmt"
"time"
2021-09-19 14:49:59 +03:00
"code.gitea.io/gitea/models/db"
2021-06-09 02:33:54 +03:00
"code.gitea.io/gitea/models/migrations"
2023-10-05 04:08:19 +03:00
system_model "code.gitea.io/gitea/models/system"
2021-06-09 02:33:54 +03:00
"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/setting"
2023-10-05 04:08:19 +03:00
"code.gitea.io/gitea/modules/setting/config"
2022-12-07 18:58:31 +03:00
"xorm.io/xorm"
2021-06-09 02:33:54 +03:00
)
// InitDBEngine In case of problems connecting to DB, retry connection. Eg, PGSQL in Docker Container on Synology
func InitDBEngine ( ctx context . Context ) ( err error ) {
log . Info ( "Beginning ORM engine initialization." )
for i := 0 ; i < setting . Database . DBConnectRetries ; i ++ {
select {
case <- ctx . Done ( ) :
return fmt . Errorf ( "Aborted due to shutdown:\nin retry ORM engine initialization" )
default :
}
log . Info ( "ORM engine initialization attempt #%d/%d..." , i + 1 , setting . Database . DBConnectRetries )
2022-12-07 18:58:31 +03:00
if err = db . InitEngineWithMigration ( ctx , migrateWithSetting ) ; err == nil {
2021-06-09 02:33:54 +03:00
break
} else if i == setting . Database . DBConnectRetries - 1 {
return err
}
log . Error ( "ORM engine initialization attempt #%d/%d failed. Error: %v" , i + 1 , setting . Database . DBConnectRetries , err )
log . Info ( "Backing off for %d seconds" , int64 ( setting . Database . DBConnectBackoff / time . Second ) )
time . Sleep ( setting . Database . DBConnectBackoff )
}
2023-10-05 04:08:19 +03:00
config . SetDynGetter ( system_model . NewDatabaseDynKeyGetter ( ) )
2021-06-09 02:33:54 +03:00
return nil
}
2022-12-07 18:58:31 +03:00
func migrateWithSetting ( x * xorm . Engine ) error {
if setting . Database . AutoMigration {
return migrations . Migrate ( x )
}
if current , err := migrations . GetCurrentDBVersion ( x ) ; err != nil {
return err
} else if current < 0 {
// execute migrations when the database isn't initialized even if AutoMigration is false
return migrations . Migrate ( x )
2024-10-27 14:54:35 +03:00
} else if expected := migrations . ExpectedDBVersion ( ) ; current != expected {
2022-12-07 18:58:31 +03:00
log . Fatal ( ` "database.AUTO_MIGRATION" is disabled, but current database version %d is not equal to the expected version %d. ` +
` You can set "database.AUTO_MIGRATION" to true or migrate manually by running "gitea [--config /path/to/app.ini] migrate" ` , current , expected )
}
return nil
}