github.com/ydb-platform/ydb-go-sdk/v3@v3.57.0/internal/params/parameters.go (about) 1 package params 2 3 import ( 4 "fmt" 5 "time" 6 7 "github.com/ydb-platform/ydb-go-genproto/protos/Ydb" 8 9 "github.com/ydb-platform/ydb-go-sdk/v3/internal/allocator" 10 "github.com/ydb-platform/ydb-go-sdk/v3/internal/value" 11 "github.com/ydb-platform/ydb-go-sdk/v3/internal/xstring" 12 ) 13 14 type ( 15 NamedValue interface { 16 Name() string 17 Value() value.Value 18 } 19 Parameter struct { 20 parent Builder 21 name string 22 value value.Value 23 } 24 Parameters []*Parameter 25 ) 26 27 func Named(name string, value value.Value) *Parameter { 28 return &Parameter{ 29 name: name, 30 value: value, 31 } 32 } 33 34 func (p *Parameter) Name() string { 35 return p.name 36 } 37 38 func (p *Parameter) Value() value.Value { 39 return p.value 40 } 41 42 func (p *Parameters) String() string { 43 buffer := xstring.Buffer() 44 defer buffer.Free() 45 46 buffer.WriteByte('{') 47 if p != nil { 48 for i, param := range *p { 49 if i != 0 { 50 buffer.WriteByte(',') 51 } 52 buffer.WriteByte('"') 53 buffer.WriteString(param.name) 54 buffer.WriteString("\":") 55 buffer.WriteString(param.value.Yql()) 56 } 57 } 58 buffer.WriteByte('}') 59 60 return buffer.String() 61 } 62 63 func (p *Parameters) ToYDB(a *allocator.Allocator) map[string]*Ydb.TypedValue { 64 if p == nil { 65 return nil 66 } 67 parameters := make(map[string]*Ydb.TypedValue, len(*p)) 68 for _, param := range *p { 69 parameters[param.name] = value.ToYDB(param.value, a) 70 } 71 72 return parameters 73 } 74 75 func (p *Parameters) Each(it func(name string, v value.Value)) { 76 if p == nil { 77 return 78 } 79 for _, p := range *p { 80 it(p.name, p.value) 81 } 82 } 83 84 func (p *Parameters) Count() int { 85 if p == nil { 86 return 0 87 } 88 89 return len(*p) 90 } 91 92 func (p *Parameters) Add(params ...NamedValue) { 93 for _, param := range params { 94 *p = append(*p, Named(param.Name(), param.Value())) 95 } 96 } 97 98 func (p *Parameter) Optional() *optional { 99 return &optional{ 100 parent: p.parent, 101 name: p.name, 102 } 103 } 104 105 func (p *Parameter) List() *list { 106 return &list{ 107 parent: p.parent, 108 name: p.name, 109 } 110 } 111 112 func (p *Parameter) Set() *set { 113 return &set{ 114 parent: p.parent, 115 name: p.name, 116 } 117 } 118 119 func (p *Parameter) Text(v string) Builder { 120 p.value = value.TextValue(v) 121 p.parent.params = append(p.parent.params, p) 122 123 return p.parent 124 } 125 126 func (p *Parameter) Bytes(v []byte) Builder { 127 p.value = value.BytesValue(v) 128 p.parent.params = append(p.parent.params, p) 129 130 return p.parent 131 } 132 133 func (p *Parameter) Bool(v bool) Builder { 134 p.value = value.BoolValue(v) 135 p.parent.params = append(p.parent.params, p) 136 137 return p.parent 138 } 139 140 func (p *Parameter) Uint64(v uint64) Builder { 141 p.value = value.Uint64Value(v) 142 p.parent.params = append(p.parent.params, p) 143 144 return p.parent 145 } 146 147 func (p *Parameter) Int64(v int64) Builder { 148 p.value = value.Int64Value(v) 149 p.parent.params = append(p.parent.params, p) 150 151 return p.parent 152 } 153 154 func (p *Parameter) Uint32(v uint32) Builder { 155 p.value = value.Uint32Value(v) 156 p.parent.params = append(p.parent.params, p) 157 158 return p.parent 159 } 160 161 func (p *Parameter) Int32(v int32) Builder { 162 p.value = value.Int32Value(v) 163 p.parent.params = append(p.parent.params, p) 164 165 return p.parent 166 } 167 168 func (p *Parameter) Uint16(v uint16) Builder { 169 p.value = value.Uint16Value(v) 170 p.parent.params = append(p.parent.params, p) 171 172 return p.parent 173 } 174 175 func (p *Parameter) Int16(v int16) Builder { 176 p.value = value.Int16Value(v) 177 p.parent.params = append(p.parent.params, p) 178 179 return p.parent 180 } 181 182 func (p *Parameter) Uint8(v uint8) Builder { 183 p.value = value.Uint8Value(v) 184 p.parent.params = append(p.parent.params, p) 185 186 return p.parent 187 } 188 189 func (p *Parameter) Int8(v int8) Builder { 190 p.value = value.Int8Value(v) 191 p.parent.params = append(p.parent.params, p) 192 193 return p.parent 194 } 195 196 func (p *Parameter) Float(v float32) Builder { 197 p.value = value.FloatValue(v) 198 p.parent.params = append(p.parent.params, p) 199 200 return p.parent 201 } 202 203 func (p *Parameter) Double(v float64) Builder { 204 p.value = value.DoubleValue(v) 205 p.parent.params = append(p.parent.params, p) 206 207 return p.parent 208 } 209 210 func (p *Parameter) Decimal(v [16]byte, precision, scale uint32) Builder { 211 p.value = value.DecimalValue(v, precision, scale) 212 p.parent.params = append(p.parent.params, p) 213 214 return p.parent 215 } 216 217 func (p *Parameter) Timestamp(v time.Time) Builder { 218 p.value = value.TimestampValueFromTime(v) 219 p.parent.params = append(p.parent.params, p) 220 221 return p.parent 222 } 223 224 func (p *Parameter) Date(v time.Time) Builder { 225 p.value = value.DateValueFromTime(v) 226 p.parent.params = append(p.parent.params, p) 227 228 return p.parent 229 } 230 231 func (p *Parameter) Datetime(v time.Time) Builder { 232 p.value = value.DatetimeValueFromTime(v) 233 p.parent.params = append(p.parent.params, p) 234 235 return p.parent 236 } 237 238 func (p *Parameter) Interval(v time.Duration) Builder { 239 p.value = value.IntervalValueFromDuration(v) 240 p.parent.params = append(p.parent.params, p) 241 242 return p.parent 243 } 244 245 func (p *Parameter) JSON(v string) Builder { 246 p.value = value.JSONValue(v) 247 p.parent.params = append(p.parent.params, p) 248 249 return p.parent 250 } 251 252 func (p *Parameter) JSONDocument(v string) Builder { 253 p.value = value.JSONDocumentValue(v) 254 p.parent.params = append(p.parent.params, p) 255 256 return p.parent 257 } 258 259 func (p *Parameter) YSON(v []byte) Builder { 260 p.value = value.YSONValue(v) 261 p.parent.params = append(p.parent.params, p) 262 263 return p.parent 264 } 265 266 func (p *Parameter) UUID(v [16]byte) Builder { 267 p.value = value.UUIDValue(v) 268 p.parent.params = append(p.parent.params, p) 269 270 return p.parent 271 } 272 273 func Declare(p *Parameter) string { 274 return fmt.Sprintf( 275 "DECLARE %s AS %s", 276 p.name, 277 p.value.Type().Yql(), 278 ) 279 }