From 41df8763c6c300e1fbd0bd65a0975bdd4f538533 Mon Sep 17 00:00:00 2001 From: Jack Christensen Date: Wed, 10 Jul 2013 08:34:18 -0400 Subject: [PATCH] Refactor transcoder to use messageWriter --- connection.go | 2 +- message_writer.go | 9 ++++++++ value_transcoder.go | 52 ++++++++++++++++++++++----------------------- 3 files changed, 35 insertions(+), 28 deletions(-) diff --git a/connection.go b/connection.go index bdb91873..430c4574 100644 --- a/connection.go +++ b/connection.go @@ -339,7 +339,7 @@ func (c *Connection) sendPreparedQuery(ps *PreparedStatement, arguments ...inter if transcoder == nil { transcoder = defaultTranscoder } - transcoder.EncodeTo(buf, arguments[i]) + transcoder.EncodeTo(w, arguments[i]) } w.write(int16(len(ps.FieldDescriptions))) diff --git a/message_writer.go b/message_writer.go index 9a766882..917cfa40 100644 --- a/message_writer.go +++ b/message_writer.go @@ -24,6 +24,15 @@ func (w *messageWriter) writeStringNull(s string) { w.err = w.buf.WriteByte(0) } +func (w *messageWriter) writeString(s string) { + if w.err != nil { + return + } + if _, w.err = w.buf.WriteString(s); w.err != nil { + return + } +} + func (w *messageWriter) writeByte(b byte) { if w.err != nil { return diff --git a/value_transcoder.go b/value_transcoder.go index 4895a33d..f76fa9ff 100644 --- a/value_transcoder.go +++ b/value_transcoder.go @@ -1,8 +1,6 @@ package pgx import ( - "bytes" - "encoding/binary" "encoding/hex" "fmt" "strconv" @@ -11,7 +9,7 @@ import ( type valueTranscoder struct { DecodeText func(*MessageReader, int32) interface{} DecodeBinary func(*MessageReader, int32) interface{} - EncodeTo func(*bytes.Buffer, interface{}) + EncodeTo func(*messageWriter, interface{}) EncodeFormat int16 } @@ -87,11 +85,11 @@ func decodeBoolFromText(mr *MessageReader, size int32) interface{} { } } -func encodeBool(buf *bytes.Buffer, value interface{}) { +func encodeBool(w *messageWriter, value interface{}) { v := value.(bool) s := strconv.FormatBool(v) - binary.Write(buf, binary.BigEndian, int32(len(s))) - buf.WriteString(s) + w.write(int32(len(s))) + w.writeString(s) } func decodeInt8FromText(mr *MessageReader, size int32) interface{} { @@ -110,10 +108,10 @@ func decodeInt8FromBinary(mr *MessageReader, size int32) interface{} { return mr.ReadInt64() } -func encodeInt8(buf *bytes.Buffer, value interface{}) { +func encodeInt8(w *messageWriter, value interface{}) { v := value.(int64) - binary.Write(buf, binary.BigEndian, int32(8)) - binary.Write(buf, binary.BigEndian, v) + w.write(int32(8)) + w.write(v) } func decodeInt2FromText(mr *MessageReader, size int32) interface{} { @@ -132,10 +130,10 @@ func decodeInt2FromBinary(mr *MessageReader, size int32) interface{} { return mr.ReadInt16() } -func encodeInt2(buf *bytes.Buffer, value interface{}) { +func encodeInt2(w *messageWriter, value interface{}) { v := value.(int16) - binary.Write(buf, binary.BigEndian, int32(2)) - binary.Write(buf, binary.BigEndian, v) + w.write(int32(2)) + w.write(v) } func decodeInt4FromText(mr *MessageReader, size int32) interface{} { @@ -154,10 +152,10 @@ func decodeInt4FromBinary(mr *MessageReader, size int32) interface{} { return mr.ReadInt32() } -func encodeInt4(buf *bytes.Buffer, value interface{}) { +func encodeInt4(w *messageWriter, value interface{}) { v := value.(int32) - binary.Write(buf, binary.BigEndian, int32(4)) - binary.Write(buf, binary.BigEndian, v) + w.write(int32(4)) + w.write(v) } func decodeFloat4FromText(mr *MessageReader, size int32) interface{} { @@ -169,11 +167,11 @@ func decodeFloat4FromText(mr *MessageReader, size int32) interface{} { return float32(n) } -func encodeFloat4(buf *bytes.Buffer, value interface{}) { +func encodeFloat4(w *messageWriter, value interface{}) { v := value.(float32) s := strconv.FormatFloat(float64(v), 'e', -1, 32) - binary.Write(buf, binary.BigEndian, int32(len(s))) - buf.WriteString(s) + w.write(int32(len(s))) + w.writeString(s) } func decodeFloat8FromText(mr *MessageReader, size int32) interface{} { @@ -185,21 +183,21 @@ func decodeFloat8FromText(mr *MessageReader, size int32) interface{} { return v } -func encodeFloat8(buf *bytes.Buffer, value interface{}) { +func encodeFloat8(w *messageWriter, value interface{}) { v := value.(float64) s := strconv.FormatFloat(float64(v), 'e', -1, 64) - binary.Write(buf, binary.BigEndian, int32(len(s))) - buf.WriteString(s) + w.write(int32(len(s))) + w.writeString(s) } func decodeTextFromText(mr *MessageReader, size int32) interface{} { return mr.ReadByteString(size) } -func encodeText(buf *bytes.Buffer, value interface{}) { +func encodeText(w *messageWriter, value interface{}) { s := value.(string) - binary.Write(buf, binary.BigEndian, int32(len(s))) - buf.WriteString(s) + w.write(int32(len(s))) + w.writeString(s) } func decodeByteaFromText(mr *MessageReader, size int32) interface{} { @@ -211,8 +209,8 @@ func decodeByteaFromText(mr *MessageReader, size int32) interface{} { return b } -func encodeBytea(buf *bytes.Buffer, value interface{}) { +func encodeBytea(w *messageWriter, value interface{}) { b := value.([]byte) - binary.Write(buf, binary.BigEndian, int32(len(b))) - buf.Write(b) + w.write(int32(len(b))) + w.write(b) }