|
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