You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
83 lines
3.3 KiB
83 lines
3.3 KiB
package callbacks |
|
|
|
import ( |
|
"gorm.io/gorm" |
|
) |
|
|
|
var ( |
|
createClauses = []string{"INSERT", "VALUES", "ON CONFLICT"} |
|
queryClauses = []string{"SELECT", "FROM", "WHERE", "GROUP BY", "ORDER BY", "LIMIT", "FOR"} |
|
updateClauses = []string{"UPDATE", "SET", "WHERE"} |
|
deleteClauses = []string{"DELETE", "FROM", "WHERE"} |
|
) |
|
|
|
type Config struct { |
|
LastInsertIDReversed bool |
|
CreateClauses []string |
|
QueryClauses []string |
|
UpdateClauses []string |
|
DeleteClauses []string |
|
} |
|
|
|
func RegisterDefaultCallbacks(db *gorm.DB, config *Config) { |
|
enableTransaction := func(db *gorm.DB) bool { |
|
return !db.SkipDefaultTransaction |
|
} |
|
|
|
if len(config.CreateClauses) == 0 { |
|
config.CreateClauses = createClauses |
|
} |
|
if len(config.QueryClauses) == 0 { |
|
config.QueryClauses = queryClauses |
|
} |
|
if len(config.DeleteClauses) == 0 { |
|
config.DeleteClauses = deleteClauses |
|
} |
|
if len(config.UpdateClauses) == 0 { |
|
config.UpdateClauses = updateClauses |
|
} |
|
|
|
createCallback := db.Callback().Create() |
|
createCallback.Match(enableTransaction).Register("gorm:begin_transaction", BeginTransaction) |
|
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.Register("gorm:after_create", AfterCreate) |
|
createCallback.Match(enableTransaction).Register("gorm:commit_or_rollback_transaction", CommitOrRollbackTransaction) |
|
createCallback.Clauses = config.CreateClauses |
|
|
|
queryCallback := db.Callback().Query() |
|
queryCallback.Register("gorm:query", Query) |
|
queryCallback.Register("gorm:preload", Preload) |
|
queryCallback.Register("gorm:after_query", AfterQuery) |
|
queryCallback.Clauses = config.QueryClauses |
|
|
|
deleteCallback := db.Callback().Delete() |
|
deleteCallback.Match(enableTransaction).Register("gorm:begin_transaction", BeginTransaction) |
|
deleteCallback.Register("gorm:before_delete", BeforeDelete) |
|
deleteCallback.Register("gorm:delete_before_associations", DeleteBeforeAssociations) |
|
deleteCallback.Register("gorm:delete", Delete(config)) |
|
deleteCallback.Register("gorm:after_delete", AfterDelete) |
|
deleteCallback.Match(enableTransaction).Register("gorm:commit_or_rollback_transaction", CommitOrRollbackTransaction) |
|
deleteCallback.Clauses = config.DeleteClauses |
|
|
|
updateCallback := db.Callback().Update() |
|
updateCallback.Match(enableTransaction).Register("gorm:begin_transaction", BeginTransaction) |
|
updateCallback.Register("gorm:setup_reflect_value", SetupUpdateReflectValue) |
|
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.Register("gorm:after_update", AfterUpdate) |
|
updateCallback.Match(enableTransaction).Register("gorm:commit_or_rollback_transaction", CommitOrRollbackTransaction) |
|
updateCallback.Clauses = config.UpdateClauses |
|
|
|
rowCallback := db.Callback().Row() |
|
rowCallback.Register("gorm:row", RowQuery) |
|
rowCallback.Clauses = config.QueryClauses |
|
|
|
rawCallback := db.Callback().Raw() |
|
rawCallback.Register("gorm:raw", RawExec) |
|
rawCallback.Clauses = config.QueryClauses |
|
}
|
|
|