2
0

ValueTranscoder EncodeTo now receives io.Writer

This commit is contained in:
Jack Christensen
2014-06-19 17:48:26 -05:00
parent 884252675e
commit 3b9a1ce659
3 changed files with 104 additions and 62 deletions
+1 -1
View File
@@ -793,7 +793,7 @@ func (c *Conn) sendPreparedQuery(ps *preparedStatement, arguments ...interface{}
if transcoder == nil { if transcoder == nil {
transcoder = defaultTranscoder transcoder = defaultTranscoder
} }
err = transcoder.EncodeTo(w, arguments[i]) err = transcoder.EncodeTo(w.buf, arguments[i])
if err != nil { if err != nil {
return err return err
} }
+10 -4
View File
@@ -1,8 +1,10 @@
package pgx_test package pgx_test
import ( import (
"encoding/binary"
"fmt" "fmt"
"github.com/JackC/pgx" "github.com/JackC/pgx"
"io"
"regexp" "regexp"
"strconv" "strconv"
) )
@@ -55,15 +57,19 @@ func decodePointFromText(mr *pgx.MessageReader, size int32) interface{} {
return p return p
} }
func encodePoint(w *pgx.MessageWriter, value interface{}) error { func encodePoint(w io.Writer, value interface{}) error {
p, ok := value.(Point) p, ok := value.(Point)
if !ok { if !ok {
return fmt.Errorf("Expected Point, received %T", value) return fmt.Errorf("Expected Point, received %T", value)
} }
s := fmt.Sprintf("point(%v,%v)", p.x, p.y) s := fmt.Sprintf("point(%v,%v)", p.x, p.y)
w.Write(int32(len(s)))
w.WriteString(s)
return nil err := binary.Write(w, binary.BigEndian, int32(len(s)))
if err != nil {
return err
}
_, err = io.WriteString(w, s)
return err
} }
+93 -57
View File
@@ -2,8 +2,10 @@ package pgx
import ( import (
"bytes" "bytes"
"encoding/binary"
"encoding/hex" "encoding/hex"
"fmt" "fmt"
"io"
"regexp" "regexp"
"strconv" "strconv"
"time" "time"
@@ -18,7 +20,7 @@ type ValueTranscoder struct {
// DecodeBinary decodes values returned from the server in binary format // DecodeBinary decodes values returned from the server in binary format
DecodeBinary func(*MessageReader, int32) interface{} DecodeBinary func(*MessageReader, int32) interface{}
// EncodeTo encodes values to send to the server // EncodeTo encodes values to send to the server
EncodeTo func(*MessageWriter, interface{}) error EncodeTo func(io.Writer, interface{}) error
// EncodeFormat is the format values are encoded for transmission. // EncodeFormat is the format values are encoded for transmission.
// 0 = text // 0 = text
// 1 = binary // 1 = binary
@@ -159,20 +161,23 @@ func decodeBoolFromBinary(mr *MessageReader, size int32) interface{} {
return b != 0 return b != 0
} }
func encodeBool(w *MessageWriter, value interface{}) error { func encodeBool(w io.Writer, value interface{}) error {
v, ok := value.(bool) v, ok := value.(bool)
if !ok { if !ok {
return fmt.Errorf("Expected bool, received %T", value) return fmt.Errorf("Expected bool, received %T", value)
} }
w.Write(int32(1)) err := binary.Write(w, binary.BigEndian, int32(1))
if v { if err != nil {
w.WriteByte(1) return err
} else {
w.WriteByte(0)
} }
return nil var n byte
if v {
n = 1
}
return binary.Write(w, binary.BigEndian, n)
} }
func decodeInt8FromText(mr *MessageReader, size int32) interface{} { func decodeInt8FromText(mr *MessageReader, size int32) interface{} {
@@ -191,16 +196,18 @@ func decodeInt8FromBinary(mr *MessageReader, size int32) interface{} {
return mr.ReadInt64() return mr.ReadInt64()
} }
func encodeInt8(w *MessageWriter, value interface{}) error { func encodeInt8(w io.Writer, value interface{}) error {
v, ok := value.(int64) v, ok := value.(int64)
if !ok { if !ok {
return fmt.Errorf("Expected int64, received %T", value) return fmt.Errorf("Expected int64, received %T", value)
} }
w.Write(int32(8)) err := binary.Write(w, binary.BigEndian, int32(8))
w.Write(v) if err != nil {
return err
}
return nil return binary.Write(w, binary.BigEndian, v)
} }
func decodeInt2FromText(mr *MessageReader, size int32) interface{} { func decodeInt2FromText(mr *MessageReader, size int32) interface{} {
@@ -219,16 +226,18 @@ func decodeInt2FromBinary(mr *MessageReader, size int32) interface{} {
return mr.ReadInt16() return mr.ReadInt16()
} }
func encodeInt2(w *MessageWriter, value interface{}) error { func encodeInt2(w io.Writer, value interface{}) error {
v, ok := value.(int16) v, ok := value.(int16)
if !ok { if !ok {
return fmt.Errorf("Expected int16, received %T", value) return fmt.Errorf("Expected int16, received %T", value)
} }
w.Write(int32(2)) err := binary.Write(w, binary.BigEndian, int32(2))
w.Write(v) if err != nil {
return err
}
return nil return binary.Write(w, binary.BigEndian, v)
} }
func decodeInt4FromText(mr *MessageReader, size int32) interface{} { func decodeInt4FromText(mr *MessageReader, size int32) interface{} {
@@ -247,16 +256,18 @@ func decodeInt4FromBinary(mr *MessageReader, size int32) interface{} {
return mr.ReadInt32() return mr.ReadInt32()
} }
func encodeInt4(w *MessageWriter, value interface{}) error { func encodeInt4(w io.Writer, value interface{}) error {
v, ok := value.(int32) v, ok := value.(int32)
if !ok { if !ok {
return fmt.Errorf("Expected int32, received %T", value) return fmt.Errorf("Expected int32, received %T", value)
} }
w.Write(int32(4)) err := binary.Write(w, binary.BigEndian, int32(4))
w.Write(v) if err != nil {
return err
}
return nil return binary.Write(w, binary.BigEndian, v)
} }
func decodeFloat4FromText(mr *MessageReader, size int32) interface{} { func decodeFloat4FromText(mr *MessageReader, size int32) interface{} {
@@ -278,16 +289,18 @@ func decodeFloat4FromBinary(mr *MessageReader, size int32) interface{} {
return *(*float32)(p) return *(*float32)(p)
} }
func encodeFloat4(w *MessageWriter, value interface{}) error { func encodeFloat4(w io.Writer, value interface{}) error {
v, ok := value.(float32) v, ok := value.(float32)
if !ok { if !ok {
return fmt.Errorf("Expected float32, received %T", value) return fmt.Errorf("Expected float32, received %T", value)
} }
w.Write(int32(4)) err := binary.Write(w, binary.BigEndian, int32(4))
w.Write(v) if err != nil {
return err
}
return nil return binary.Write(w, binary.BigEndian, v)
} }
func decodeFloat8FromText(mr *MessageReader, size int32) interface{} { func decodeFloat8FromText(mr *MessageReader, size int32) interface{} {
@@ -309,32 +322,37 @@ func decodeFloat8FromBinary(mr *MessageReader, size int32) interface{} {
return *(*float64)(p) return *(*float64)(p)
} }
func encodeFloat8(w *MessageWriter, value interface{}) error { func encodeFloat8(w io.Writer, value interface{}) error {
v, ok := value.(float64) v, ok := value.(float64)
if !ok { if !ok {
return fmt.Errorf("Expected float64, received %T", value) return fmt.Errorf("Expected float64, received %T", value)
} }
w.Write(int32(8)) err := binary.Write(w, binary.BigEndian, int32(8))
w.Write(v) if err != nil {
return err
}
return nil return binary.Write(w, binary.BigEndian, v)
} }
func decodeTextFromText(mr *MessageReader, size int32) interface{} { func decodeTextFromText(mr *MessageReader, size int32) interface{} {
return mr.ReadString(size) return mr.ReadString(size)
} }
func encodeText(w *MessageWriter, value interface{}) error { func encodeText(w io.Writer, value interface{}) error {
s, ok := value.(string) s, ok := value.(string)
if !ok { if !ok {
return fmt.Errorf("Expected string, received %T", value) return fmt.Errorf("Expected string, received %T", value)
} }
w.Write(int32(len(s))) err := binary.Write(w, binary.BigEndian, int32(len(s)))
w.WriteString(s) if err != nil {
return err
}
return nil _, err = io.WriteString(w, s)
return err
} }
func decodeByteaFromText(mr *MessageReader, size int32) interface{} { func decodeByteaFromText(mr *MessageReader, size int32) interface{} {
@@ -346,16 +364,19 @@ func decodeByteaFromText(mr *MessageReader, size int32) interface{} {
return b return b
} }
func encodeBytea(w *MessageWriter, value interface{}) error { func encodeBytea(w io.Writer, value interface{}) error {
b, ok := value.([]byte) b, ok := value.([]byte)
if !ok { if !ok {
return fmt.Errorf("Expected []byte, received %T", value) return fmt.Errorf("Expected []byte, received %T", value)
} }
w.Write(int32(len(b))) err := binary.Write(w, binary.BigEndian, int32(len(b)))
w.Write(b) if err != nil {
return err
}
return nil _, err = w.Write(b)
return err
} }
func decodeDateFromText(mr *MessageReader, size int32) interface{} { func decodeDateFromText(mr *MessageReader, size int32) interface{} {
@@ -367,17 +388,20 @@ func decodeDateFromText(mr *MessageReader, size int32) interface{} {
return t return t
} }
func encodeDate(w *MessageWriter, value interface{}) error { func encodeDate(w io.Writer, value interface{}) error {
t, ok := value.(time.Time) t, ok := value.(time.Time)
if !ok { if !ok {
return fmt.Errorf("Expected time.Time, received %T", value) return fmt.Errorf("Expected time.Time, received %T", value)
} }
s := t.Format("2006-01-02") s := t.Format("2006-01-02")
w.Write(int32(len(s))) err := binary.Write(w, binary.BigEndian, int32(len(s)))
w.WriteString(s) if err != nil {
return err
}
return nil _, err = io.WriteString(w, s)
return err
} }
func decodeTimestampTzFromText(mr *MessageReader, size int32) interface{} { func decodeTimestampTzFromText(mr *MessageReader, size int32) interface{} {
@@ -403,17 +427,20 @@ func decodeTimestampTzFromBinary(mr *MessageReader, size int32) interface{} {
} }
func encodeTimestampTz(w *MessageWriter, value interface{}) error { func encodeTimestampTz(w io.Writer, value interface{}) error {
t, ok := value.(time.Time) t, ok := value.(time.Time)
if !ok { if !ok {
return fmt.Errorf("Expected float32, received %T", value) return fmt.Errorf("Expected time.Time, received %T", value)
} }
s := t.Format("2006-01-02 15:04:05.999999 -0700") s := t.Format("2006-01-02 15:04:05.999999 -0700")
w.Write(int32(len(s))) err := binary.Write(w, binary.BigEndian, int32(len(s)))
w.WriteString(s) if err != nil {
return err
}
return nil _, err = io.WriteString(w, s)
return err
} }
func decodeInt2ArrayFromText(mr *MessageReader, size int32) interface{} { func decodeInt2ArrayFromText(mr *MessageReader, size int32) interface{} {
@@ -447,7 +474,7 @@ func int16SliceToArrayString(nums []int16) (string, error) {
return w.buf.String(), w.Err return w.buf.String(), w.Err
} }
func encodeInt2Array(w *MessageWriter, value interface{}) error { func encodeInt2Array(w io.Writer, value interface{}) error {
v, ok := value.([]int16) v, ok := value.([]int16)
if !ok { if !ok {
return fmt.Errorf("Expected []int16, received %T", value) return fmt.Errorf("Expected []int16, received %T", value)
@@ -458,10 +485,13 @@ func encodeInt2Array(w *MessageWriter, value interface{}) error {
return fmt.Errorf("Failed to encode []int16: %v", err) return fmt.Errorf("Failed to encode []int16: %v", err)
} }
w.Write(int32(len(s))) err = binary.Write(w, binary.BigEndian, int32(len(s)))
w.WriteString(s) if err != nil {
return err
}
return nil _, err = io.WriteString(w, s)
return err
} }
func decodeInt4ArrayFromText(mr *MessageReader, size int32) interface{} { func decodeInt4ArrayFromText(mr *MessageReader, size int32) interface{} {
@@ -495,7 +525,7 @@ func int32SliceToArrayString(nums []int32) (string, error) {
return w.buf.String(), w.Err return w.buf.String(), w.Err
} }
func encodeInt4Array(w *MessageWriter, value interface{}) error { func encodeInt4Array(w io.Writer, value interface{}) error {
v, ok := value.([]int32) v, ok := value.([]int32)
if !ok { if !ok {
return fmt.Errorf("Expected []int32, received %T", value) return fmt.Errorf("Expected []int32, received %T", value)
@@ -506,10 +536,13 @@ func encodeInt4Array(w *MessageWriter, value interface{}) error {
return fmt.Errorf("Failed to encode []int32: %v", err) return fmt.Errorf("Failed to encode []int32: %v", err)
} }
w.Write(int32(len(s))) err = binary.Write(w, binary.BigEndian, int32(len(s)))
w.WriteString(s) if err != nil {
return err
}
return nil _, err = io.WriteString(w, s)
return err
} }
func decodeInt8ArrayFromText(mr *MessageReader, size int32) interface{} { func decodeInt8ArrayFromText(mr *MessageReader, size int32) interface{} {
@@ -543,7 +576,7 @@ func int64SliceToArrayString(nums []int64) (string, error) {
return w.buf.String(), w.Err return w.buf.String(), w.Err
} }
func encodeInt8Array(w *MessageWriter, value interface{}) error { func encodeInt8Array(w io.Writer, value interface{}) error {
v, ok := value.([]int64) v, ok := value.([]int64)
if !ok { if !ok {
return fmt.Errorf("Expected []int64, received %T", value) return fmt.Errorf("Expected []int64, received %T", value)
@@ -554,8 +587,11 @@ func encodeInt8Array(w *MessageWriter, value interface{}) error {
return fmt.Errorf("Failed to encode []int64: %v", err) return fmt.Errorf("Failed to encode []int64: %v", err)
} }
w.Write(int32(len(s))) err = binary.Write(w, binary.BigEndian, int32(len(s)))
w.WriteString(s) if err != nil {
return err
}
return nil _, err = io.WriteString(w, s)
return err
} }