From a5f702c41dd243a33e769b5211a2eda0a9d36124 Mon Sep 17 00:00:00 2001 From: Jack Christensen Date: Sat, 29 Apr 2017 13:21:25 -0500 Subject: [PATCH] Reduce allocs and copies --- messages.go | 14 ++++++++++++++ values.go | 27 ++++++++++++--------------- 2 files changed, 26 insertions(+), 15 deletions(-) diff --git a/messages.go b/messages.go index e229367a..0f17a6d2 100644 --- a/messages.go +++ b/messages.go @@ -118,6 +118,20 @@ func (wb *WriteBuf) closeMsg() { binary.BigEndian.PutUint32(wb.buf[wb.sizeIdx:wb.sizeIdx+4], uint32(len(wb.buf)-wb.sizeIdx)) } +func (wb *WriteBuf) reserveSize() int { + sizePosition := len(wb.buf) + wb.buf = append(wb.buf, 0, 0, 0, 0) + return sizePosition +} + +func (wb *WriteBuf) setComputedSize(sizePosition int) { + binary.BigEndian.PutUint32(wb.buf[sizePosition:], uint32(len(wb.buf)-sizePosition-4)) +} + +func (wb *WriteBuf) setSize(sizePosition int, size int32) { + binary.BigEndian.PutUint32(wb.buf[sizePosition:], uint32(size)) +} + func (wb *WriteBuf) WriteByte(b byte) { wb.buf = append(wb.buf, b) } diff --git a/values.go b/values.go index 3565df34..da12952a 100644 --- a/values.go +++ b/values.go @@ -106,29 +106,27 @@ func encodePreparedStatementArgument(wbuf *WriteBuf, oid pgtype.Oid, arg interfa switch arg := arg.(type) { case pgtype.BinaryEncoder: - buf := &bytes.Buffer{} - null, err := arg.EncodeBinary(wbuf.conn.ConnInfo, buf) + sp := wbuf.reserveSize() + null, err := arg.EncodeBinary(wbuf.conn.ConnInfo, wbuf) if err != nil { return err } if null { - wbuf.WriteInt32(-1) + wbuf.setSize(sp, -1) } else { - wbuf.WriteInt32(int32(buf.Len())) - wbuf.WriteBytes(buf.Bytes()) + wbuf.setComputedSize(sp) } return nil case pgtype.TextEncoder: - buf := &bytes.Buffer{} - null, err := arg.EncodeText(wbuf.conn.ConnInfo, buf) + sp := wbuf.reserveSize() + null, err := arg.EncodeText(wbuf.conn.ConnInfo, wbuf) if err != nil { return err } if null { - wbuf.WriteInt32(-1) + wbuf.setSize(sp, -1) } else { - wbuf.WriteInt32(int32(buf.Len())) - wbuf.WriteBytes(buf.Bytes()) + wbuf.setComputedSize(sp) } return nil case driver.Valuer: @@ -161,16 +159,15 @@ func encodePreparedStatementArgument(wbuf *WriteBuf, oid pgtype.Oid, arg interfa return err } - buf := &bytes.Buffer{} - null, err := value.(pgtype.BinaryEncoder).EncodeBinary(wbuf.conn.ConnInfo, buf) + sp := wbuf.reserveSize() + null, err := value.(pgtype.BinaryEncoder).EncodeBinary(wbuf.conn.ConnInfo, wbuf) if err != nil { return err } if null { - wbuf.WriteInt32(-1) + wbuf.setSize(sp, -1) } else { - wbuf.WriteInt32(int32(buf.Len())) - wbuf.WriteBytes(buf.Bytes()) + wbuf.setComputedSize(sp) } return nil }