@@ -3,6 +3,7 @@ package bind
3
3
import (
4
4
"database/sql"
5
5
"database/sql/driver"
6
+ "encoding/json"
6
7
"errors"
7
8
"fmt"
8
9
"net/url"
@@ -16,6 +17,7 @@ import (
16
17
"github.com/ydb-platform/ydb-go-sdk/v3/internal/types"
17
18
"github.com/ydb-platform/ydb-go-sdk/v3/internal/value"
18
19
"github.com/ydb-platform/ydb-go-sdk/v3/internal/xerrors"
20
+ "github.com/ydb-platform/ydb-go-sdk/v3/internal/xstring"
19
21
)
20
22
21
23
var (
@@ -164,7 +166,7 @@ func toValue(v any) (_ value.Value, err error) {
164
166
if valuer , ok := v .(driver.Valuer ); ok {
165
167
v , err = valuer .Value ()
166
168
if err != nil {
167
- return nil , fmt .Errorf ("ydb: driver.Valuer error: %w" , err )
169
+ return nil , xerrors . WithStackTrace ( fmt .Errorf ("driver.Valuer error: %w" , err ) )
168
170
}
169
171
}
170
172
@@ -255,6 +257,13 @@ func toValue(v any) (_ value.Value, err error) {
255
257
return value .TimestampValueFromTime (x ), nil
256
258
case time.Duration :
257
259
return value .IntervalValueFromDuration (x ), nil
260
+ case json.Marshaler :
261
+ bytes , err := x .MarshalJSON ()
262
+ if err != nil {
263
+ return nil , xerrors .WithStackTrace (err )
264
+ }
265
+
266
+ return value .JSONValue (xstring .FromBytes (bytes )), nil
258
267
default :
259
268
kind := reflect .TypeOf (x ).Kind ()
260
269
switch kind {
@@ -266,7 +275,7 @@ func toValue(v any) (_ value.Value, err error) {
266
275
list [i ], err = toValue (v .Index (i ).Interface ())
267
276
if err != nil {
268
277
return nil , xerrors .WithStackTrace (
269
- fmt .Errorf ("cannot parse %d item of slice %T: %w" ,
278
+ fmt .Errorf ("cannot parse item #%d of slice %T: %w" ,
270
279
i , x , err ,
271
280
),
272
281
)
@@ -307,8 +316,8 @@ func toValue(v any) (_ value.Value, err error) {
307
316
kk , has := v .Type ().Field (i ).Tag .Lookup ("sql" )
308
317
if ! has {
309
318
return nil , xerrors .WithStackTrace (
310
- fmt .Errorf ("cannot parse %q as key field of struct: %w" ,
311
- v .Type ().Field (i ).Name , errUnsupportedType ,
319
+ fmt .Errorf ("cannot parse %q as key field of struct %T : %w" ,
320
+ v .Type ().Field (i ).Name , x , errUnsupportedType ,
312
321
),
313
322
)
314
323
}
@@ -348,15 +357,16 @@ func supportNewTypeLink(x any) string {
348
357
}
349
358
350
359
func toYdbParam (name string , value any ) (* params.Parameter , error ) {
351
- switch tv := value .(type ) {
352
- case driver.NamedValue :
353
- n , v := tv .Name , tv .Value
360
+ if nv , has := value .(driver.NamedValue ); has {
361
+ n , v := nv .Name , nv .Value
354
362
if n != "" {
355
363
name = n
356
364
}
357
365
value = v
358
- case * params.Parameter :
359
- return tv , nil
366
+ }
367
+
368
+ if nv , ok := value .(params.NamedValue ); ok {
369
+ return params .Named (nv .Name (), nv .Value ()), nil
360
370
}
361
371
362
372
v , err := toValue (value )
0 commit comments