2
0

Refactor prepared statement path to use ValueTranscoder

This commit is contained in:
Jack Christensen
2013-07-01 16:40:53 -05:00
parent 5073a3b9e0
commit ecd3923968
2 changed files with 93 additions and 39 deletions
+81 -8
View File
@@ -1,15 +1,16 @@
package pgx
import (
"bytes"
"encoding/binary"
"fmt"
"io"
"strconv"
)
type valueTranscoder struct {
DecodeText func(*MessageReader, int32) interface{}
DecodeBinary func(*MessageReader, int32) interface{}
EncodeTo func(io.Writer, interface{})
EncodeTo func(*bytes.Buffer, interface{})
EncodeFormat int16
}
@@ -19,22 +20,42 @@ func init() {
valueTranscoders = make(map[oid]*valueTranscoder)
// bool
valueTranscoders[oid(16)] = &valueTranscoder{DecodeText: decodeBoolFromText}
valueTranscoders[oid(16)] = &valueTranscoder{
DecodeText: decodeBoolFromText,
EncodeTo: encodeBool}
// int8
valueTranscoders[oid(20)] = &valueTranscoder{DecodeText: decodeInt8FromText}
valueTranscoders[oid(20)] = &valueTranscoder{
DecodeText: decodeInt8FromText,
EncodeTo: encodeInt8}
// int2
valueTranscoders[oid(21)] = &valueTranscoder{DecodeText: decodeInt2FromText}
valueTranscoders[oid(21)] = &valueTranscoder{
DecodeText: decodeInt2FromText,
EncodeTo: encodeInt2}
// int4
valueTranscoders[oid(23)] = &valueTranscoder{DecodeText: decodeInt4FromText}
valueTranscoders[oid(23)] = &valueTranscoder{
DecodeText: decodeInt4FromText,
EncodeTo: encodeInt4}
// text
valueTranscoders[oid(25)] = &valueTranscoder{
DecodeText: decodeTextFromText,
EncodeTo: encodeText}
// float4
valueTranscoders[oid(700)] = &valueTranscoder{DecodeText: decodeFloat4FromText}
valueTranscoders[oid(700)] = &valueTranscoder{
DecodeText: decodeFloat4FromText,
EncodeTo: encodeFloat4}
// float8
valueTranscoders[oid(701)] = &valueTranscoder{DecodeText: decodeFloat8FromText}
valueTranscoders[oid(701)] = &valueTranscoder{
DecodeText: decodeFloat8FromText,
EncodeTo: encodeFloat8}
// varchar -- same as text
valueTranscoders[oid(1043)] = valueTranscoders[oid(25)]
}
func decodeBoolFromText(mr *MessageReader, size int32) interface{} {
@@ -49,6 +70,13 @@ func decodeBoolFromText(mr *MessageReader, size int32) interface{} {
}
}
func encodeBool(buf *bytes.Buffer, value interface{}) {
v := value.(bool)
s := strconv.FormatBool(v)
binary.Write(buf, binary.BigEndian, int32(len(s)))
buf.WriteString(s)
}
func decodeInt8FromText(mr *MessageReader, size int32) interface{} {
s := mr.ReadByteString(size)
n, err := strconv.ParseInt(s, 10, 64)
@@ -58,6 +86,13 @@ func decodeInt8FromText(mr *MessageReader, size int32) interface{} {
return n
}
func encodeInt8(buf *bytes.Buffer, value interface{}) {
v := value.(int64)
s := strconv.FormatInt(int64(v), 10)
binary.Write(buf, binary.BigEndian, int32(len(s)))
buf.WriteString(s)
}
func decodeInt2FromText(mr *MessageReader, size int32) interface{} {
s := mr.ReadByteString(size)
n, err := strconv.ParseInt(s, 10, 16)
@@ -67,6 +102,13 @@ func decodeInt2FromText(mr *MessageReader, size int32) interface{} {
return int16(n)
}
func encodeInt2(buf *bytes.Buffer, value interface{}) {
v := value.(int16)
s := strconv.FormatInt(int64(v), 10)
binary.Write(buf, binary.BigEndian, int32(len(s)))
buf.WriteString(s)
}
func decodeInt4FromText(mr *MessageReader, size int32) interface{} {
s := mr.ReadByteString(size)
n, err := strconv.ParseInt(s, 10, 32)
@@ -76,6 +118,13 @@ func decodeInt4FromText(mr *MessageReader, size int32) interface{} {
return int32(n)
}
func encodeInt4(buf *bytes.Buffer, value interface{}) {
v := value.(int32)
s := strconv.FormatInt(int64(v), 10)
binary.Write(buf, binary.BigEndian, int32(len(s)))
buf.WriteString(s)
}
func decodeFloat4FromText(mr *MessageReader, size int32) interface{} {
s := mr.ReadByteString(size)
n, err := strconv.ParseFloat(s, 32)
@@ -85,6 +134,13 @@ func decodeFloat4FromText(mr *MessageReader, size int32) interface{} {
return float32(n)
}
func encodeFloat4(buf *bytes.Buffer, value interface{}) {
v := value.(float32)
s := strconv.FormatFloat(float64(v), 'e', -1, 32)
binary.Write(buf, binary.BigEndian, int32(len(s)))
buf.WriteString(s)
}
func decodeFloat8FromText(mr *MessageReader, size int32) interface{} {
s := mr.ReadByteString(size)
v, err := strconv.ParseFloat(s, 64)
@@ -93,3 +149,20 @@ func decodeFloat8FromText(mr *MessageReader, size int32) interface{} {
}
return v
}
func encodeFloat8(buf *bytes.Buffer, value interface{}) {
v := value.(float64)
s := strconv.FormatFloat(float64(v), 'e', -1, 64)
binary.Write(buf, binary.BigEndian, int32(len(s)))
buf.WriteString(s)
}
func decodeTextFromText(mr *MessageReader, size int32) interface{} {
return mr.ReadByteString(size)
}
func encodeText(buf *bytes.Buffer, value interface{}) {
s := value.(string)
binary.Write(buf, binary.BigEndian, int32(len(s)))
buf.WriteString(s)
}