-
Notifications
You must be signed in to change notification settings - Fork 0
/
tracker.go
84 lines (71 loc) · 2.1 KB
/
tracker.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
package entity
type (
Tracker interface {
Add(...Mutator)
Mutators() []Mutator
Clear()
}
// Tracking 用于跟踪实体类的状态。
Tracking struct {
// Mutators 用于存储目前正在追踪的实体。
mutators []Mutator
}
)
// Add 用于添加一个实体到追踪器中。
func (t *Tracking) Add(m ...Mutator) {
t.mutators = append(t.mutators, m...)
}
func (t *Tracking) Mutators() []Mutator {
return t.mutators
}
// Clear 用于清空追踪器中的实体。
func (t *Tracking) Clear() {
t.mutators = make([]Mutator, 0)
}
type (
// Mutator 是一个接口,用于标记实体的状态以及根据状态执行操作。
Mutator interface {
// State 获取实体的状态。
State() EntityState
// SetState 设置实体的状态。
SetState(state EntityState)
// Fields 获取改变值的字段。主要是用于更新操作。
Fields() []string
SetFields(fields ...string)
// Exec 根据实体的状态执行操作。
Exec() error
}
Mutation struct {
state EntityState
fields []string
}
)
func NewMutation(state EntityState) *Mutation {
return &Mutation{state: state}
}
func (m *Mutation) SetState(state EntityState) {
m.state = state
}
func (m *Mutation) State() EntityState {
return m.state
}
func (m *Mutation) SetFields(fields ...string) {
m.fields = append(m.fields, fields...)
}
func (m *Mutation) Fields() []string {
return m.fields
}
// 实体类状态,用于标识实体类的状态。
type EntityState = int16
const (
// 未追踪,不存在于数据库中、属性未修改、调用Save()方法时不会执行执行操作。
Detached EntityState = 0
// 未修改,存在于数据库中、属性未修改、调用Save()方法时,不会执行执行操作。
Unchanged EntityState = 1
// 已删除,存在于数据库中、调用Save()方法时,会执行删除操作。
Deleted EntityState = 2
// 已修改,存在于数据库中、属性已修改、调用Save()方法时,会执行更新操作。
Modified EntityState = 3
// 已添加,不存在于数据库中、属性已修改、调用Save()方法时,会执行插入操作。
Added EntityState = 4
)