-
Notifications
You must be signed in to change notification settings - Fork 2
/
model.go
120 lines (112 loc) · 2.54 KB
/
model.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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
package gosql
import (
"reflect"
"strings"
)
type model struct {
name string
table string
typ reflect.Type
fields []string
fieldCount int
primaryFieldIndex int
}
func (m *model) getInsertQuery(v reflect.Value) string {
var query strings.Builder
var values strings.Builder
query.WriteString("insert into ")
query.WriteString(m.table)
query.WriteString(" (")
for i := 0; i < m.fieldCount; i++ {
if m.primaryFieldIndex == i && v.Field(i).IsZero() {
if i == m.fieldCount-1 {
query.WriteString(") ")
values.WriteString(")")
}
continue
}
query.WriteString(m.fields[i])
values.WriteString("?")
if i == m.fieldCount-1 {
query.WriteString(") ")
values.WriteString(")")
} else if m.primaryFieldIndex != i+1 || m.primaryFieldIndex != m.fieldCount-1 {
query.WriteString(", ")
values.WriteString(", ")
}
}
query.WriteString("values (")
query.WriteString(values.String())
return query.String()
}
func (m *model) getDeleteQuery() string {
var query strings.Builder
query.WriteString("delete from ")
query.WriteString(m.table)
query.WriteString(" where ")
query.WriteString(m.fields[m.primaryFieldIndex])
query.WriteString(" = ?")
return query.String()
}
func (m *model) getUpdateQuery() string {
var query strings.Builder
query.WriteString("update ")
query.WriteString(m.table)
query.WriteString(" set ")
for i := 0; i < m.fieldCount; i++ {
if m.primaryFieldIndex == i {
continue
}
query.WriteString(m.fields[i])
query.WriteString(" = ?")
if i < m.fieldCount-1 {
query.WriteString(", ")
}
}
query.WriteString(" where ")
query.WriteString(m.fields[m.primaryFieldIndex])
query.WriteString(" = ?")
return query.String()
}
func (m *model) getFieldIndexByName(name string) int {
for i, f := range m.fields {
if name == f || strings.HasSuffix(name, "."+f) {
return i
}
}
return -1
}
func (m *model) getArgs(v reflect.Value) []interface{} {
var args []interface{}
for i := 0; i < m.fieldCount; i++ {
f := v.Field(i)
if m.primaryFieldIndex == i && f.IsZero() {
continue
}
args = append(args, f.Interface())
}
return args
}
func (m *model) getArgsPrimaryLast(v reflect.Value) []interface{} {
args := make([]interface{}, m.fieldCount)
var primArg interface{}
i := 0
for {
if i == m.fieldCount {
break
}
arg := v.Field(i).Interface()
if m.primaryFieldIndex == i {
primArg = arg
} else {
if primArg == nil {
args[i] = arg
} else {
args[i-1] = arg
}
}
i++
}
args[m.fieldCount-1] = primArg
return args
}