OSDN Git Service

feat: init cross_tx keepers (#146)
[bytom/vapor.git] / vendor / github.com / jinzhu / gorm / callback_delete.go
1 package gorm
2
3 import (
4         "errors"
5         "fmt"
6 )
7
8 // Define callbacks for deleting
9 func init() {
10         DefaultCallback.Delete().Register("gorm:begin_transaction", beginTransactionCallback)
11         DefaultCallback.Delete().Register("gorm:before_delete", beforeDeleteCallback)
12         DefaultCallback.Delete().Register("gorm:delete", deleteCallback)
13         DefaultCallback.Delete().Register("gorm:after_delete", afterDeleteCallback)
14         DefaultCallback.Delete().Register("gorm:commit_or_rollback_transaction", commitOrRollbackTransactionCallback)
15 }
16
17 // beforeDeleteCallback will invoke `BeforeDelete` method before deleting
18 func beforeDeleteCallback(scope *Scope) {
19         if scope.DB().HasBlockGlobalUpdate() && !scope.hasConditions() {
20                 scope.Err(errors.New("Missing WHERE clause while deleting"))
21                 return
22         }
23         if !scope.HasError() {
24                 scope.CallMethod("BeforeDelete")
25         }
26 }
27
28 // deleteCallback used to delete data from database or set deleted_at to current time (when using with soft delete)
29 func deleteCallback(scope *Scope) {
30         if !scope.HasError() {
31                 var extraOption string
32                 if str, ok := scope.Get("gorm:delete_option"); ok {
33                         extraOption = fmt.Sprint(str)
34                 }
35
36                 deletedAtField, hasDeletedAtField := scope.FieldByName("DeletedAt")
37
38                 if !scope.Search.Unscoped && hasDeletedAtField {
39                         scope.Raw(fmt.Sprintf(
40                                 "UPDATE %v SET %v=%v%v%v",
41                                 scope.QuotedTableName(),
42                                 scope.Quote(deletedAtField.DBName),
43                                 scope.AddToVars(NowFunc()),
44                                 addExtraSpaceIfExist(scope.CombinedConditionSql()),
45                                 addExtraSpaceIfExist(extraOption),
46                         )).Exec()
47                 } else {
48                         scope.Raw(fmt.Sprintf(
49                                 "DELETE FROM %v%v%v",
50                                 scope.QuotedTableName(),
51                                 addExtraSpaceIfExist(scope.CombinedConditionSql()),
52                                 addExtraSpaceIfExist(extraOption),
53                         )).Exec()
54                 }
55         }
56 }
57
58 // afterDeleteCallback will invoke `AfterDelete` method after deleting
59 func afterDeleteCallback(scope *Scope) {
60         if !scope.HasError() {
61                 scope.CallMethod("AfterDelete")
62         }
63 }