mirror of
https://github.com/jackc/pgx.git
synced 2025-05-31 11:42:24 +00:00
Altered chunkreader to never reuse memory. Altered pgproto3 to to copy memory when decoding. Renamed UnmarshalBinary to Decode because of changed semantics.
61 lines
1.3 KiB
Go
61 lines
1.3 KiB
Go
package pgproto3
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/binary"
|
|
"encoding/json"
|
|
)
|
|
|
|
type ParameterDescription struct {
|
|
ParameterOIDs []uint32
|
|
}
|
|
|
|
func (*ParameterDescription) Backend() {}
|
|
|
|
func (dst *ParameterDescription) Decode(src []byte) error {
|
|
buf := bytes.NewBuffer(src)
|
|
|
|
if buf.Len() < 2 {
|
|
return &invalidMessageFormatErr{messageType: "ParameterDescription"}
|
|
}
|
|
|
|
// Reported parameter count will be incorrect when number of args is greater than uint16
|
|
buf.Next(2)
|
|
// Instead infer parameter count by remaining size of message
|
|
parameterCount := buf.Len() / 4
|
|
|
|
*dst = ParameterDescription{ParameterOIDs: make([]uint32, parameterCount)}
|
|
|
|
for i := 0; i < parameterCount; i++ {
|
|
dst.ParameterOIDs[i] = binary.BigEndian.Uint32(buf.Next(4))
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (src *ParameterDescription) MarshalBinary() ([]byte, error) {
|
|
var bigEndian BigEndianBuf
|
|
buf := &bytes.Buffer{}
|
|
|
|
buf.WriteByte('t')
|
|
buf.Write(bigEndian.Uint32(uint32(4 + 2 + 4*len(src.ParameterOIDs))))
|
|
|
|
buf.Write(bigEndian.Uint16(uint16(len(src.ParameterOIDs))))
|
|
|
|
for _, oid := range src.ParameterOIDs {
|
|
buf.Write(bigEndian.Uint32(oid))
|
|
}
|
|
|
|
return buf.Bytes(), nil
|
|
}
|
|
|
|
func (src *ParameterDescription) MarshalJSON() ([]byte, error) {
|
|
return json.Marshal(struct {
|
|
Type string
|
|
ParameterOIDs []uint32
|
|
}{
|
|
Type: "ParameterDescription",
|
|
ParameterOIDs: src.ParameterOIDs,
|
|
})
|
|
}
|