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  }