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 }