github.com/ydb-platform/ydb-go-sdk/v3@v3.89.2/internal/params/parameters.go (about)

     1  package params
     2  
     3  import (
     4  	"fmt"
     5  	"time"
     6  
     7  	"github.com/google/uuid"
     8  	"github.com/ydb-platform/ydb-go-genproto/protos/Ydb"
     9  
    10  	"github.com/ydb-platform/ydb-go-sdk/v3/internal/allocator"
    11  	"github.com/ydb-platform/ydb-go-sdk/v3/internal/value"
    12  	"github.com/ydb-platform/ydb-go-sdk/v3/internal/xstring"
    13  	"github.com/ydb-platform/ydb-go-sdk/v3/table/types"
    14  )
    15  
    16  type (
    17  	NamedValue interface {
    18  		Name() string
    19  		Value() value.Value
    20  	}
    21  	Parameter struct {
    22  		parent Builder
    23  		name   string
    24  		value  value.Value
    25  	}
    26  	Parameters []*Parameter
    27  )
    28  
    29  func Named(name string, value value.Value) *Parameter {
    30  	return &Parameter{
    31  		name:  name,
    32  		value: value,
    33  	}
    34  }
    35  
    36  func (p *Parameter) Name() string {
    37  	return p.name
    38  }
    39  
    40  func (p *Parameter) Value() value.Value {
    41  	return p.value
    42  }
    43  
    44  func (p *Parameters) String() string {
    45  	buffer := xstring.Buffer()
    46  	defer buffer.Free()
    47  
    48  	buffer.WriteByte('{')
    49  	if p != nil {
    50  		for i, param := range *p {
    51  			if i != 0 {
    52  				buffer.WriteByte(',')
    53  			}
    54  			buffer.WriteByte('"')
    55  			buffer.WriteString(param.name)
    56  			buffer.WriteString("\":")
    57  			buffer.WriteString(param.value.Yql())
    58  		}
    59  	}
    60  	buffer.WriteByte('}')
    61  
    62  	return buffer.String()
    63  }
    64  
    65  func (p *Parameters) ToYDB(a *allocator.Allocator) map[string]*Ydb.TypedValue {
    66  	if p == nil {
    67  		return nil
    68  	}
    69  	parameters := make(map[string]*Ydb.TypedValue, len(*p))
    70  	for _, param := range *p {
    71  		parameters[param.name] = value.ToYDB(param.value, a)
    72  	}
    73  
    74  	return parameters
    75  }
    76  
    77  func (p *Parameters) Each(it func(name string, v value.Value)) {
    78  	if p == nil {
    79  		return
    80  	}
    81  	for _, p := range *p {
    82  		it(p.name, p.value)
    83  	}
    84  }
    85  
    86  func (p *Parameters) Count() int {
    87  	if p == nil {
    88  		return 0
    89  	}
    90  
    91  	return len(*p)
    92  }
    93  
    94  func (p *Parameters) Add(params ...NamedValue) {
    95  	for _, param := range params {
    96  		*p = append(*p, Named(param.Name(), param.Value()))
    97  	}
    98  }
    99  
   100  func (p *Parameter) BeginOptional() *optional {
   101  	return &optional{
   102  		parent: p.parent,
   103  		name:   p.name,
   104  	}
   105  }
   106  
   107  func (p *Parameter) BeginList() *list {
   108  	return &list{
   109  		parent: p.parent,
   110  		name:   p.name,
   111  	}
   112  }
   113  
   114  func (p *Parameter) Pg() pgParam {
   115  	return pgParam{p}
   116  }
   117  
   118  func (p *Parameter) BeginSet() *set {
   119  	return &set{
   120  		parent: p.parent,
   121  		name:   p.name,
   122  	}
   123  }
   124  
   125  func (p *Parameter) BeginDict() *dict {
   126  	return &dict{
   127  		parent: p.parent,
   128  		name:   p.name,
   129  	}
   130  }
   131  
   132  func (p *Parameter) BeginTuple() *tuple {
   133  	return &tuple{
   134  		parent: p.parent,
   135  		name:   p.name,
   136  	}
   137  }
   138  
   139  func (p *Parameter) BeginStruct() *structure {
   140  	return &structure{
   141  		parent: p.parent,
   142  		name:   p.name,
   143  	}
   144  }
   145  
   146  func (p *Parameter) BeginVariant() *variant {
   147  	return &variant{
   148  		parent: p.parent,
   149  		name:   p.name,
   150  	}
   151  }
   152  
   153  func (p *Parameter) Text(v string) Builder {
   154  	p.value = value.TextValue(v)
   155  	p.parent.params = append(p.parent.params, p)
   156  
   157  	return p.parent
   158  }
   159  
   160  func (p *Parameter) Bytes(v []byte) Builder {
   161  	p.value = value.BytesValue(v)
   162  	p.parent.params = append(p.parent.params, p)
   163  
   164  	return p.parent
   165  }
   166  
   167  func (p *Parameter) Bool(v bool) Builder {
   168  	p.value = value.BoolValue(v)
   169  	p.parent.params = append(p.parent.params, p)
   170  
   171  	return p.parent
   172  }
   173  
   174  func (p *Parameter) Uint64(v uint64) Builder {
   175  	p.value = value.Uint64Value(v)
   176  	p.parent.params = append(p.parent.params, p)
   177  
   178  	return p.parent
   179  }
   180  
   181  func (p *Parameter) Int64(v int64) Builder {
   182  	p.value = value.Int64Value(v)
   183  	p.parent.params = append(p.parent.params, p)
   184  
   185  	return p.parent
   186  }
   187  
   188  func (p *Parameter) Uint32(v uint32) Builder {
   189  	p.value = value.Uint32Value(v)
   190  	p.parent.params = append(p.parent.params, p)
   191  
   192  	return p.parent
   193  }
   194  
   195  func (p *Parameter) Int32(v int32) Builder {
   196  	p.value = value.Int32Value(v)
   197  	p.parent.params = append(p.parent.params, p)
   198  
   199  	return p.parent
   200  }
   201  
   202  func (p *Parameter) Uint16(v uint16) Builder {
   203  	p.value = value.Uint16Value(v)
   204  	p.parent.params = append(p.parent.params, p)
   205  
   206  	return p.parent
   207  }
   208  
   209  func (p *Parameter) Int16(v int16) Builder {
   210  	p.value = value.Int16Value(v)
   211  	p.parent.params = append(p.parent.params, p)
   212  
   213  	return p.parent
   214  }
   215  
   216  func (p *Parameter) Uint8(v uint8) Builder {
   217  	p.value = value.Uint8Value(v)
   218  	p.parent.params = append(p.parent.params, p)
   219  
   220  	return p.parent
   221  }
   222  
   223  func (p *Parameter) Int8(v int8) Builder {
   224  	p.value = value.Int8Value(v)
   225  	p.parent.params = append(p.parent.params, p)
   226  
   227  	return p.parent
   228  }
   229  
   230  func (p *Parameter) Float(v float32) Builder {
   231  	p.value = value.FloatValue(v)
   232  	p.parent.params = append(p.parent.params, p)
   233  
   234  	return p.parent
   235  }
   236  
   237  func (p *Parameter) Double(v float64) Builder {
   238  	p.value = value.DoubleValue(v)
   239  	p.parent.params = append(p.parent.params, p)
   240  
   241  	return p.parent
   242  }
   243  
   244  func (p *Parameter) Decimal(v [16]byte, precision, scale uint32) Builder {
   245  	p.value = value.DecimalValue(v, precision, scale)
   246  	p.parent.params = append(p.parent.params, p)
   247  
   248  	return p.parent
   249  }
   250  
   251  func (p *Parameter) Timestamp(v time.Time) Builder {
   252  	p.value = value.TimestampValueFromTime(v)
   253  	p.parent.params = append(p.parent.params, p)
   254  
   255  	return p.parent
   256  }
   257  
   258  func (p *Parameter) Date(v time.Time) Builder {
   259  	p.value = value.DateValueFromTime(v)
   260  	p.parent.params = append(p.parent.params, p)
   261  
   262  	return p.parent
   263  }
   264  
   265  func (p *Parameter) Datetime(v time.Time) Builder {
   266  	p.value = value.DatetimeValueFromTime(v)
   267  	p.parent.params = append(p.parent.params, p)
   268  
   269  	return p.parent
   270  }
   271  
   272  func (p *Parameter) Interval(v time.Duration) Builder {
   273  	p.value = value.IntervalValueFromDuration(v)
   274  	p.parent.params = append(p.parent.params, p)
   275  
   276  	return p.parent
   277  }
   278  
   279  func (p *Parameter) JSON(v string) Builder {
   280  	p.value = value.JSONValue(v)
   281  	p.parent.params = append(p.parent.params, p)
   282  
   283  	return p.parent
   284  }
   285  
   286  func (p *Parameter) JSONDocument(v string) Builder {
   287  	p.value = value.JSONDocumentValue(v)
   288  	p.parent.params = append(p.parent.params, p)
   289  
   290  	return p.parent
   291  }
   292  
   293  func (p *Parameter) YSON(v []byte) Builder {
   294  	p.value = value.YSONValue(v)
   295  	p.parent.params = append(p.parent.params, p)
   296  
   297  	return p.parent
   298  }
   299  
   300  //// removed for https://github.com/ydb-platform/ydb-go-sdk/issues/1501
   301  ////func (p *Parameter) UUID(v [16]byte) Builder {
   302  ////	return p.UUIDWithIssue1501Value(v)
   303  ////}
   304  
   305  // UUIDWithIssue1501Value is field serializer for save data with format bug.
   306  // For any new code use Uuid
   307  // https://github.com/ydb-platform/ydb-go-sdk/issues/1501
   308  func (p *Parameter) UUIDWithIssue1501Value(v [16]byte) Builder {
   309  	p.value = value.UUIDWithIssue1501Value(v)
   310  	p.parent.params = append(p.parent.params, p)
   311  
   312  	return p.parent
   313  }
   314  
   315  func (p *Parameter) Uuid(val uuid.UUID) Builder { //nolint:revive,stylecheck
   316  	p.value = value.Uuid(val)
   317  	p.parent.params = append(p.parent.params, p)
   318  
   319  	return p.parent
   320  }
   321  
   322  func (p *Parameter) Any(v types.Value) Builder {
   323  	p.value = v
   324  	p.parent.params = append(p.parent.params, p)
   325  
   326  	return p.parent
   327  }
   328  
   329  func (p *Parameter) TzDate(v time.Time) Builder {
   330  	p.value = value.TzDateValueFromTime(v)
   331  	p.parent.params = append(p.parent.params, p)
   332  
   333  	return p.parent
   334  }
   335  
   336  func (p *Parameter) TzTimestamp(v time.Time) Builder {
   337  	p.value = value.TzTimestampValueFromTime(v)
   338  	p.parent.params = append(p.parent.params, p)
   339  
   340  	return p.parent
   341  }
   342  
   343  func (p *Parameter) TzDatetime(v time.Time) Builder {
   344  	p.value = value.TzDatetimeValueFromTime(v)
   345  	p.parent.params = append(p.parent.params, p)
   346  
   347  	return p.parent
   348  }
   349  
   350  func Declare(p *Parameter) string {
   351  	return fmt.Sprintf(
   352  		"DECLARE %s AS %s",
   353  		p.name,
   354  		p.value.Type().Yql(),
   355  	)
   356  }