Use interace{} returning SelectValue(s)
Instead of SelectInt32, SelectAllString, etc. fixes #19
This commit is contained in:
+54
-70
@@ -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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user