package pgproto3
import (
)
type DataRow struct {
Values [][]byte
}
func (*DataRow) () {}
func ( *DataRow) ( []byte) error {
if len() < 2 {
return &invalidMessageFormatErr{messageType: "DataRow"}
}
:= 0
:= int(binary.BigEndian.Uint16([:]))
+= 2
if cap(.Values) < || cap(.Values)- > 32 {
:= max(32, )
.Values = make([][]byte, , )
} else {
.Values = .Values[:]
}
for := range {
if len([:]) < 4 {
return &invalidMessageFormatErr{messageType: "DataRow"}
}
:= int(int32(binary.BigEndian.Uint32([:])))
+= 4
if == -1 {
.Values[] = nil
} else {
if len([:]) < || < 0 {
return &invalidMessageFormatErr{messageType: "DataRow"}
}
.Values[] = [ : + : +]
+=
}
}
return nil
}
func ( *DataRow) ( []byte) ([]byte, error) {
, := beginMessage(, 'D')
if len(.Values) > math.MaxUint16 {
return nil, errors.New("too many values")
}
= pgio.AppendUint16(, uint16(len(.Values)))
for , := range .Values {
if == nil {
= pgio.AppendInt32(, -1)
continue
}
= pgio.AppendInt32(, int32(len()))
= append(, ...)
}
return finishMessage(, )
}
func ( DataRow) () ([]byte, error) {
:= make([]map[string]string, len(.Values))
for , := range .Values {
if == nil {
continue
}
var bool
for , := range {
if < 32 {
= true
break
}
}
if {
[] = map[string]string{"binary": hex.EncodeToString()}
} else {
[] = map[string]string{"text": string()}
}
}
return json.Marshal(struct {
string
[]map[string]string
}{
: "DataRow",
: ,
})
}
func ( *DataRow) ( []byte) error {
if string() == "null" {
return nil
}
var struct {
[]map[string]string
}
if := json.Unmarshal(, &); != nil {
return
}
.Values = make([][]byte, len(.))
for , := range . {
var error
.Values[], = getValueFromJSON()
if != nil {
return
}
}
return nil
}