callmethod.go 846 B

1234567891011121314151617181920212223242526272829303132
  1. package callbacks
  2. import (
  3. "reflect"
  4. "gorm.io/gorm"
  5. )
  6. func callMethod(db *gorm.DB, fc func(value interface{}, tx *gorm.DB) bool) {
  7. tx := db.Session(&gorm.Session{NewDB: true})
  8. if called := fc(db.Statement.ReflectValue.Interface(), tx); !called {
  9. switch db.Statement.ReflectValue.Kind() {
  10. case reflect.Slice, reflect.Array:
  11. db.Statement.CurDestIndex = 0
  12. for i := 0; i < db.Statement.ReflectValue.Len(); i++ {
  13. if value := reflect.Indirect(db.Statement.ReflectValue.Index(i)); value.CanAddr() {
  14. fc(value.Addr().Interface(), tx)
  15. } else {
  16. db.AddError(gorm.ErrInvalidValue)
  17. return
  18. }
  19. db.Statement.CurDestIndex++
  20. }
  21. case reflect.Struct:
  22. if db.Statement.ReflectValue.CanAddr() {
  23. fc(db.Statement.ReflectValue.Addr().Interface(), tx)
  24. } else {
  25. db.AddError(gorm.ErrInvalidValue)
  26. }
  27. }
  28. }
  29. }