This commit is contained in:
2026-08-16 22:38:44 +08:00
parent 1945d34894
commit 560ae46b82
19 changed files with 345 additions and 112 deletions
+21 -8
View File
@@ -14,6 +14,7 @@ import (
"google.golang.org/protobuf/encoding/protojson"
"google.golang.org/protobuf/proto"
"gopkg.in/yaml.v3"
"gorm.io/gorm"
)
func protoMap(message proto.Message) (map[string]any, error) {
@@ -260,9 +261,18 @@ func (d *Data) reloadConfig(ctx context.Context) error {
return fmt.Errorf("data.database and admin configuration are required")
}
next.Admin.ConfigPath = configPath
candidateDB, err := openDatabase(next.Data.Database, false, "", d.logger())
if err != nil {
return fmt.Errorf("reload database: %w", err)
databaseReady := databaseConnectionConfigured(next.Data.Database)
var candidateDB *gorm.DB
if databaseReady {
candidateDB, err = openDatabase(next.Data.Database, false, "", d.logger())
if err != nil {
return fmt.Errorf("reload database: %w", err)
}
} else {
candidateDB, err = openFallbackDatabase(d.logger())
if err != nil {
return fmt.Errorf("reload bootstrap database: %w", err)
}
}
closeCandidate := true
defer func() {
@@ -272,12 +282,14 @@ func (d *Data) reloadConfig(ctx context.Context) error {
}
}
}()
if sqlDB, dbErr := candidateDB.DB(); dbErr != nil {
return dbErr
} else if err = sqlDB.PingContext(ctx); err != nil {
return fmt.Errorf("reload database: %w", err)
if databaseReady {
if sqlDB, dbErr := candidateDB.DB(); dbErr != nil {
return dbErr
} else if err = sqlDB.PingContext(ctx); err != nil {
return fmt.Errorf("reload database: %w", err)
}
}
if next.Admin.System == nil || !next.Admin.System.DisableAutoMigrate {
if databaseReady && (next.Admin.System == nil || !next.Admin.System.DisableAutoMigrate) {
if err = migrateAll(candidateDB.WithContext(ctx)); err != nil {
return fmt.Errorf("reload database migrations: %w", err)
}
@@ -305,6 +317,7 @@ func (d *Data) reloadConfig(ctx context.Context) error {
}
d.gormDB.replace(candidateDB, d.enqueueDataScopeAudit)
d.databaseReady.Store(databaseReady)
for _, item := range candidateDBList {
registerDataScopeCallbacks(item, d.enqueueDataScopeAudit)
}