forked from c9s/gatsby
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathquery.go
131 lines (108 loc) · 2.75 KB
/
query.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
package gatsby
import "github.com/c9s/gatsby/sqlfragments"
import "github.com/c9s/gatsby/sqlutils"
import "strings"
import "fmt"
const (
MODE_SELECT = iota
MODE_DELETE
MODE_UPDATE
MODE_INSERT
)
type ArgMap map[string]interface{}
type Query struct {
tableName string
holderType int
mode int
selectColumns []string
whereMap *ArgMap
insertMap *ArgMap
updateMap *ArgMap
fragments sqlfragments.SQLFragments
limit int
offset int
arguments []interface{}
}
func NewFragment() *sqlfragments.SQLFragments {
return new(sqlfragments.SQLFragments)
}
func NewQuery(tableName string) *Query {
query := new(Query)
query.tableName = tableName
query.holderType = sqlutils.QMARK_HOLDER
return query
}
func (m *Query) Select(columns ...string) *Query {
m.mode = MODE_SELECT
m.selectColumns = columns
return m
}
func (m *Query) Insert(argMap ArgMap) *Query {
m.mode = MODE_INSERT
m.insertMap = &argMap
return m
}
func (m *Query) Update(argMap ArgMap) *Query {
m.mode = MODE_UPDATE
m.updateMap = &argMap
return m
}
func (m *Query) WhereFromMap(argMap ArgMap) *Query {
m.whereMap = &argMap
return m
}
func (m *Query) Limit(offset, limit int) *Query {
m.offset = offset
m.limit = limit
return m
}
func (m *Query) Args() []interface{} {
return m.arguments
}
func (m *Query) String() string {
// build for select
switch m.mode {
case MODE_SELECT:
var sql string = "SELECT " + strings.Join(m.selectColumns, ", ") + " FROM " + m.tableName
if m.whereMap != nil {
whereSql, args := sqlutils.BuildWhereInnerClause(*m.whereMap, "AND", m.holderType)
sql += " WHERE " + whereSql
m.arguments = append(m.arguments, args...)
}
if m.limit > 0 {
sql += fmt.Sprintf(" LIMIT %d ", m.limit)
}
if m.offset > 0 {
sql += fmt.Sprintf(" OFFSET %d", m.offset)
}
return sql
case MODE_DELETE:
var sql = "DELETE FROM " + m.tableName
if m.whereMap != nil {
whereSql, args := sqlutils.BuildWhereInnerClause(*m.whereMap, "AND", m.holderType)
sql += " WHERE " + whereSql
m.arguments = append(m.arguments, args...)
}
return sql
case MODE_UPDATE:
var sql = "UPDATE " + m.tableName + " SET "
var updateSql, args = sqlutils.BuildUpdateColumnsFromMap(*m.updateMap)
sql += updateSql
m.arguments = append(m.arguments, args...)
if m.whereMap != nil {
whereSql, args := sqlutils.BuildWhereInnerClause(*m.whereMap, "AND", m.holderType)
sql += " WHERE " + whereSql
m.arguments = append(m.arguments, args...)
}
return sql
case MODE_INSERT:
var sql string = "INSERT INTO " + m.tableName
var insertSql, args = sqlutils.BuildInsertColumnsFromMap(*m.insertMap, m.holderType)
sql += " " + insertSql
m.arguments = append(m.arguments, args...)
return sql
default:
panic("Unsupported mode")
}
return ""
}