2
0

More docs and make ValueTranscoder visible.

This commit is contained in:
Jack Christensen
2013-07-15 17:45:20 -05:00
parent 462df934ab
commit 1af652ce07
4 changed files with 36 additions and 24 deletions
+3 -3
View File
@@ -48,16 +48,16 @@ func createNarrowTestData(b *testing.B, conn *Connection) {
func removeBinaryEncoders() (encoders map[Oid]func(*MessageReader, int32) interface{}) { func removeBinaryEncoders() (encoders map[Oid]func(*MessageReader, int32) interface{}) {
encoders = make(map[Oid]func(*MessageReader, int32) interface{}) encoders = make(map[Oid]func(*MessageReader, int32) interface{})
for k, v := range valueTranscoders { for k, v := range ValueTranscoders {
encoders[k] = v.DecodeBinary encoders[k] = v.DecodeBinary
valueTranscoders[k].DecodeBinary = nil ValueTranscoders[k].DecodeBinary = nil
} }
return return
} }
func restoreBinaryEncoders(encoders map[Oid]func(*MessageReader, int32) interface{}) { func restoreBinaryEncoders(encoders map[Oid]func(*MessageReader, int32) interface{}) {
for k, v := range encoders { for k, v := range encoders {
valueTranscoders[k].DecodeBinary = v ValueTranscoders[k].DecodeBinary = v
} }
} }
+4 -4
View File
@@ -310,7 +310,7 @@ func (c *Connection) Prepare(name, sql string) (err error) {
ps.FieldDescriptions = c.rxRowDescription(r) ps.FieldDescriptions = c.rxRowDescription(r)
for i := range ps.FieldDescriptions { for i := range ps.FieldDescriptions {
oid := ps.FieldDescriptions[i].DataType oid := ps.FieldDescriptions[i].DataType
if valueTranscoders[oid] != nil && valueTranscoders[oid].DecodeBinary != nil { if ValueTranscoders[oid] != nil && ValueTranscoders[oid].DecodeBinary != nil {
ps.FieldDescriptions[i].FormatCode = 1 ps.FieldDescriptions[i].FormatCode = 1
} }
} }
@@ -375,7 +375,7 @@ func (c *Connection) sendPreparedQuery(ps *preparedStatement, arguments ...inter
w.writeCString(ps.Name) w.writeCString(ps.Name)
w.write(int16(len(ps.ParameterOids))) w.write(int16(len(ps.ParameterOids)))
for _, oid := range ps.ParameterOids { for _, oid := range ps.ParameterOids {
transcoder := valueTranscoders[oid] transcoder := ValueTranscoders[oid]
if transcoder == nil { if transcoder == nil {
transcoder = defaultTranscoder transcoder = defaultTranscoder
} }
@@ -384,7 +384,7 @@ func (c *Connection) sendPreparedQuery(ps *preparedStatement, arguments ...inter
w.write(int16(len(arguments))) w.write(int16(len(arguments)))
for i, oid := range ps.ParameterOids { for i, oid := range ps.ParameterOids {
transcoder := valueTranscoders[oid] transcoder := ValueTranscoders[oid]
if transcoder == nil { if transcoder == nil {
transcoder = defaultTranscoder transcoder = defaultTranscoder
} }
@@ -393,7 +393,7 @@ func (c *Connection) sendPreparedQuery(ps *preparedStatement, arguments ...inter
w.write(int16(len(ps.FieldDescriptions))) w.write(int16(len(ps.FieldDescriptions)))
for _, fd := range ps.FieldDescriptions { for _, fd := range ps.FieldDescriptions {
transcoder := valueTranscoders[fd.DataType] transcoder := ValueTranscoders[fd.DataType]
if transcoder != nil && transcoder.DecodeBinary != nil { if transcoder != nil && transcoder.DecodeBinary != nil {
w.write(int16(1)) w.write(int16(1))
} else { } else {
+1 -1
View File
@@ -27,7 +27,7 @@ func (r *DataRowReader) ReadValue() interface{} {
size := r.mr.ReadInt32() size := r.mr.ReadInt32()
if size > -1 { if size > -1 {
if vt, present := valueTranscoders[fieldDescription.DataType]; present { if vt, present := ValueTranscoders[fieldDescription.DataType]; present {
switch fieldDescription.FormatCode { switch fieldDescription.FormatCode {
case 0: case 0:
return vt.DecodeText(r.mr, size) return vt.DecodeText(r.mr, size)
+28 -16
View File
@@ -7,77 +7,89 @@ import (
"unsafe" "unsafe"
) )
type valueTranscoder struct { // ValueTranscoder stores all the data necessary to encode and decode values from
DecodeText func(*MessageReader, int32) interface{} // a PostgreSQL server
type ValueTranscoder struct {
// DecodeText decodes values returned from the server in text format
DecodeText func(*MessageReader, int32) interface{}
// DecodeBinary decodes values returned from the server in binary format
DecodeBinary func(*MessageReader, int32) interface{} DecodeBinary func(*MessageReader, int32) interface{}
EncodeTo func(*messageWriter, interface{}) // EncodeTo encodes values to send to the server
EncodeTo func(*messageWriter, interface{})
// EncodeFormat is the format values are encoded for transmission.
// 0 = text
// 1 = binary
EncodeFormat int16 EncodeFormat int16
} }
var valueTranscoders map[Oid]*valueTranscoder // ValueTranscoders is used to transcode values being sent to and received from
var defaultTranscoder *valueTranscoder // the PostgreSQL server. Additional types can be transcoded by adding a
// *ValueTranscoder for the appropriate Oid to the map.
var ValueTranscoders map[Oid]*ValueTranscoder
var defaultTranscoder *ValueTranscoder
func init() { func init() {
valueTranscoders = make(map[Oid]*valueTranscoder) ValueTranscoders = make(map[Oid]*ValueTranscoder)
// bool // bool
valueTranscoders[Oid(16)] = &valueTranscoder{ ValueTranscoders[Oid(16)] = &ValueTranscoder{
DecodeText: decodeBoolFromText, DecodeText: decodeBoolFromText,
DecodeBinary: decodeBoolFromBinary, DecodeBinary: decodeBoolFromBinary,
EncodeTo: encodeBool, EncodeTo: encodeBool,
EncodeFormat: 1} EncodeFormat: 1}
// bytea // bytea
valueTranscoders[Oid(17)] = &valueTranscoder{ ValueTranscoders[Oid(17)] = &ValueTranscoder{
DecodeText: decodeByteaFromText, DecodeText: decodeByteaFromText,
EncodeTo: encodeBytea, EncodeTo: encodeBytea,
EncodeFormat: 1} EncodeFormat: 1}
// int8 // int8
valueTranscoders[Oid(20)] = &valueTranscoder{ ValueTranscoders[Oid(20)] = &ValueTranscoder{
DecodeText: decodeInt8FromText, DecodeText: decodeInt8FromText,
DecodeBinary: decodeInt8FromBinary, DecodeBinary: decodeInt8FromBinary,
EncodeTo: encodeInt8, EncodeTo: encodeInt8,
EncodeFormat: 1} EncodeFormat: 1}
// int2 // int2
valueTranscoders[Oid(21)] = &valueTranscoder{ ValueTranscoders[Oid(21)] = &ValueTranscoder{
DecodeText: decodeInt2FromText, DecodeText: decodeInt2FromText,
DecodeBinary: decodeInt2FromBinary, DecodeBinary: decodeInt2FromBinary,
EncodeTo: encodeInt2, EncodeTo: encodeInt2,
EncodeFormat: 1} EncodeFormat: 1}
// int4 // int4
valueTranscoders[Oid(23)] = &valueTranscoder{ ValueTranscoders[Oid(23)] = &ValueTranscoder{
DecodeText: decodeInt4FromText, DecodeText: decodeInt4FromText,
DecodeBinary: decodeInt4FromBinary, DecodeBinary: decodeInt4FromBinary,
EncodeTo: encodeInt4, EncodeTo: encodeInt4,
EncodeFormat: 1} EncodeFormat: 1}
// text // text
valueTranscoders[Oid(25)] = &valueTranscoder{ ValueTranscoders[Oid(25)] = &ValueTranscoder{
DecodeText: decodeTextFromText, DecodeText: decodeTextFromText,
EncodeTo: encodeText} EncodeTo: encodeText}
// float4 // float4
valueTranscoders[Oid(700)] = &valueTranscoder{ ValueTranscoders[Oid(700)] = &ValueTranscoder{
DecodeText: decodeFloat4FromText, DecodeText: decodeFloat4FromText,
DecodeBinary: decodeFloat4FromBinary, DecodeBinary: decodeFloat4FromBinary,
EncodeTo: encodeFloat4, EncodeTo: encodeFloat4,
EncodeFormat: 1} EncodeFormat: 1}
// float8 // float8
valueTranscoders[Oid(701)] = &valueTranscoder{ ValueTranscoders[Oid(701)] = &ValueTranscoder{
DecodeText: decodeFloat8FromText, DecodeText: decodeFloat8FromText,
DecodeBinary: decodeFloat8FromBinary, DecodeBinary: decodeFloat8FromBinary,
EncodeTo: encodeFloat8, EncodeTo: encodeFloat8,
EncodeFormat: 1} EncodeFormat: 1}
// varchar -- same as text // varchar -- same as text
valueTranscoders[Oid(1043)] = valueTranscoders[Oid(25)] ValueTranscoders[Oid(1043)] = ValueTranscoders[Oid(25)]
// use text transcoder for anything we don't understand // use text transcoder for anything we don't understand
defaultTranscoder = valueTranscoders[Oid(25)] defaultTranscoder = ValueTranscoders[Oid(25)]
} }
func decodeBoolFromText(mr *MessageReader, size int32) interface{} { func decodeBoolFromText(mr *MessageReader, size int32) interface{} {