|
21 | 21 | errMultipleQueryParameters = errors.New("only one query arg *table.QueryParameters allowed")
|
22 | 22 | )
|
23 | 23 |
|
24 |
| -//nolint:gocyclo |
| 24 | +//nolint:gocyclo,funlen |
25 | 25 | func toValue(v interface{}) (_ types.Value, err error) {
|
26 | 26 | if valuer, ok := v.(driver.Valuer); ok {
|
27 | 27 | v, err = valuer.Value()
|
@@ -174,62 +174,70 @@ func toYdbParam(name string, value interface{}) (*params.Parameter, error) {
|
174 | 174 | return params.Named(name, v), nil
|
175 | 175 | }
|
176 | 176 |
|
177 |
| -func Params(args ...interface{}) (parameters []*params.Parameter, _ error) { |
178 |
| - parameters = make([]*params.Parameter, 0, len(args)) |
| 177 | +func Params(args ...interface{}) ([]*params.Parameter, error) { |
| 178 | + parameters := make([]*params.Parameter, 0, len(args)) |
179 | 179 | for i, arg := range args {
|
| 180 | + var newParam *params.Parameter |
| 181 | + var newParams []*params.Parameter |
| 182 | + var err error |
180 | 183 | switch x := arg.(type) {
|
181 | 184 | case driver.NamedValue:
|
182 |
| - if x.Name == "" { |
183 |
| - switch xx := x.Value.(type) { |
184 |
| - case *params.Parameters: |
185 |
| - if len(args) > 1 { |
186 |
| - return nil, xerrors.WithStackTrace(errMultipleQueryParameters) |
187 |
| - } |
188 |
| - parameters = *xx |
189 |
| - case *params.Parameter: |
190 |
| - parameters = append(parameters, xx) |
191 |
| - default: |
192 |
| - x.Name = fmt.Sprintf("$p%d", i) |
193 |
| - param, err := toYdbParam(x.Name, x.Value) |
194 |
| - if err != nil { |
195 |
| - return nil, xerrors.WithStackTrace(err) |
196 |
| - } |
197 |
| - parameters = append(parameters, param) |
198 |
| - } |
199 |
| - } else { |
200 |
| - param, err := toYdbParam(x.Name, x.Value) |
201 |
| - if err != nil { |
202 |
| - return nil, xerrors.WithStackTrace(err) |
203 |
| - } |
204 |
| - parameters = append(parameters, param) |
205 |
| - } |
| 185 | + newParams, err = paramHandleNamedValue(x, i, len(args)) |
206 | 186 | case sql.NamedArg:
|
207 | 187 | if x.Name == "" {
|
208 | 188 | return nil, xerrors.WithStackTrace(errUnnamedParam)
|
209 | 189 | }
|
210 |
| - param, err := toYdbParam(x.Name, x.Value) |
211 |
| - if err != nil { |
212 |
| - return nil, xerrors.WithStackTrace(err) |
213 |
| - } |
214 |
| - parameters = append(parameters, param) |
| 190 | + newParam, err = toYdbParam(x.Name, x.Value) |
| 191 | + newParams = append(newParams, newParam) |
215 | 192 | case *params.Parameters:
|
216 | 193 | if len(args) > 1 {
|
217 | 194 | return nil, xerrors.WithStackTrace(errMultipleQueryParameters)
|
218 | 195 | }
|
219 | 196 | parameters = *x
|
220 | 197 | case *params.Parameter:
|
221 |
| - parameters = append(parameters, x) |
| 198 | + newParams = append(newParams, x) |
222 | 199 | default:
|
223 |
| - param, err := toYdbParam(fmt.Sprintf("$p%d", i), x) |
224 |
| - if err != nil { |
225 |
| - return nil, xerrors.WithStackTrace(err) |
226 |
| - } |
227 |
| - parameters = append(parameters, param) |
| 200 | + newParam, err = toYdbParam(fmt.Sprintf("$p%d", i), x) |
| 201 | + newParams = append(newParams, newParam) |
| 202 | + } |
| 203 | + if err != nil { |
| 204 | + return nil, xerrors.WithStackTrace(err) |
228 | 205 | }
|
| 206 | + parameters = append(parameters, newParams...) |
229 | 207 | }
|
230 | 208 | sort.Slice(parameters, func(i, j int) bool {
|
231 | 209 | return parameters[i].Name() < parameters[j].Name()
|
232 | 210 | })
|
233 | 211 |
|
234 | 212 | return parameters, nil
|
235 | 213 | }
|
| 214 | + |
| 215 | +func paramHandleNamedValue(arg driver.NamedValue, paramNumber, argsLen int) ([]*params.Parameter, error) { |
| 216 | + if arg.Name == "" { |
| 217 | + switch x := arg.Value.(type) { |
| 218 | + case *params.Parameters: |
| 219 | + if argsLen > 1 { |
| 220 | + return nil, xerrors.WithStackTrace(errMultipleQueryParameters) |
| 221 | + } |
| 222 | + |
| 223 | + return *x, nil |
| 224 | + case *params.Parameter: |
| 225 | + return []*params.Parameter{x}, nil |
| 226 | + default: |
| 227 | + arg.Name = fmt.Sprintf("$p%d", paramNumber) |
| 228 | + param, err := toYdbParam(arg.Name, arg.Value) |
| 229 | + if err != nil { |
| 230 | + return nil, xerrors.WithStackTrace(err) |
| 231 | + } |
| 232 | + |
| 233 | + return []*params.Parameter{param}, nil |
| 234 | + } |
| 235 | + } else { |
| 236 | + param, err := toYdbParam(arg.Name, arg.Value) |
| 237 | + if err != nil { |
| 238 | + return nil, xerrors.WithStackTrace(err) |
| 239 | + } |
| 240 | + |
| 241 | + return []*params.Parameter{param}, nil |
| 242 | + } |
| 243 | +} |
0 commit comments