1
// Copyright 2016 The Xorm Authors. All rights reserved.
2
// Use of this source code is governed by a BSD-style
3
// license that can be found in the LICENSE file.
10
condType optype = iota // only conditions
23
// Builder describes a SQL statement
34
// Select creates a select Builder
35
func Select(cols ...string) *Builder {
36
builder := &Builder{cond: NewCond()}
37
return builder.Select(cols...)
40
// Insert creates an insert Builder
41
func Insert(eq Eq) *Builder {
42
builder := &Builder{cond: NewCond()}
43
return builder.Insert(eq)
46
// Update creates an update Builder
47
func Update(updates ...Eq) *Builder {
48
builder := &Builder{cond: NewCond()}
49
return builder.Update(updates...)
52
// Delete creates a delete Builder
53
func Delete(conds ...Cond) *Builder {
54
builder := &Builder{cond: NewCond()}
55
return builder.Delete(conds...)
58
// Where sets where SQL
59
func (b *Builder) Where(cond Cond) *Builder {
60
b.cond = b.cond.And(cond)
64
// From sets the table name
65
func (b *Builder) From(tableName string) *Builder {
66
b.tableName = tableName
70
// Into sets insert table name
71
func (b *Builder) Into(tableName string) *Builder {
72
b.tableName = tableName
76
// Join sets join table and contions
77
func (b *Builder) Join(joinType, joinTable string, joinCond interface{}) *Builder {
78
switch joinCond.(type) {
80
b.joins = append(b.joins, join{joinType, joinTable, joinCond.(Cond)})
82
b.joins = append(b.joins, join{joinType, joinTable, Expr(joinCond.(string))})
88
// InnerJoin sets inner join
89
func (b *Builder) InnerJoin(joinTable string, joinCond interface{}) *Builder {
90
return b.Join("INNER", joinTable, joinCond)
93
// LeftJoin sets left join SQL
94
func (b *Builder) LeftJoin(joinTable string, joinCond interface{}) *Builder {
95
return b.Join("LEFT", joinTable, joinCond)
98
// RightJoin sets right join SQL
99
func (b *Builder) RightJoin(joinTable string, joinCond interface{}) *Builder {
100
return b.Join("RIGHT", joinTable, joinCond)
103
// CrossJoin sets cross join SQL
104
func (b *Builder) CrossJoin(joinTable string, joinCond interface{}) *Builder {
105
return b.Join("CROSS", joinTable, joinCond)
108
// FullJoin sets full join SQL
109
func (b *Builder) FullJoin(joinTable string, joinCond interface{}) *Builder {
110
return b.Join("FULL", joinTable, joinCond)
113
// Select sets select SQL
114
func (b *Builder) Select(cols ...string) *Builder {
116
b.optype = selectType
120
// And sets AND condition
121
func (b *Builder) And(cond Cond) *Builder {
122
b.cond = And(b.cond, cond)
126
// Or sets OR condition
127
func (b *Builder) Or(cond Cond) *Builder {
128
b.cond = Or(b.cond, cond)
132
// Insert sets insert SQL
133
func (b *Builder) Insert(eq Eq) *Builder {
135
b.optype = insertType
139
// Update sets update SQL
140
func (b *Builder) Update(updates ...Eq) *Builder {
142
b.optype = updateType
146
// Delete sets delete SQL
147
func (b *Builder) Delete(conds ...Cond) *Builder {
148
b.cond = b.cond.And(conds...)
149
b.optype = deleteType
153
// WriteTo implements Writer interface
154
func (b *Builder) WriteTo(w Writer) error {
157
return b.cond.WriteTo(w)
159
return b.selectWriteTo(w)
161
return b.insertWriteTo(w)
163
return b.updateWriteTo(w)
165
return b.deleteWriteTo(w)
168
return ErrNotSupportType
171
// ToSQL convert a builder to SQL and args
172
func (b *Builder) ToSQL() (string, []interface{}, error) {
174
if err := b.WriteTo(w); err != nil {
178
return w.writer.String(), w.args, nil
181
// ToSQL convert a builder or condtions to SQL and args
182
func ToSQL(cond interface{}) (string, []interface{}, error) {
185
return condToSQL(cond.(Cond))
187
return cond.(*Builder).ToSQL()
189
return "", nil, ErrNotSupportType