package pgproto3
import (
)
type FunctionCall struct {
Function uint32
ArgFormatCodes []uint16
Arguments [][]byte
ResultFormatCode uint16
}
func (*FunctionCall) () {}
func ( *FunctionCall) ( []byte) error {
* = FunctionCall{}
:= 0
if len() < 8 {
return &invalidMessageFormatErr{messageType: "FunctionCall"}
}
.Function = binary.BigEndian.Uint32([:])
+= 4
:= int(binary.BigEndian.Uint16([:]))
+= 2
if len([:]) < *2+2 {
return &invalidMessageFormatErr{messageType: "FunctionCall"}
}
:= make([]uint16, )
for := range {
:= binary.BigEndian.Uint16([:])
if != 0 && != 1 {
return &invalidMessageFormatErr{messageType: "FunctionCall"}
}
[] =
+= 2
}
.ArgFormatCodes =
:= int(binary.BigEndian.Uint16([:]))
+= 2
:= make([][]byte, )
for := range {
if len([:]) < 4 {
return &invalidMessageFormatErr{messageType: "FunctionCall"}
}
:= int(int32(binary.BigEndian.Uint32([:])))
+= 4
if == -1 {
[] = nil
} else if < 0 {
return &invalidMessageFormatErr{messageType: "FunctionCall"}
} else {
if len([:]) < {
return &invalidMessageFormatErr{messageType: "FunctionCall"}
}
:= [ : +]
+=
[] =
}
}
.Arguments =
if len([:]) < 2 {
return &invalidMessageFormatErr{messageType: "FunctionCall"}
}
:= binary.BigEndian.Uint16([:])
if != 0 && != 1 {
return &invalidMessageFormatErr{messageType: "FunctionCall"}
}
.ResultFormatCode =
return nil
}
func ( *FunctionCall) ( []byte) ([]byte, error) {
, := beginMessage(, 'F')
= pgio.AppendUint32(, .Function)
if len(.ArgFormatCodes) > math.MaxUint16 {
return nil, errors.New("too many arg format codes")
}
= pgio.AppendUint16(, uint16(len(.ArgFormatCodes)))
for , := range .ArgFormatCodes {
= pgio.AppendUint16(, )
}
if len(.Arguments) > math.MaxUint16 {
return nil, errors.New("too many arguments")
}
= pgio.AppendUint16(, uint16(len(.Arguments)))
for , := range .Arguments {
if == nil {
= pgio.AppendInt32(, -1)
} else {
= pgio.AppendInt32(, int32(len()))
= append(, ...)
}
}
= pgio.AppendUint16(, .ResultFormatCode)
return finishMessage(, )
}