2
0

Add binary decoding for floats

This commit is contained in:
Jack Christensen
2013-07-11 12:42:17 -04:00
parent 01b7865abf
commit 8c7ea78485
2 changed files with 149 additions and 4 deletions
+27 -4
View File
@@ -4,6 +4,7 @@ import (
"encoding/hex"
"fmt"
"strconv"
"unsafe"
)
type valueTranscoder struct {
@@ -58,13 +59,15 @@ func init() {
// float4
valueTranscoders[oid(700)] = &valueTranscoder{
DecodeText: decodeFloat4FromText,
EncodeTo: encodeFloat4}
DecodeText: decodeFloat4FromText,
DecodeBinary: decodeFloat4FromBinary,
EncodeTo: encodeFloat4}
// float8
valueTranscoders[oid(701)] = &valueTranscoder{
DecodeText: decodeFloat8FromText,
EncodeTo: encodeFloat8}
DecodeText: decodeFloat8FromText,
DecodeBinary: decodeFloat8FromBinary,
EncodeTo: encodeFloat8}
// varchar -- same as text
valueTranscoders[oid(1043)] = valueTranscoders[oid(25)]
@@ -167,6 +170,16 @@ func decodeFloat4FromText(mr *MessageReader, size int32) interface{} {
return float32(n)
}
func decodeFloat4FromBinary(mr *MessageReader, size int32) interface{} {
if size != 4 {
panic("Received an invalid size for an float4")
}
i := mr.ReadInt32()
p := unsafe.Pointer(&i)
return *(*float32)(p)
}
func encodeFloat4(w *messageWriter, value interface{}) {
v := value.(float32)
s := strconv.FormatFloat(float64(v), 'e', -1, 32)
@@ -183,6 +196,16 @@ func decodeFloat8FromText(mr *MessageReader, size int32) interface{} {
return v
}
func decodeFloat8FromBinary(mr *MessageReader, size int32) interface{} {
if size != 8 {
panic("Received an invalid size for an float4")
}
i := mr.ReadInt64()
p := unsafe.Pointer(&i)
return *(*float64)(p)
}
func encodeFloat8(w *messageWriter, value interface{}) {
v := value.(float64)
s := strconv.FormatFloat(float64(v), 'e', -1, 64)