Refactor transcoder to use messageWriter

pgx-vs-pq
Jack Christensen 2013-07-10 08:34:18 -04:00
parent abfbf42cc5
commit 41df8763c6
3 changed files with 35 additions and 28 deletions

View File

@ -339,7 +339,7 @@ func (c *Connection) sendPreparedQuery(ps *PreparedStatement, arguments ...inter
if transcoder == nil { if transcoder == nil {
transcoder = defaultTranscoder transcoder = defaultTranscoder
} }
transcoder.EncodeTo(buf, arguments[i]) transcoder.EncodeTo(w, arguments[i])
} }
w.write(int16(len(ps.FieldDescriptions))) w.write(int16(len(ps.FieldDescriptions)))

View File

@ -24,6 +24,15 @@ func (w *messageWriter) writeStringNull(s string) {
w.err = w.buf.WriteByte(0) 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) { func (w *messageWriter) writeByte(b byte) {
if w.err != nil { if w.err != nil {
return return

View File

@ -1,8 +1,6 @@
package pgx package pgx
import ( import (
"bytes"
"encoding/binary"
"encoding/hex" "encoding/hex"
"fmt" "fmt"
"strconv" "strconv"
@ -11,7 +9,7 @@ import (
type valueTranscoder struct { type valueTranscoder struct {
DecodeText func(*MessageReader, int32) interface{} DecodeText func(*MessageReader, int32) interface{}
DecodeBinary func(*MessageReader, int32) interface{} DecodeBinary func(*MessageReader, int32) interface{}
EncodeTo func(*bytes.Buffer, interface{}) EncodeTo func(*messageWriter, interface{})
EncodeFormat int16 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) v := value.(bool)
s := strconv.FormatBool(v) s := strconv.FormatBool(v)
binary.Write(buf, binary.BigEndian, int32(len(s))) w.write(int32(len(s)))
buf.WriteString(s) w.writeString(s)
} }
func decodeInt8FromText(mr *MessageReader, size int32) interface{} { func decodeInt8FromText(mr *MessageReader, size int32) interface{} {
@ -110,10 +108,10 @@ func decodeInt8FromBinary(mr *MessageReader, size int32) interface{} {
return mr.ReadInt64() return mr.ReadInt64()
} }
func encodeInt8(buf *bytes.Buffer, value interface{}) { func encodeInt8(w *messageWriter, value interface{}) {
v := value.(int64) v := value.(int64)
binary.Write(buf, binary.BigEndian, int32(8)) w.write(int32(8))
binary.Write(buf, binary.BigEndian, v) w.write(v)
} }
func decodeInt2FromText(mr *MessageReader, size int32) interface{} { func decodeInt2FromText(mr *MessageReader, size int32) interface{} {
@ -132,10 +130,10 @@ func decodeInt2FromBinary(mr *MessageReader, size int32) interface{} {
return mr.ReadInt16() return mr.ReadInt16()
} }
func encodeInt2(buf *bytes.Buffer, value interface{}) { func encodeInt2(w *messageWriter, value interface{}) {
v := value.(int16) v := value.(int16)
binary.Write(buf, binary.BigEndian, int32(2)) w.write(int32(2))
binary.Write(buf, binary.BigEndian, v) w.write(v)
} }
func decodeInt4FromText(mr *MessageReader, size int32) interface{} { func decodeInt4FromText(mr *MessageReader, size int32) interface{} {
@ -154,10 +152,10 @@ func decodeInt4FromBinary(mr *MessageReader, size int32) interface{} {
return mr.ReadInt32() return mr.ReadInt32()
} }
func encodeInt4(buf *bytes.Buffer, value interface{}) { func encodeInt4(w *messageWriter, value interface{}) {
v := value.(int32) v := value.(int32)
binary.Write(buf, binary.BigEndian, int32(4)) w.write(int32(4))
binary.Write(buf, binary.BigEndian, v) w.write(v)
} }
func decodeFloat4FromText(mr *MessageReader, size int32) interface{} { func decodeFloat4FromText(mr *MessageReader, size int32) interface{} {
@ -169,11 +167,11 @@ func decodeFloat4FromText(mr *MessageReader, size int32) interface{} {
return float32(n) return float32(n)
} }
func encodeFloat4(buf *bytes.Buffer, value interface{}) { func encodeFloat4(w *messageWriter, value interface{}) {
v := value.(float32) v := value.(float32)
s := strconv.FormatFloat(float64(v), 'e', -1, 32) s := strconv.FormatFloat(float64(v), 'e', -1, 32)
binary.Write(buf, binary.BigEndian, int32(len(s))) w.write(int32(len(s)))
buf.WriteString(s) w.writeString(s)
} }
func decodeFloat8FromText(mr *MessageReader, size int32) interface{} { func decodeFloat8FromText(mr *MessageReader, size int32) interface{} {
@ -185,21 +183,21 @@ func decodeFloat8FromText(mr *MessageReader, size int32) interface{} {
return v return v
} }
func encodeFloat8(buf *bytes.Buffer, value interface{}) { func encodeFloat8(w *messageWriter, value interface{}) {
v := value.(float64) v := value.(float64)
s := strconv.FormatFloat(float64(v), 'e', -1, 64) s := strconv.FormatFloat(float64(v), 'e', -1, 64)
binary.Write(buf, binary.BigEndian, int32(len(s))) w.write(int32(len(s)))
buf.WriteString(s) w.writeString(s)
} }
func decodeTextFromText(mr *MessageReader, size int32) interface{} { func decodeTextFromText(mr *MessageReader, size int32) interface{} {
return mr.ReadByteString(size) return mr.ReadByteString(size)
} }
func encodeText(buf *bytes.Buffer, value interface{}) { func encodeText(w *messageWriter, value interface{}) {
s := value.(string) s := value.(string)
binary.Write(buf, binary.BigEndian, int32(len(s))) w.write(int32(len(s)))
buf.WriteString(s) w.writeString(s)
} }
func decodeByteaFromText(mr *MessageReader, size int32) interface{} { func decodeByteaFromText(mr *MessageReader, size int32) interface{} {
@ -211,8 +209,8 @@ func decodeByteaFromText(mr *MessageReader, size int32) interface{} {
return b return b
} }
func encodeBytea(buf *bytes.Buffer, value interface{}) { func encodeBytea(w *messageWriter, value interface{}) {
b := value.([]byte) b := value.([]byte)
binary.Write(buf, binary.BigEndian, int32(len(b))) w.write(int32(len(b)))
buf.Write(b) w.write(b)
} }