Add skip hooks support
This commit is contained in:
		
							parent
							
								
									f5c2126c29
								
							
						
					
					
						commit
						f6e1786ca2
					
				| @ -10,7 +10,7 @@ import ( | |||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| func BeforeCreate(db *gorm.DB) { | func BeforeCreate(db *gorm.DB) { | ||||||
| 	if db.Error == nil && db.Statement.Schema != nil && (db.Statement.Schema.BeforeSave || db.Statement.Schema.BeforeCreate) { | 	if db.Error == nil && db.Statement.Schema != nil && !db.Statement.UpdatingColumn && (db.Statement.Schema.BeforeSave || db.Statement.Schema.BeforeCreate) { | ||||||
| 		callMethod(db, func(value interface{}, tx *gorm.DB) (called bool) { | 		callMethod(db, func(value interface{}, tx *gorm.DB) (called bool) { | ||||||
| 			if db.Statement.Schema.BeforeSave { | 			if db.Statement.Schema.BeforeSave { | ||||||
| 				if i, ok := value.(BeforeSaveInterface); ok { | 				if i, ok := value.(BeforeSaveInterface); ok { | ||||||
| @ -203,7 +203,7 @@ func CreateWithReturning(db *gorm.DB) { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func AfterCreate(db *gorm.DB) { | func AfterCreate(db *gorm.DB) { | ||||||
| 	if db.Error == nil && db.Statement.Schema != nil && (db.Statement.Schema.AfterSave || db.Statement.Schema.AfterCreate) { | 	if db.Error == nil && db.Statement.Schema != nil && !db.Statement.UpdatingColumn && (db.Statement.Schema.AfterSave || db.Statement.Schema.AfterCreate) { | ||||||
| 		callMethod(db, func(value interface{}, tx *gorm.DB) (called bool) { | 		callMethod(db, func(value interface{}, tx *gorm.DB) (called bool) { | ||||||
| 			if db.Statement.Schema.AfterSave { | 			if db.Statement.Schema.AfterSave { | ||||||
| 				if i, ok := value.(AfterSaveInterface); ok { | 				if i, ok := value.(AfterSaveInterface); ok { | ||||||
|  | |||||||
							
								
								
									
										11
									
								
								gorm.go
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								gorm.go
									
									
									
									
									
								
							| @ -64,6 +64,7 @@ type Session struct { | |||||||
| 	DryRun                 bool | 	DryRun                 bool | ||||||
| 	PrepareStmt            bool | 	PrepareStmt            bool | ||||||
| 	WithConditions         bool | 	WithConditions         bool | ||||||
|  | 	SkipHooks              bool | ||||||
| 	SkipDefaultTransaction bool | 	SkipDefaultTransaction bool | ||||||
| 	AllowGlobalUpdate      bool | 	AllowGlobalUpdate      bool | ||||||
| 	FullSaveAssociations   bool | 	FullSaveAssociations   bool | ||||||
| @ -169,15 +170,17 @@ func (db *DB) Session(config *Session) *DB { | |||||||
| 		txConfig.FullSaveAssociations = true | 		txConfig.FullSaveAssociations = true | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if config.Context != nil { | 	if config.Context != nil || config.PrepareStmt || config.SkipHooks { | ||||||
| 		tx.Statement = tx.Statement.clone() | 		tx.Statement = tx.Statement.clone() | ||||||
| 		tx.Statement.DB = tx | 		tx.Statement.DB = tx | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if config.Context != nil { | ||||||
| 		tx.Statement.Context = config.Context | 		tx.Statement.Context = config.Context | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if config.PrepareStmt { | 	if config.PrepareStmt { | ||||||
| 		if v, ok := db.cacheStore.Load("preparedStmt"); ok { | 		if v, ok := db.cacheStore.Load("preparedStmt"); ok { | ||||||
| 			tx.Statement = tx.Statement.clone() |  | ||||||
| 			preparedStmt := v.(*PreparedStmtDB) | 			preparedStmt := v.(*PreparedStmtDB) | ||||||
| 			tx.Statement.ConnPool = &PreparedStmtDB{ | 			tx.Statement.ConnPool = &PreparedStmtDB{ | ||||||
| 				ConnPool: db.Config.ConnPool, | 				ConnPool: db.Config.ConnPool, | ||||||
| @ -189,6 +192,10 @@ func (db *DB) Session(config *Session) *DB { | |||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	if config.SkipHooks { | ||||||
|  | 		tx.Statement.UpdatingColumn = true | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	if config.WithConditions { | 	if config.WithConditions { | ||||||
| 		tx.clone = 2 | 		tx.clone = 2 | ||||||
| 	} | 	} | ||||||
|  | |||||||
| @ -371,6 +371,11 @@ func TestSetColumn(t *testing.T) { | |||||||
| 		t.Errorf("invalid data after update, got %+v", product) | 		t.Errorf("invalid data after update, got %+v", product) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	DB.Model(&product).Session(&gorm.Session{SkipHooks: true}).Updates(Product3{Code: "L1216"}) | ||||||
|  | 	if product.Price != 270 || product.Code != "L1216" { | ||||||
|  | 		t.Errorf("invalid data after update, got %+v", product) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	var result2 Product3 | 	var result2 Product3 | ||||||
| 	DB.First(&result2, product.ID) | 	DB.First(&result2, product.ID) | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Jinzhu
						Jinzhu