From 38671ea10678734cddfabb210318a6e84f49032a Mon Sep 17 00:00:00 2001 From: Jack Christensen Date: Sat, 26 Jan 2019 10:21:16 -0600 Subject: [PATCH] Properly abort CopyFrom on reader error --- copy_fail.go | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 copy_fail.go diff --git a/copy_fail.go b/copy_fail.go new file mode 100644 index 00000000..432a311b --- /dev/null +++ b/copy_fail.go @@ -0,0 +1,49 @@ +package pgproto3 + +import ( + "bytes" + "encoding/json" + + "github.com/jackc/pgx/pgio" +) + +type CopyFail struct { + Error string +} + +func (*CopyFail) Frontend() {} +func (*CopyFail) Backend() {} + +func (dst *CopyFail) Decode(src []byte) error { + idx := bytes.IndexByte(src, 0) + if idx != len(src)-1 { + return &invalidMessageFormatErr{messageType: "CopyFail"} + } + + dst.Error = string(src[:idx]) + + return nil +} + +func (src *CopyFail) Encode(dst []byte) []byte { + dst = append(dst, 'C') + sp := len(dst) + dst = pgio.AppendInt32(dst, -1) + + dst = append(dst, src.Error...) + dst = append(dst, 0) + + pgio.SetInt32(dst[sp:], int32(len(dst[sp:]))) + + return dst +} + +func (src *CopyFail) MarshalJSON() ([]byte, error) { + return json.Marshal(struct { + Type string + Error string + }{ + Type: "CopyFail", + Error: src.Error, + }) +}