-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathrow.go
More file actions
151 lines (124 loc) · 2.91 KB
/
row.go
File metadata and controls
151 lines (124 loc) · 2.91 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
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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
package pgproto
import (
"io"
)
type RowField struct {
ColumnName []byte
TableOID int
ColumnIndex int // int16
TypeOID int
ColumnLength int //int16
TypeModifier int
Format Format
}
func (f RowField) AsMap() map[string]interface{} {
return map[string]interface{}{
"ColumnName": f.ColumnName,
"TableOID": f.TableOID,
"ColumnIndex": f.ColumnIndex,
"TypeOID": f.TypeOID,
"ColumnLength": f.ColumnLength,
"TypeModifier": f.TypeModifier,
"Format": f.Format,
}
}
type RowDescription struct {
Fields []RowField
}
func (r *RowDescription) server() {}
func ParseRowDescription(r io.Reader) (*RowDescription, error) {
b := newReadBuffer(r)
// 'T' [int32 - length] [int32 - field count] ([string - column name]\0 [int32 - table oid] [int16 - column index] [int32 - type oid] [int16 - column length] [int32 - type modifier] [int16 - format])
err := b.ReadTag('T')
if err != nil {
return nil, err
}
// Length - int
b, err = b.ReadLength()
if err != nil {
return nil, err
}
// Field count - int16
c, err := b.ReadInt16()
if err != nil {
return nil, err
}
rd := &RowDescription{
Fields: make([]RowField, c),
}
for i := 0; i < c; i++ {
// Column Name - string
rd.Fields[i].ColumnName, err = b.ReadString(true)
if err != nil {
return nil, err
}
// Table OID - int
rd.Fields[i].TableOID, err = b.ReadInt()
if err != nil {
return nil, err
}
// Column Index - int16
rd.Fields[i].ColumnIndex, err = b.ReadInt16()
if err != nil {
return nil, err
}
// Type OID - int
rd.Fields[i].TypeOID, err = b.ReadInt()
if err != nil {
return nil, err
}
// Column Length - int16
rd.Fields[i].ColumnLength, err = b.ReadInt16()
if err != nil {
return nil, err
}
// Type Modifier - int
rd.Fields[i].TypeModifier, err = b.ReadInt()
if err != nil {
return nil, err
}
// Format - int16
format, err := b.ReadInt16()
rd.Fields[i].Format = Format(format)
if err != nil {
return nil, err
}
}
return rd, nil
}
func (r *RowDescription) Encode() []byte {
b := newWriteBuffer()
// Field count - int16
b.WriteInt16(len(r.Fields))
for _, f := range r.Fields {
// Column Name - string
b.WriteString(f.ColumnName, true)
// Table OID - int
b.WriteInt(f.TableOID)
// Column Index - int16
b.WriteInt16(f.ColumnIndex)
// Type OID - int
b.WriteInt(f.TypeOID)
// Column Length - int16
b.WriteInt16(f.ColumnLength)
// Type Modifier - int
b.WriteInt(f.TypeModifier)
// Format - int16
b.WriteInt16(int(f.Format))
}
b.Wrap('T')
return b.Bytes()
}
func (r *RowDescription) AsMap() map[string]interface{} {
fields := make([]map[string]interface{}, 0)
for _, f := range r.Fields {
fields = append(fields, f.AsMap())
}
return map[string]interface{}{
"Type": "RowDescription",
"Payload": map[string]interface{}{
"Fields": fields,
},
}
}
func (r *RowDescription) String() string { return messageToString(r) }