-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathtable.go
More file actions
68 lines (55 loc) · 1.23 KB
/
table.go
File metadata and controls
68 lines (55 loc) · 1.23 KB
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
package msi
import (
"io"
"github.com/asalih/go-mscfb"
)
type Table struct {
Name string
Columns []*Column
LongStringRefs bool
}
func NewTable(name string, columns []*Column, longStringRefs bool) *Table {
return &Table{
Name: name,
Columns: columns,
LongStringRefs: longStringRefs,
}
}
func (t *Table) StreamName() string {
return NameEncode(t.Name, true)
}
func (t *Table) ReadRows(stream *mscfb.Stream) ([][]*ValueRef, error) {
dataLength, err := stream.Seek(0, io.SeekEnd)
if err != nil {
return nil, err
}
_, err = stream.Seek(0, io.SeekStart)
if err != nil {
return nil, err
}
var rowSize uint64
for _, column := range t.Columns {
rowSize += column.ColumnType.Width(t.LongStringRefs)
}
var numRows int64
if rowSize > 0 {
numRows = int64(dataLength) / int64(rowSize)
}
rows := make([][]*ValueRef, numRows)
for i := int64(0); i < numRows; i++ {
rows[i] = make([]*ValueRef, 0)
}
for _, column := range t.Columns {
for i := int64(0); i < numRows; i++ {
value, err := column.ColumnType.ReadValue(stream, t.LongStringRefs)
if err != nil {
if err == io.EOF {
break
}
return nil, err
}
rows[i] = append(rows[i], value)
}
}
return rows, nil
}