github.com/ydb-platform/ydb-go-sdk/v3@v3.89.2/sugar/params.go (about) 1 package sugar 2 3 import ( 4 "database/sql" 5 "fmt" 6 "sort" 7 8 "github.com/ydb-platform/ydb-go-sdk/v3/internal/bind" 9 "github.com/ydb-platform/ydb-go-sdk/v3/internal/params" 10 "github.com/ydb-platform/ydb-go-sdk/v3/internal/xerrors" 11 "github.com/ydb-platform/ydb-go-sdk/v3/internal/xstring" 12 "github.com/ydb-platform/ydb-go-sdk/v3/table" 13 ) 14 15 type constraint interface { 16 params.Parameters | []*params.Parameter | *table.QueryParameters | []table.ParameterOption | []sql.NamedArg 17 } 18 19 // GenerateDeclareSection generates DECLARE section text in YQL query by params 20 // 21 // Deprecated: use testutil.QueryBind(ydb.WithAutoDeclare()) helper. 22 // In YDB since version 24.1 declare sections not requires. 23 // Will be removed after Oct 2024. 24 // Read about versioning policy: https://github.com/ydb-platform/ydb-go-sdk/blob/master/VERSIONING.md#deprecated 25 func GenerateDeclareSection[T constraint](parameters T) (string, error) { 26 switch v := any(parameters).(type) { 27 case *params.Parameters: 28 return parametersToDeclares(*v), nil 29 case []*params.Parameter: 30 return parametersToDeclares(v), nil 31 case []table.ParameterOption: 32 return parameterOptionsToDeclares(v), nil 33 case []sql.NamedArg: 34 return namedArgsToDeclares(v) 35 default: 36 return "", xerrors.WithStackTrace(fmt.Errorf("unsupported type: %T", v)) 37 } 38 } 39 40 // ToYdbParam converts 41 // 42 // Internals: https://github.com/ydb-platform/ydb-go-sdk/blob/master/VERSIONING.md#internals 43 func ToYdbParam(param sql.NamedArg) (*params.Parameter, error) { 44 params, err := bind.Params(param) 45 if err != nil { 46 return nil, xerrors.WithStackTrace(err) 47 } 48 if len(params) != 1 { 49 return nil, xerrors.WithStackTrace(fmt.Errorf("internal error: wrong parameters count: %v", params)) 50 } 51 52 return params[0], nil 53 } 54 55 func parametersToDeclares(v []*params.Parameter) string { 56 var ( 57 buf = xstring.Buffer() 58 names = make([]string, 0, len(v)) 59 declares = make(map[string]string, len(v)) 60 ) 61 defer buf.Free() 62 63 for _, p := range v { 64 name := p.Name() 65 names = append(names, name) 66 declares[name] = params.Declare(p) 67 } 68 69 sort.Strings(names) 70 71 for _, name := range names { 72 buf.WriteString(declares[name]) 73 buf.WriteString(";\n") 74 } 75 76 return buf.String() 77 } 78 79 func parameterOptionsToDeclares(v []table.ParameterOption) string { 80 parameters := make([]*params.Parameter, len(v)) 81 for i, p := range v { 82 parameters[i] = params.Named(p.Name(), p.Value()) 83 } 84 85 return parametersToDeclares(parameters) 86 } 87 88 func namedArgsToDeclares(v []sql.NamedArg) (string, error) { 89 vv, err := bind.Params(func() (newArgs []interface{}) { 90 for i := range v { 91 newArgs = append(newArgs, v[i]) 92 } 93 94 return newArgs 95 }()...) 96 if err != nil { 97 return "", xerrors.WithStackTrace(err) 98 } 99 100 return parametersToDeclares(vv), nil 101 }