/
packageOrderBy.go
111 lines (90 loc) · 2.74 KB
/
packageOrderBy.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
100
101
102
103
104
105
106
107
108
109
110
111
// SPDX-FileCopyrightText: 2020 SAP SE
// SPDX-FileCopyrightText: 2021 SAP SE
// SPDX-FileCopyrightText: 2022 SAP SE
// SPDX-FileCopyrightText: 2023 SAP SE
//
// SPDX-License-Identifier: Apache-2.0
package tds
import "fmt"
var _ Package = (*OrderByPackage)(nil)
// OrderByPackage communicates in which order columns should be used.
//
// When a statement is executed the returned columns are in whatever
// order is most convenient for the server. The server may then send an
// OrderByPackage to communicate in which order the columns should be
// listed.
type OrderByPackage struct {
// Reference the previous RowFmt
rowFmt *RowFmtPackage
ColumnOrder []int
}
// LastPkg implements the tds.LastPkgAcceptor interface.
func (pkg *OrderByPackage) LastPkg(other Package) error {
if rowFmt, ok := other.(*RowFmtPackage); ok {
pkg.rowFmt = rowFmt
return nil
}
return fmt.Errorf("received package other than RowFmtPackage: %T", other)
}
// ReadFrom implements the tds.Package interface.
func (pkg *OrderByPackage) ReadFrom(ch BytesChannel) error {
columnCount, err := ch.Uint16()
if err != nil {
return ErrNotEnoughBytes
}
pkg.ColumnOrder = make([]int, int(columnCount))
for i := range pkg.ColumnOrder {
colNum, err := ch.Uint8()
if err != nil {
return ErrNotEnoughBytes
}
pkg.ColumnOrder[i] = int(colNum)
}
return nil
}
// WriteTo implements the tds.Package interface.
func (pkg OrderByPackage) WriteTo(ch BytesChannel) error {
return fmt.Errorf("not implemented")
}
func (pkg OrderByPackage) String() string {
return fmt.Sprintf("%T(%d): %v", pkg, len(pkg.ColumnOrder), pkg.ColumnOrder)
}
var _ Package = (*OrderBy2Package)(nil)
// OrderBy2Package is a superset of OrderByPackage and supports more
// than 255 columns.
type OrderBy2Package struct {
OrderByPackage
}
// ReadFrom implements the tds.Package interface.
func (pkg *OrderBy2Package) ReadFrom(ch BytesChannel) error {
totalBytes, err := ch.Uint32()
if err != nil {
return fmt.Errorf("error reading byte length: %w", err)
}
columnCount, err := ch.Uint16()
if err != nil {
return fmt.Errorf("error reading column count: %w", err)
}
n := 2
pkg.ColumnOrder = make([]int, int(columnCount))
for i := range pkg.ColumnOrder {
colNum, err := ch.Uint16()
if err != nil {
return fmt.Errorf("error reading column order for %d: %w", i, err)
}
n += 2
pkg.ColumnOrder[i] = int(colNum)
}
if n != int(totalBytes) {
return fmt.Errorf("expected to read %d bytes, read %d bytes instead",
totalBytes, n)
}
return nil
}
// WriteTo is not implemented.
func (pkg OrderBy2Package) WriteTo(ch BytesChannel) error {
return fmt.Errorf("not implemented")
}
func (pkg OrderBy2Package) String() string {
return fmt.Sprintf("%T(%d): %v", pkg, len(pkg.ColumnOrder), pkg.ColumnOrder)
}