gorm/callbacks/apaas_callbacks.go
2025-05-28 14:28:49 +08:00

80 lines
3.0 KiB
Go

package callbacks
import (
"fmt"
"reflect"
"gorm.io/gorm"
"gorm.io/gorm/apaas"
)
var dbNameCaller func(*gorm.DB) (string, error)
func SetDBNameCaller(fn func(*gorm.DB) (string, error)) {
dbNameCaller = fn
}
func ExtraCheckerCallBack(stage string) func(db *gorm.DB) {
return func(db *gorm.DB) {
if db.Error == nil && db.Statement.Schema != nil {
if db.Config.DBName == "" {
if dbNameCaller != nil {
db.Config.DBName, _ = dbNameCaller(db)
} else {
db.Config.DBName, _ = db.GetDBName()
}
}
dbName := db.Config.DBName
if dbName == "" {
//db.Error = db.AddError(GenError(fmt.Sprintf("%s ExtraCheckerCallBack(stage=%s) GetDBName nil", MSG_PREFIX, stage)))
return
}
/*
db.Logger.Info(db.Statement.Context, "===schema: %#v\n", db.Statement.Schema.Fields)
for i, s := range db.Statement.Schema.Fields {
db.Logger.Info(db.Statement.Context, "===schema[i=%d]: %#v\n", i, *s)
}
*/
dbCol := apaas.GetDBCol()
if dbCol == nil {
//db.Error = db.AddError(GenError(fmt.Sprintf("%s ExtraCheckerCallBack(stage=%s) GetDBCollection nil ", MSG_PREFIX, stage)))
return
}
dbMeta, ok := dbCol.GetDB(dbName)
if !ok {
//db.Error = db.AddError(GenError(fmt.Sprintf("%s ExtraCheckerCallBack(stage=%s) GetDB(db=%s) nil", dbName, MSG_PREFIX, stage)))
return
}
tableMeta, ok := dbMeta.GetTableByName(db.Statement.Table)
if !ok {
//db.Error = db.AddError(GenError(fmt.Sprintf("%s ExtraCheckerCallBack(stage=%s) GetTable(db=%s,table=%s) GetDB nil", MSG_PREFIX, stage, dbName, db.Statement.Table)))
return
}
db.Logger.Info(db.Statement.Context, "%s ExtraCheckerCallBack(stage=%s) db_name=%s, table=%s", apaas.MSG_PREFIX, stage, dbName, tableMeta.TableName)
val := reflect.ValueOf(db.Statement.Dest)
for _, extraField := range tableMeta.ExtraFields {
db.Logger.Info(db.Statement.Context, "%s ExtraCheckerCallBack(stage=%s) db_name=%s, table=%s, check extra field=%s begin", apaas.MSG_PREFIX, stage, dbName, db.Statement.Table, extraField.Name)
field, ok := db.Statement.Schema.FieldsByDBName[extraField.Name]
if !ok {
db.Error = db.AddError(apaas.GenError(fmt.Sprintf("ExtraCheckerCallBack(stage=%s) Extra Field(db=%s,table=%s,field=%s) not found value in DestValue", stage, dbName, db.Statement.Table, field.DBName)))
return
}
v, _ := field.ValueOf(db.Statement.Context, val)
strV, ok := v.(string)
pStrV, ok1 := v.(*string)
if !ok && !ok1 {
db.Error = db.AddError(apaas.GenError(fmt.Sprintf("ExtraCheckerCallBack(stage=%s) Extra Field(db=%s,table=%s,field=%s) is not string/*string value in DestValue", stage, dbName, db.Statement.Table, field.DBName)))
return
}
if ok1 {
strV = *pStrV
}
if err := extraField.GetApaasMeta().Check(strV); err != nil {
db.Error = db.AddError(apaas.GenError(fmt.Sprintf("ExtraCheckerCallBack(stage=%s) Extra Field(db=%s,table=%s,field=%s) check error=%s", stage, dbName, db.Statement.Table, field.DBName, err.Error())))
return
}
}
}
}
}