80 lines
3.0 KiB
Go
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
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|