This repository has been archived by the owner on Jun 5, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 1
/
table_reader.go
99 lines (77 loc) · 1.62 KB
/
table_reader.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
package rpcclient
import (
"reflect"
"go.ytsaurus.tech/library/go/core/xerrors"
"github.com/go-faster/yt/proto/client/api/rpc_proxy"
"github.com/go-faster/yt/wire"
"github.com/go-faster/yt/yt"
)
var _ yt.TableReader = (*tableReader)(nil)
type tableReader struct {
rows []wire.Row
d *wire.WireDecoder
idx int
value wire.Row
err error
end bool
started bool
}
func newTableReader(rows []wire.Row, d *rpc_proxy.TRowsetDescriptor) (*tableReader, error) {
nameTable, err := makeNameTable(d)
if err != nil {
return nil, err
}
r := &tableReader{
rows: rows,
d: wire.NewDecoder(nameTable),
}
return r, nil
}
func (r *tableReader) Scan(value interface{}) error {
if r.err != nil {
return r.err
}
if !r.started {
return xerrors.New("call to Scan() before calling Next()")
}
if r.end {
return xerrors.New("call to Scan() after EOF")
}
zeroInitialize(value)
if err := r.d.UnmarshalRow(r.value, value); err != nil {
return xerrors.Errorf("unable to deserialize row: %w", err) // todo set r.err?
}
return r.err
}
func (r *tableReader) Next() bool {
r.started = true
if r.err != nil {
return false
} else if r.end {
return false
}
ok := r.idx < len(r.rows)
if !ok {
r.end = true
return false
} else if r.err != nil {
return false
}
r.value = r.rows[r.idx]
r.idx++
return r.err == nil
}
func (r *tableReader) Err() error {
return r.err
}
func (r *tableReader) Close() error {
return r.err
}
func zeroInitialize(v interface{}) {
value := reflect.ValueOf(v)
if value.Kind() != reflect.Ptr {
return
}
value = value.Elem()
value.Set(reflect.Zero(value.Type()))
}