forked from ilibs/gosql
-
Notifications
You must be signed in to change notification settings - Fork 0
/
sql_builder.go
110 lines (94 loc) · 2.72 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
package gosql
import (
"fmt"
"strings"
)
type SQLBuilder struct {
table string
where string
order string
limit string
offset 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 {
query := fmt.Sprintf("SELECT * FROM %s %s %s %s %s", s.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("SELECT count(*) FROM %s %s %s %s", s.table, s.where, s.limitFormat(), s.offsetFormat())
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, fmt.Sprintf("`%s`", k))
vals = append(vals, "?")
s.args = append(s.args, params[k])
}
return fmt.Sprintf("INSERT INTO %s (%s) VALUES(%s);", 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) {
updateFields = append(updateFields, fmt.Sprintf("%s=?", fmt.Sprintf("`%s`", k)))
args = append(args, params[k])
}
args = append(args,s.args...)
s.args = args
query := fmt.Sprintf("UPDATE %s SET %s %s", 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.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...)
}
}
}