2
0

Use interace{} returning SelectValue(s)

Instead of SelectInt32, SelectAllString, etc.

fixes #19
This commit is contained in:
Jack Christensen
2013-06-29 12:07:31 -05:00
parent d1fda1b21c
commit 520da3a102
10 changed files with 257 additions and 716 deletions
+54 -70
View File
@@ -1,6 +1,7 @@
package pgx
import (
"fmt"
"strconv"
)
@@ -22,76 +23,59 @@ func newDataRowReader(mr *MessageReader, fields []FieldDescription) (r *DataRowR
return
}
func (r *DataRowReader) ReadString() string {
func (r *DataRowReader) ReadValue() interface{} {
size := r.mr.ReadInt32()
if size == -1 {
panic("Unexpected null")
if size > -1 {
switch r.fields[0].DataType {
case oid(16): // bool
s := r.mr.ReadByteString(size)
switch s {
case "t":
return true
case "f":
return false
default:
panic(fmt.Sprintf("Received invalid bool: %v", s))
}
case oid(20): // int8
s := r.mr.ReadByteString(size)
n, err := strconv.ParseInt(s, 10, 64)
if err != nil {
panic(fmt.Sprintf("Received invalid int8: %v", s))
}
return n
case oid(21): // int2
s := r.mr.ReadByteString(size)
n, err := strconv.ParseInt(s, 10, 16)
if err != nil {
panic(fmt.Sprintf("Received invalid int2: %v", s))
}
return int16(n)
case oid(23): // int4
s := r.mr.ReadByteString(size)
n, err := strconv.ParseInt(s, 10, 32)
if err != nil {
panic(fmt.Sprintf("Received invalid int4: %v", s))
}
return int32(n)
case oid(700): // float4
s := r.mr.ReadByteString(size)
n, err := strconv.ParseFloat(s, 32)
if err != nil {
panic(fmt.Sprintf("Received invalid float4: %v", s))
}
return float32(n)
case oid(701): //float8
s := r.mr.ReadByteString(size)
v, err := strconv.ParseFloat(s, 64)
if err != nil {
panic(fmt.Sprintf("Received invalid float8: %v", s))
}
return v
default:
return r.mr.ReadByteString(size)
}
} else {
return nil
}
return r.mr.ReadByteString(size)
}
func (r *DataRowReader) ReadInt64() int64 {
size := r.mr.ReadInt32()
if size == -1 {
panic("Unexpected null")
}
i64, err := strconv.ParseInt(r.mr.ReadByteString(size), 10, 64)
if err != nil {
panic("Number too large")
}
return i64
}
func (r *DataRowReader) ReadInt32() int32 {
size := r.mr.ReadInt32()
if size == -1 {
panic("Unexpected null")
}
i64, err := strconv.ParseInt(r.mr.ReadByteString(size), 10, 32)
if err != nil {
panic("Number too large")
}
return int32(i64)
}
func (r *DataRowReader) ReadInt16() int16 {
size := r.mr.ReadInt32()
if size == -1 {
panic("Unexpected null")
}
i64, err := strconv.ParseInt(r.mr.ReadByteString(size), 10, 16)
if err != nil {
panic("Number too large")
}
return int16(i64)
}
func (r *DataRowReader) ReadFloat64() float64 {
size := r.mr.ReadInt32()
if size == -1 {
panic("Unexpected null")
}
f64, err := strconv.ParseFloat(r.mr.ReadByteString(size), 64)
if err != nil {
panic("Number too large")
}
return f64
}
func (r *DataRowReader) ReadFloat32() float32 {
size := r.mr.ReadInt32()
if size == -1 {
panic("Unexpected null")
}
f64, err := strconv.ParseFloat(r.mr.ReadByteString(size), 32)
if err != nil {
panic("Number too large")
}
return float32(f64)
}