mirror of https://github.com/jackc/pgx.git
96 lines
2.2 KiB
Go
96 lines
2.2 KiB
Go
package pgx
|
|
|
|
import (
|
|
"fmt"
|
|
"io"
|
|
"strconv"
|
|
)
|
|
|
|
type valueTranscoder struct {
|
|
DecodeText func(*MessageReader, int32) interface{}
|
|
DecodeBinary func(*MessageReader, int32) interface{}
|
|
EncodeTo func(io.Writer, interface{})
|
|
EncodeFormat int16
|
|
}
|
|
|
|
var valueTranscoders map[oid]*valueTranscoder
|
|
|
|
func init() {
|
|
valueTranscoders = make(map[oid]*valueTranscoder)
|
|
|
|
// bool
|
|
valueTranscoders[oid(16)] = &valueTranscoder{DecodeText: decodeBoolFromText}
|
|
|
|
// int8
|
|
valueTranscoders[oid(20)] = &valueTranscoder{DecodeText: decodeInt8FromText}
|
|
|
|
// int2
|
|
valueTranscoders[oid(21)] = &valueTranscoder{DecodeText: decodeInt2FromText}
|
|
|
|
// int4
|
|
valueTranscoders[oid(23)] = &valueTranscoder{DecodeText: decodeInt4FromText}
|
|
|
|
// float4
|
|
valueTranscoders[oid(700)] = &valueTranscoder{DecodeText: decodeFloat4FromText}
|
|
|
|
// float8
|
|
valueTranscoders[oid(701)] = &valueTranscoder{DecodeText: decodeFloat8FromText}
|
|
}
|
|
|
|
func decodeBoolFromText(mr *MessageReader, size int32) interface{} {
|
|
s := mr.ReadByteString(size)
|
|
switch s {
|
|
case "t":
|
|
return true
|
|
case "f":
|
|
return false
|
|
default:
|
|
panic(fmt.Sprintf("Received invalid bool: %v", s))
|
|
}
|
|
}
|
|
|
|
func decodeInt8FromText(mr *MessageReader, size int32) interface{} {
|
|
s := mr.ReadByteString(size)
|
|
n, err := strconv.ParseInt(s, 10, 64)
|
|
if err != nil {
|
|
panic(fmt.Sprintf("Received invalid int8: %v", s))
|
|
}
|
|
return n
|
|
}
|
|
|
|
func decodeInt2FromText(mr *MessageReader, size int32) interface{} {
|
|
s := mr.ReadByteString(size)
|
|
n, err := strconv.ParseInt(s, 10, 16)
|
|
if err != nil {
|
|
panic(fmt.Sprintf("Received invalid int2: %v", s))
|
|
}
|
|
return int16(n)
|
|
}
|
|
|
|
func decodeInt4FromText(mr *MessageReader, size int32) interface{} {
|
|
s := mr.ReadByteString(size)
|
|
n, err := strconv.ParseInt(s, 10, 32)
|
|
if err != nil {
|
|
panic(fmt.Sprintf("Received invalid int4: %v", s))
|
|
}
|
|
return int32(n)
|
|
}
|
|
|
|
func decodeFloat4FromText(mr *MessageReader, size int32) interface{} {
|
|
s := mr.ReadByteString(size)
|
|
n, err := strconv.ParseFloat(s, 32)
|
|
if err != nil {
|
|
panic(fmt.Sprintf("Received invalid float4: %v", s))
|
|
}
|
|
return float32(n)
|
|
}
|
|
|
|
func decodeFloat8FromText(mr *MessageReader, size int32) interface{} {
|
|
s := mr.ReadByteString(size)
|
|
v, err := strconv.ParseFloat(s, 64)
|
|
if err != nil {
|
|
panic(fmt.Sprintf("Received invalid float8: %v", s))
|
|
}
|
|
return v
|
|
}
|