...
1 package goqu
2
3 import (
4 "github.com/doug-martin/goqu/v9/exec"
5 "github.com/doug-martin/goqu/v9/exp"
6 "github.com/doug-martin/goqu/v9/internal/errors"
7 "github.com/doug-martin/goqu/v9/internal/sb"
8 )
9
10 type UpdateDataset struct {
11 dialect SQLDialect
12 clauses exp.UpdateClauses
13 isPrepared prepared
14 queryFactory exec.QueryFactory
15 err error
16 }
17
18 var ErrUnsupportedUpdateTableType = errors.New("unsupported table type, a string or identifier expression is required")
19
20
21 func newUpdateDataset(d string, queryFactory exec.QueryFactory) *UpdateDataset {
22 return &UpdateDataset{
23 clauses: exp.NewUpdateClauses(),
24 dialect: GetDialect(d),
25 queryFactory: queryFactory,
26 }
27 }
28
29 func Update(table interface{}) *UpdateDataset {
30 return newUpdateDataset("default", nil).Table(table)
31 }
32
33
34
35
36 func (ud *UpdateDataset) Prepared(prepared bool) *UpdateDataset {
37 ret := ud.copy(ud.clauses)
38 ret.isPrepared = preparedFromBool(prepared)
39 return ret
40 }
41
42 func (ud *UpdateDataset) IsPrepared() bool {
43 return ud.isPrepared.Bool()
44 }
45
46
47 func (ud *UpdateDataset) WithDialect(dl string) *UpdateDataset {
48 ds := ud.copy(ud.GetClauses())
49 ds.dialect = GetDialect(dl)
50 return ds
51 }
52
53
54 func (ud *UpdateDataset) Dialect() SQLDialect {
55 return ud.dialect
56 }
57
58
59 func (ud *UpdateDataset) SetDialect(dialect SQLDialect) *UpdateDataset {
60 cd := ud.copy(ud.GetClauses())
61 cd.dialect = dialect
62 return cd
63 }
64
65 func (ud *UpdateDataset) Expression() exp.Expression {
66 return ud
67 }
68
69
70 func (ud *UpdateDataset) Clone() exp.Expression {
71 return ud.copy(ud.clauses)
72 }
73
74
75 func (ud *UpdateDataset) GetClauses() exp.UpdateClauses {
76 return ud.clauses
77 }
78
79
80 func (ud *UpdateDataset) copy(clauses exp.UpdateClauses) *UpdateDataset {
81 return &UpdateDataset{
82 dialect: ud.dialect,
83 clauses: clauses,
84 isPrepared: ud.isPrepared,
85 queryFactory: ud.queryFactory,
86 err: ud.err,
87 }
88 }
89
90
91
92
93
94
95
96 func (ud *UpdateDataset) With(name string, subquery exp.Expression) *UpdateDataset {
97 return ud.copy(ud.clauses.CommonTablesAppend(exp.NewCommonTableExpression(false, name, subquery)))
98 }
99
100
101
102
103
104
105
106
107
108 func (ud *UpdateDataset) WithRecursive(name string, subquery exp.Expression) *UpdateDataset {
109 return ud.copy(ud.clauses.CommonTablesAppend(exp.NewCommonTableExpression(true, name, subquery)))
110 }
111
112
113 func (ud *UpdateDataset) Table(table interface{}) *UpdateDataset {
114 switch t := table.(type) {
115 case exp.Expression:
116 return ud.copy(ud.clauses.SetTable(t))
117 case string:
118 return ud.copy(ud.clauses.SetTable(exp.ParseIdentifier(t)))
119 default:
120 panic(ErrUnsupportedUpdateTableType)
121 }
122 }
123
124
125 func (ud *UpdateDataset) Set(values interface{}) *UpdateDataset {
126 return ud.copy(ud.clauses.SetSetValues(values))
127 }
128
129
130 func (ud *UpdateDataset) From(tables ...interface{}) *UpdateDataset {
131 return ud.copy(ud.clauses.SetFrom(exp.NewColumnListExpression(tables...)))
132 }
133
134
135 func (ud *UpdateDataset) Where(expressions ...exp.Expression) *UpdateDataset {
136 return ud.copy(ud.clauses.WhereAppend(expressions...))
137 }
138
139
140 func (ud *UpdateDataset) ClearWhere() *UpdateDataset {
141 return ud.copy(ud.clauses.ClearWhere())
142 }
143
144
145 func (ud *UpdateDataset) Order(order ...exp.OrderedExpression) *UpdateDataset {
146 return ud.copy(ud.clauses.SetOrder(order...))
147 }
148
149
150
151 func (ud *UpdateDataset) OrderAppend(order ...exp.OrderedExpression) *UpdateDataset {
152 return ud.copy(ud.clauses.OrderAppend(order...))
153 }
154
155
156
157 func (ud *UpdateDataset) OrderPrepend(order ...exp.OrderedExpression) *UpdateDataset {
158 return ud.copy(ud.clauses.OrderPrepend(order...))
159 }
160
161
162 func (ud *UpdateDataset) ClearOrder() *UpdateDataset {
163 return ud.copy(ud.clauses.ClearOrder())
164 }
165
166
167 func (ud *UpdateDataset) Limit(limit uint) *UpdateDataset {
168 if limit > 0 {
169 return ud.copy(ud.clauses.SetLimit(limit))
170 }
171 return ud.copy(ud.clauses.ClearLimit())
172 }
173
174
175 func (ud *UpdateDataset) LimitAll() *UpdateDataset {
176 return ud.copy(ud.clauses.SetLimit(L("ALL")))
177 }
178
179
180 func (ud *UpdateDataset) ClearLimit() *UpdateDataset {
181 return ud.copy(ud.clauses.ClearLimit())
182 }
183
184
185 func (ud *UpdateDataset) Returning(returning ...interface{}) *UpdateDataset {
186 return ud.copy(ud.clauses.SetReturning(exp.NewColumnListExpression(returning...)))
187 }
188
189
190 func (ud *UpdateDataset) Error() error {
191 return ud.err
192 }
193
194
195
196
197 func (ud *UpdateDataset) SetError(err error) *UpdateDataset {
198 if ud.err == nil {
199 ud.err = err
200 }
201
202 return ud
203 }
204
205
206
207
208
209
210 func (ud *UpdateDataset) ToSQL() (sql string, params []interface{}, err error) {
211 return ud.updateSQLBuilder().ToSQL()
212 }
213
214
215
216 func (ud *UpdateDataset) AppendSQL(b sb.SQLBuilder) {
217 if ud.err != nil {
218 b.SetError(ud.err)
219 return
220 }
221 ud.dialect.ToUpdateSQL(b, ud.GetClauses())
222 }
223
224 func (ud *UpdateDataset) GetAs() exp.IdentifierExpression {
225 return nil
226 }
227
228 func (ud *UpdateDataset) ReturnsColumns() bool {
229 return ud.clauses.HasReturning()
230 }
231
232
233
234 func (ud *UpdateDataset) Executor() exec.QueryExecutor {
235 return ud.queryFactory.FromSQLBuilder(ud.updateSQLBuilder())
236 }
237
238 func (ud *UpdateDataset) updateSQLBuilder() sb.SQLBuilder {
239 buf := sb.NewSQLBuilder(ud.isPrepared.Bool())
240 if ud.err != nil {
241 return buf.SetError(ud.err)
242 }
243 ud.dialect.ToUpdateSQL(buf, ud.clauses)
244 return buf
245 }
246
View as plain text