More docs and make ValueTranscoder visible.
This commit is contained in:
+3
-3
@@ -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
@@ -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
@@ -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
@@ -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{} {
|
||||||
|
|||||||
Reference in New Issue
Block a user