More docs and make ValueTranscoder visible.

pgx-vs-pq
Jack Christensen 2013-07-15 17:45:20 -05:00
parent 462df934ab
commit 1af652ce07
4 changed files with 36 additions and 24 deletions

View File

@ -48,16 +48,16 @@ func createNarrowTestData(b *testing.B, conn *Connection) {
func removeBinaryEncoders() (encoders 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
valueTranscoders[k].DecodeBinary = nil
ValueTranscoders[k].DecodeBinary = nil
}
return
}
func restoreBinaryEncoders(encoders map[Oid]func(*MessageReader, int32) interface{}) {
for k, v := range encoders {
valueTranscoders[k].DecodeBinary = v
ValueTranscoders[k].DecodeBinary = v
}
}

View File

@ -310,7 +310,7 @@ func (c *Connection) Prepare(name, sql string) (err error) {
ps.FieldDescriptions = c.rxRowDescription(r)
for i := range ps.FieldDescriptions {
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
}
}
@ -375,7 +375,7 @@ func (c *Connection) sendPreparedQuery(ps *preparedStatement, arguments ...inter
w.writeCString(ps.Name)
w.write(int16(len(ps.ParameterOids)))
for _, oid := range ps.ParameterOids {
transcoder := valueTranscoders[oid]
transcoder := ValueTranscoders[oid]
if transcoder == nil {
transcoder = defaultTranscoder
}
@ -384,7 +384,7 @@ func (c *Connection) sendPreparedQuery(ps *preparedStatement, arguments ...inter
w.write(int16(len(arguments)))
for i, oid := range ps.ParameterOids {
transcoder := valueTranscoders[oid]
transcoder := ValueTranscoders[oid]
if transcoder == nil {
transcoder = defaultTranscoder
}
@ -393,7 +393,7 @@ func (c *Connection) sendPreparedQuery(ps *preparedStatement, arguments ...inter
w.write(int16(len(ps.FieldDescriptions)))
for _, fd := range ps.FieldDescriptions {
transcoder := valueTranscoders[fd.DataType]
transcoder := ValueTranscoders[fd.DataType]
if transcoder != nil && transcoder.DecodeBinary != nil {
w.write(int16(1))
} else {

View File

@ -27,7 +27,7 @@ func (r *DataRowReader) ReadValue() interface{} {
size := r.mr.ReadInt32()
if size > -1 {
if vt, present := valueTranscoders[fieldDescription.DataType]; present {
if vt, present := ValueTranscoders[fieldDescription.DataType]; present {
switch fieldDescription.FormatCode {
case 0:
return vt.DecodeText(r.mr, size)

View File

@ -7,77 +7,89 @@ import (
"unsafe"
)
type valueTranscoder struct {
DecodeText func(*MessageReader, int32) interface{}
// ValueTranscoder stores all the data necessary to encode and decode values from
// 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{}
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
}
var valueTranscoders map[Oid]*valueTranscoder
var defaultTranscoder *valueTranscoder
// ValueTranscoders is used to transcode values being sent to and received from
// 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() {
valueTranscoders = make(map[Oid]*valueTranscoder)
ValueTranscoders = make(map[Oid]*ValueTranscoder)
// bool
valueTranscoders[Oid(16)] = &valueTranscoder{
ValueTranscoders[Oid(16)] = &ValueTranscoder{
DecodeText: decodeBoolFromText,
DecodeBinary: decodeBoolFromBinary,
EncodeTo: encodeBool,
EncodeFormat: 1}
// bytea
valueTranscoders[Oid(17)] = &valueTranscoder{
ValueTranscoders[Oid(17)] = &ValueTranscoder{
DecodeText: decodeByteaFromText,
EncodeTo: encodeBytea,
EncodeFormat: 1}
// int8
valueTranscoders[Oid(20)] = &valueTranscoder{
ValueTranscoders[Oid(20)] = &ValueTranscoder{
DecodeText: decodeInt8FromText,
DecodeBinary: decodeInt8FromBinary,
EncodeTo: encodeInt8,
EncodeFormat: 1}
// int2
valueTranscoders[Oid(21)] = &valueTranscoder{
ValueTranscoders[Oid(21)] = &ValueTranscoder{
DecodeText: decodeInt2FromText,
DecodeBinary: decodeInt2FromBinary,
EncodeTo: encodeInt2,
EncodeFormat: 1}
// int4
valueTranscoders[Oid(23)] = &valueTranscoder{
ValueTranscoders[Oid(23)] = &ValueTranscoder{
DecodeText: decodeInt4FromText,
DecodeBinary: decodeInt4FromBinary,
EncodeTo: encodeInt4,
EncodeFormat: 1}
// text
valueTranscoders[Oid(25)] = &valueTranscoder{
ValueTranscoders[Oid(25)] = &ValueTranscoder{
DecodeText: decodeTextFromText,
EncodeTo: encodeText}
// float4
valueTranscoders[Oid(700)] = &valueTranscoder{
ValueTranscoders[Oid(700)] = &ValueTranscoder{
DecodeText: decodeFloat4FromText,
DecodeBinary: decodeFloat4FromBinary,
EncodeTo: encodeFloat4,
EncodeFormat: 1}
// float8
valueTranscoders[Oid(701)] = &valueTranscoder{
ValueTranscoders[Oid(701)] = &ValueTranscoder{
DecodeText: decodeFloat8FromText,
DecodeBinary: decodeFloat8FromBinary,
EncodeTo: encodeFloat8,
EncodeFormat: 1}
// 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
defaultTranscoder = valueTranscoders[Oid(25)]
defaultTranscoder = ValueTranscoders[Oid(25)]
}
func decodeBoolFromText(mr *MessageReader, size int32) interface{} {