@@ -23,7 +23,6 @@ faster than other packages according to public benchmarks.
23
23
* [ API reference] ( #api-reference )
24
24
* [ Walking\- through example] ( #walking-through-example )
25
25
* [ Help] ( #help )
26
- * [ Custom (un)packing and typed selects and function calls] ( #custom-unpacking-and-typed-selects-and-function-calls )
27
26
* [ Options] ( #options )
28
27
* [ Tests] ( #tests )
29
28
* [ Alternative connectors] ( #alternative-connectors )
@@ -170,185 +169,6 @@ To contact `go-tarantool` developers on any problems, create an issue at
170
169
The developers of the [ Tarantool server] ( http://github.com/tarantool/tarantool )
171
170
will also be happy to provide advice or receive feedback.
172
171
173
- ## Custom (un)packing and typed selects and function calls
174
-
175
- You can specify custom pack/unpack functions for your types. This will allow you
176
- to store complex structures inside a tuple and may speed up you requests.
177
-
178
- Alternatively, you can just instruct the ` msgpack ` library to encode your
179
- structure as an array. This is safe "magic". It will be easier to implement than
180
- a custom packer/unpacker, but it will work slower.
181
-
182
- ``` go
183
- import (
184
- " github.com/tarantool/go-tarantool"
185
- " gopkg.in/vmihailenco/msgpack.v2"
186
- )
187
-
188
- type Member struct {
189
- Name string
190
- Nonce string
191
- Val uint
192
- }
193
-
194
- type Tuple struct {
195
- Cid uint
196
- Orig string
197
- Members []Member
198
- }
199
-
200
- /* same effect in a "magic" way, but slower */
201
- type Tuple2 struct {
202
- _msgpack struct {} ` msgpack:",asArray"`
203
-
204
- Cid uint
205
- Orig string
206
- Members []Member
207
- }
208
-
209
- func (m *Member ) EncodeMsgpack (e *msgpack .Encoder ) error {
210
- if err := e.EncodeSliceLen (2 ); err != nil {
211
- return err
212
- }
213
- if err := e.EncodeString (m.Name ); err != nil {
214
- return err
215
- }
216
- if err := e.EncodeUint (m.Val ); err != nil {
217
- return err
218
- }
219
- return nil
220
- }
221
-
222
- func (m *Member ) DecodeMsgpack (d *msgpack .Decoder ) error {
223
- var err error
224
- var l int
225
- if l, err = d.DecodeSliceLen (); err != nil {
226
- return err
227
- }
228
- if l != 2 {
229
- return fmt.Errorf (" array len doesn't match: %d " , l)
230
- }
231
- if m.Name , err = d.DecodeString (); err != nil {
232
- return err
233
- }
234
- if m.Val , err = d.DecodeUint (); err != nil {
235
- return err
236
- }
237
- return nil
238
- }
239
-
240
- func (c *Tuple ) EncodeMsgpack (e *msgpack .Encoder ) error {
241
- if err := e.EncodeSliceLen (3 ); err != nil {
242
- return err
243
- }
244
- if err := e.EncodeUint (c.Cid ); err != nil {
245
- return err
246
- }
247
- if err := e.EncodeString (c.Orig ); err != nil {
248
- return err
249
- }
250
- if err := e.EncodeSliceLen (len (c.Members )); err != nil {
251
- return err
252
- }
253
- for _ , m := range c.Members {
254
- e.Encode (m)
255
- }
256
- return nil
257
- }
258
-
259
- func (c *Tuple ) DecodeMsgpack (d *msgpack .Decoder ) error {
260
- var err error
261
- var l int
262
- if l, err = d.DecodeSliceLen (); err != nil {
263
- return err
264
- }
265
- if l != 3 {
266
- return fmt.Errorf (" array len doesn't match: %d " , l)
267
- }
268
- if c.Cid , err = d.DecodeUint (); err != nil {
269
- return err
270
- }
271
- if c.Orig , err = d.DecodeString (); err != nil {
272
- return err
273
- }
274
- if l, err = d.DecodeSliceLen (); err != nil {
275
- return err
276
- }
277
- c.Members = make ([]Member, l)
278
- for i := 0 ; i < l; i++ {
279
- d.Decode (&c.Members [i])
280
- }
281
- return nil
282
- }
283
-
284
- func main () {
285
- // establish connection ...
286
-
287
- tuple := Tuple{777 , " orig" , []Member{{" lol" , " " , 1 }, {" wut" , " " , 3 }}}
288
- _, err = conn.Replace (spaceNo, tuple) // NOTE: insert structure itself
289
- if err != nil {
290
- t.Errorf (" Failed to insert: %s " , err.Error ())
291
- return
292
- }
293
-
294
- var tuples []Tuple
295
- err = conn.SelectTyped (spaceNo, indexNo, 0 , 1 , IterEq, []interface {}{777 }, &tuples)
296
- if err != nil {
297
- t.Errorf (" Failed to SelectTyped: %s " , err.Error ())
298
- return
299
- }
300
-
301
- // same result in a "magic" way
302
- var tuples2 []Tuple2
303
- err = conn.SelectTyped (spaceNo, indexNo, 0 , 1 , IterEq, []interface {}{777 }, &tuples2)
304
- if err != nil {
305
- t.Errorf (" Failed to SelectTyped: %s " , err.Error ())
306
- return
307
- }
308
-
309
- // call function 'func_name' returning a table of custom tuples
310
- var tuples3 []Tuple
311
- err = client.CallTyped (" func_name" , []interface {}{1 , 2 , 3 }, &tuples3)
312
- if err != nil {
313
- t.Errorf (" Failed to CallTyped: %s " , err.Error ())
314
- return
315
- }
316
- }
317
-
318
- /*
319
- // Old way to register types
320
- func init() {
321
- msgpack.Register(reflect.TypeOf(Tuple{}), encodeTuple, decodeTuple)
322
- msgpack.Register(reflect.TypeOf(Member{}), encodeMember, decodeMember)
323
- }
324
-
325
- func encodeMember(e *msgpack.Encoder, v reflect.Value) error {
326
- m := v.Interface().(Member)
327
- // same code as in EncodeMsgpack
328
- return nil
329
- }
330
-
331
- func decodeMember(d *msgpack.Decoder, v reflect.Value) error {
332
- m := v.Addr().Interface().(*Member)
333
- // same code as in DecodeMsgpack
334
- return nil
335
- }
336
-
337
- func encodeTuple(e *msgpack.Encoder, v reflect.Value) error {
338
- c := v.Interface().(Tuple)
339
- // same code as in EncodeMsgpack
340
- return nil
341
- }
342
-
343
- func decodeTuple(d *msgpack.Decoder, v reflect.Value) error {
344
- c := v.Addr().Interface().(*Tuple)
345
- // same code as in DecodeMsgpack
346
- return nil
347
- }
348
- */
349
-
350
- ```
351
-
352
172
## Options
353
173
354
174
* ` Timeout ` - timeout for any particular request. If ` Timeout ` is zero request,
0 commit comments