forked from ilibs/gosql
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsql_builder.go
134 lines (115 loc) · 3.39 KB
/
sql_builder.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
121
122
123
124
125
126
127
128
129
130
131
132
133
134
package gosql
import (
"fmt"
"strings"
)
type SQLBuilder struct {
dialect Dialect
fields string
table string
forceIndex string
where string
order string
limit string
offset string
hint string
// Extra args to be substituted in the *where* clause
args []interface{}
}
func (s *SQLBuilder) limitFormat() string {
if s.limit != "" {
return fmt.Sprintf("LIMIT %s", s.limit)
}
return ""
}
func (s *SQLBuilder) offsetFormat() string {
if s.offset != "" {
return fmt.Sprintf("OFFSET %s", s.offset)
}
return ""
}
func (s *SQLBuilder) orderFormat() string {
if s.order != "" {
return fmt.Sprintf("ORDER BY %s", s.order)
}
return ""
}
// queryString Assemble the query statement
func (s *SQLBuilder) queryString() string {
if s.fields == "" {
s.fields = "*"
}
table := s.dialect.Quote(s.table)
if s.forceIndex != "" {
table += fmt.Sprintf(" force index(%s)", s.forceIndex)
}
query := fmt.Sprintf("%sSELECT %s FROM %s %s %s %s %s", s.hint, s.fields, table, s.where, s.orderFormat(), s.limitFormat(), s.offsetFormat())
query = strings.TrimRight(query, " ")
query = query + ";"
return query
}
// countString Assemble the count statement
func (s *SQLBuilder) countString() string {
query := fmt.Sprintf("%sSELECT count(*) FROM %s %s", s.hint, s.dialect.Quote(s.table), s.where)
query = strings.TrimRight(query, " ")
query = query + ";"
return query
}
// insertString Assemble the insert statement
func (s *SQLBuilder) insertString(params map[string]interface{}) string {
var cols, vals []string
for _, k := range sortedParamKeys(params) {
cols = append(cols, s.dialect.Quote(k))
vals = append(vals, s.dialect.Placeholder())
s.args = append(s.args, params[k])
}
return fmt.Sprintf("INSERT INTO %s (%s) VALUES(%s);", s.dialect.Quote(s.table), strings.Join(cols, ","), strings.Join(vals, ","))
}
// updateString Assemble the update statement
func (s *SQLBuilder) updateString(params map[string]interface{}) string {
var updateFields []string
args := make([]interface{}, 0)
for _, k := range sortedParamKeys(params) {
if e, ok := params[k].(*expr); ok {
updateFields = append(updateFields, fmt.Sprintf("%s=%s", s.dialect.Quote(k), e.expr))
args = append(args, e.args...)
} else {
updateFields = append(updateFields, fmt.Sprintf("%s=%s", s.dialect.Quote(k), s.dialect.Placeholder()))
args = append(args, params[k])
}
}
fmt.Println(s.dialect.GetName())
if strings.Compare(s.dialect.GetName(), "postgres") == 0 {
s.args = append(s.args, args...)
} else {
args = append(args, s.args...)
s.args = args
}
query := fmt.Sprintf("UPDATE %s SET %s %s", s.dialect.Quote(s.table), strings.Join(updateFields, ","), s.where)
query = strings.TrimRight(query, " ")
query = query + ";"
return query
}
// deleteString Assemble the delete statement
func (s *SQLBuilder) deleteString() string {
query := fmt.Sprintf("DELETE FROM %s %s", s.dialect.Quote(s.table), s.where)
query = strings.TrimRight(query, " ")
query = query + ";"
return query
}
func (s *SQLBuilder) Where(str string, args ...interface{}) {
if s.where != "" {
s.where = fmt.Sprintf("%s AND (%s)", s.where, str)
} else {
s.where = fmt.Sprintf("WHERE (%s)", str)
}
// NB this assumes that args are only supplied for where clauses
// this may be an incorrect assumption!
if args != nil {
if s.args == nil {
s.args = args
} else {
s.args = append(s.args, args...)
}
}
}