/
dbop_delete.go
87 lines (75 loc) · 2.34 KB
/
dbop_delete.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
package api
import (
"reflect"
"github.com/go-apibox/utils"
"xorm.io/core"
"xorm.io/xorm"
)
func Delete(c *Context, bean interface{}, params *Params) interface{} {
db, err := getDB(c)
if err != nil {
c.App.Logger.Error("(dbop error): [DBNotExist] %s", err.Error())
return c.Error.New(ErrorInternalError, "DBNotExist").SetMessage("Database not exist.")
}
defer closeDB(c, db)
session := db.NewSession()
defer session.Close()
return SessionDelete(c, session, bean, params)
}
func SessionDelete(c *Context, session *xorm.Session, bean interface{}, params *Params) interface{} {
var modelName string
var modelVal reflect.Value
modelName, isString := bean.(string)
if !isString {
modelVal = reflect.Indirect(reflect.ValueOf(bean))
if modelVal.Kind() != reflect.Struct {
return c.Error.New(ErrorInternalError, "WrongParamType").SetMessage("Expected a pointer to a struct!")
}
modelName = modelVal.Type().Name()
}
// 取出ID字段
modelDefine := c.Model.Get(modelName)
if modelDefine == nil {
return c.Error.New(ErrorInternalError, "ModelNotRegistered").SetMessage("Model " + modelName + " not registered!")
}
if isString {
modelVal = reflect.Indirect(reflect.New(modelDefine.Type))
}
pkFields := modelDefine.TagFields("pk")
if len(pkFields) == 0 {
return c.Error.New(ErrorInternalError, "UnefinedPK").SetMessage("Primary key is undefined!")
}
// 从请求参数中复制值
pk := core.PK{}
for _, pkField := range pkFields {
if v := params.Get(pkField); v == nil {
return c.Error.New(ErrorInternalError, "IncompletePKValue").SetMessage("Primary key value is incomplete!")
} else {
pk = append(pk, v)
}
}
// 检查是否软删除
softDelete := false
fields := modelDefine.TagFields("deletetime")
if len(fields) > 0 {
softDelete = true
for _, field := range fields {
fieldVal := modelVal.FieldByName(field)
fieldVal.Set(reflect.ValueOf(utils.Timestamp()))
}
}
// ID作为条件
var affected int64
var err error
pModel := modelVal.Addr().Interface()
if softDelete {
affected, err = session.ID(pk).Update(pModel)
} else {
affected, err = session.ID(pk).Delete(pModel)
}
if err != nil {
c.App.Logger.Error("(dbop error): [DeleteFailed] %s", err.Error())
return c.Error.New(ErrorInternalError, "DeleteFailed", modelName).SetMessage("Delete failed.")
}
return utils.Combine("Affected", affected)
}