127 lines
4.4 KiB
Go
127 lines
4.4 KiB
Go
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
|
|
WithReturning bool
|
|
CreateClauses []string
|
|
QueryClauses []string
|
|
UpdateClauses []string
|
|
DeleteClauses []string
|
|
}
|
|
|
|
var (
|
|
//transaction callback names
|
|
BeforeTransactionCk = "gorm:begin_transaction"
|
|
CommitOrRollbackCk = "gorm:commit_or_rollback_transaction"
|
|
|
|
// create callback names
|
|
BeforeCreateCk = "gorm:before_create"
|
|
SaveBeforeAssociationsCk = "gorm:save_before_associations"
|
|
CreateCk = "gorm:create"
|
|
SaveAfterAssociationsCk = "gorm:save_after_associations"
|
|
AfterCreateCk = "gorm:after_create"
|
|
|
|
// query callback names
|
|
QueryCk = "gorm:query"
|
|
PreloadCk = "gorm:preload"
|
|
AfterQueryCk = "gorm:after_query"
|
|
|
|
// delete callback names
|
|
BeforeDeleteCk = "gorm:before_delete"
|
|
DeleteBeforeAssociationsCk = "gorm:delete_before_associations"
|
|
DeleteCk = "gorm:delete"
|
|
AfterDeleteCk = "gorm:after_delete"
|
|
|
|
// update callback names
|
|
SetUpReflectValueCk = "gorm:setup_reflect_value"
|
|
BeforeUpdateCk = "gorm:before_update"
|
|
UpdateCk = "gorm:update"
|
|
AfterUpdateCk = "gorm:after_update"
|
|
|
|
// row callback names
|
|
RowCk = "gorm:row"
|
|
|
|
// raw callback names
|
|
RawCk = "gorm:raw"
|
|
|
|
CoreCallbackNames = [...]string{BeforeTransactionCk, CommitOrRollbackCk,
|
|
SaveBeforeAssociationsCk, SaveAfterAssociationsCk,
|
|
CreateCk, QueryCk, PreloadCk,
|
|
DeleteBeforeAssociationsCk, DeleteCk,
|
|
SetUpReflectValueCk, UpdateCk,
|
|
RowCk, RawCk}
|
|
)
|
|
|
|
func RegisterDefaultCallbacks(db *gorm.DB, config *Config) {
|
|
enableTransaction := func(db *gorm.DB) bool {
|
|
return !db.SkipDefaultTransaction
|
|
}
|
|
|
|
createCallback := db.Callback().Create()
|
|
createCallback.Match(enableTransaction).Register(BeforeTransactionCk, BeginTransaction)
|
|
createCallback.Register(BeforeCreateCk, BeforeCreate)
|
|
createCallback.Register(SaveBeforeAssociationsCk, SaveBeforeAssociations(true))
|
|
createCallback.Register(CreateCk, Create(config))
|
|
createCallback.Register(SaveAfterAssociationsCk, SaveAfterAssociations(true))
|
|
createCallback.Register(AfterCreateCk, AfterCreate)
|
|
createCallback.Match(enableTransaction).Register(CommitOrRollbackCk, CommitOrRollbackTransaction)
|
|
if len(config.CreateClauses) == 0 {
|
|
config.CreateClauses = createClauses
|
|
}
|
|
createCallback.Clauses = config.CreateClauses
|
|
|
|
queryCallback := db.Callback().Query()
|
|
queryCallback.Register(QueryCk, Query)
|
|
queryCallback.Register(PreloadCk, Preload)
|
|
queryCallback.Register(AfterQueryCk, AfterQuery)
|
|
if len(config.QueryClauses) == 0 {
|
|
config.QueryClauses = queryClauses
|
|
}
|
|
queryCallback.Clauses = config.QueryClauses
|
|
|
|
deleteCallback := db.Callback().Delete()
|
|
deleteCallback.Match(enableTransaction).Register(BeforeTransactionCk, BeginTransaction)
|
|
deleteCallback.Register(BeforeDeleteCk, BeforeDelete)
|
|
deleteCallback.Register(DeleteBeforeAssociationsCk, DeleteBeforeAssociations)
|
|
deleteCallback.Register(DeleteCk, Delete)
|
|
deleteCallback.Register(AfterDeleteCk, AfterDelete)
|
|
deleteCallback.Match(enableTransaction).Register(CommitOrRollbackCk, CommitOrRollbackTransaction)
|
|
if len(config.DeleteClauses) == 0 {
|
|
config.DeleteClauses = deleteClauses
|
|
}
|
|
deleteCallback.Clauses = config.DeleteClauses
|
|
|
|
updateCallback := db.Callback().Update()
|
|
updateCallback.Match(enableTransaction).Register(BeforeTransactionCk, BeginTransaction)
|
|
updateCallback.Register(SetUpReflectValueCk, SetupUpdateReflectValue)
|
|
updateCallback.Register(BeforeUpdateCk, BeforeUpdate)
|
|
updateCallback.Register(SaveBeforeAssociationsCk, SaveBeforeAssociations(false))
|
|
updateCallback.Register(UpdateCk, Update)
|
|
updateCallback.Register(SaveAfterAssociationsCk, SaveAfterAssociations(false))
|
|
updateCallback.Register(AfterUpdateCk, AfterUpdate)
|
|
updateCallback.Match(enableTransaction).Register(CommitOrRollbackCk, CommitOrRollbackTransaction)
|
|
if len(config.UpdateClauses) == 0 {
|
|
config.UpdateClauses = updateClauses
|
|
}
|
|
updateCallback.Clauses = config.UpdateClauses
|
|
|
|
rowCallback := db.Callback().Row()
|
|
rowCallback.Register(RowCk, RowQuery)
|
|
rowCallback.Clauses = config.QueryClauses
|
|
|
|
rawCallback := db.Callback().Raw()
|
|
rawCallback.Register(RawCk, RawExec)
|
|
rawCallback.Clauses = config.QueryClauses
|
|
}
|