From 5d0bc6e3099b86d93938b8006ad3dbb4e31de36d Mon Sep 17 00:00:00 2001 From: leiyuqing Date: Sun, 27 Mar 2022 20:52:56 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20db.Statement.ReflectValue=E4=B8=8D?= =?UTF-8?q?=E6=98=AF=E6=8C=87=E9=92=88=E5=9E=8B=E7=9A=84=E6=97=B6=E5=80=99?= =?UTF-8?q?AfterCreate,=20BeforeUpdate,=20AfterUpdate=E4=BC=9Apanic?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- callbacks/callbacks.go | 12 ++++-------- callbacks/create.go | 7 +++++++ callbacks/update.go | 8 ++++++++ 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/callbacks/callbacks.go b/callbacks/callbacks.go index e72f561e..d681aef3 100644 --- a/callbacks/callbacks.go +++ b/callbacks/callbacks.go @@ -24,10 +24,6 @@ func RegisterDefaultCallbacks(db *gorm.DB, config *Config) { return !db.SkipDefaultTransaction } - canAddr := func(db *gorm.DB) bool { - return db.Statement.ReflectValue.CanAddr() - } - if len(config.CreateClauses) == 0 { config.CreateClauses = createClauses } @@ -43,11 +39,11 @@ func RegisterDefaultCallbacks(db *gorm.DB, config *Config) { createCallback := db.Callback().Create() createCallback.Match(enableTransaction).Register("gorm:begin_transaction", BeginTransaction) - createCallback.Match(canAddr).Register("gorm:before_create", BeforeCreate) + createCallback.Register("gorm:before_create", BeforeCreate) createCallback.Register("gorm:save_before_associations", SaveBeforeAssociations(true)) createCallback.Register("gorm:create", Create(config)) createCallback.Register("gorm:save_after_associations", SaveAfterAssociations(true)) - createCallback.Match(canAddr).Register("gorm:after_create", AfterCreate) + createCallback.Register("gorm:after_create", AfterCreate) createCallback.Match(enableTransaction).Register("gorm:commit_or_rollback_transaction", CommitOrRollbackTransaction) createCallback.Clauses = config.CreateClauses @@ -69,11 +65,11 @@ func RegisterDefaultCallbacks(db *gorm.DB, config *Config) { updateCallback := db.Callback().Update() updateCallback.Match(enableTransaction).Register("gorm:begin_transaction", BeginTransaction) updateCallback.Register("gorm:setup_reflect_value", SetupUpdateReflectValue) - updateCallback.Match(canAddr).Register("gorm:before_update", BeforeUpdate) + updateCallback.Register("gorm:before_update", BeforeUpdate) updateCallback.Register("gorm:save_before_associations", SaveBeforeAssociations(false)) updateCallback.Register("gorm:update", Update(config)) updateCallback.Register("gorm:save_after_associations", SaveAfterAssociations(false)) - updateCallback.Match(canAddr).Register("gorm:after_update", AfterUpdate) + updateCallback.Register("gorm:after_update", AfterUpdate) updateCallback.Match(enableTransaction).Register("gorm:commit_or_rollback_transaction", CommitOrRollbackTransaction) updateCallback.Clauses = config.UpdateClauses diff --git a/callbacks/create.go b/callbacks/create.go index e94b7eca..a64a1665 100644 --- a/callbacks/create.go +++ b/callbacks/create.go @@ -12,6 +12,9 @@ import ( // BeforeCreate before create hooks func BeforeCreate(db *gorm.DB) { + if !db.Statement.ReflectValue.CanAddr() { + return + } if db.Error == nil && db.Statement.Schema != nil && !db.Statement.SkipHooks && (db.Statement.Schema.BeforeSave || db.Statement.Schema.BeforeCreate) { callMethod(db, func(value interface{}, tx *gorm.DB) (called bool) { if db.Statement.Schema.BeforeSave { @@ -150,6 +153,10 @@ func Create(config *Config) func(db *gorm.DB) { // AfterCreate after create hooks func AfterCreate(db *gorm.DB) { + if !db.Statement.ReflectValue.CanAddr() { + return + } + if db.Error == nil && db.Statement.Schema != nil && !db.Statement.SkipHooks && (db.Statement.Schema.AfterSave || db.Statement.Schema.AfterCreate) { callMethod(db, func(value interface{}, tx *gorm.DB) (called bool) { if db.Statement.Schema.AfterCreate { diff --git a/callbacks/update.go b/callbacks/update.go index 01f40509..895ebd4a 100644 --- a/callbacks/update.go +++ b/callbacks/update.go @@ -31,6 +31,10 @@ func SetupUpdateReflectValue(db *gorm.DB) { // BeforeUpdate before update hooks func BeforeUpdate(db *gorm.DB) { + if !db.Statement.ReflectValue.CanAddr() { + return + } + if db.Error == nil && db.Statement.Schema != nil && !db.Statement.SkipHooks && (db.Statement.Schema.BeforeSave || db.Statement.Schema.BeforeUpdate) { callMethod(db, func(value interface{}, tx *gorm.DB) (called bool) { if db.Statement.Schema.BeforeSave { @@ -103,6 +107,10 @@ func Update(config *Config) func(db *gorm.DB) { // AfterUpdate after update hooks func AfterUpdate(db *gorm.DB) { + if !db.Statement.ReflectValue.CanAddr() { + return + } + if db.Error == nil && db.Statement.Schema != nil && !db.Statement.SkipHooks && (db.Statement.Schema.AfterSave || db.Statement.Schema.AfterUpdate) { callMethod(db, func(value interface{}, tx *gorm.DB) (called bool) { if db.Statement.Schema.AfterUpdate {