Use interace{} returning SelectValue(s)
Instead of SelectInt32, SelectAllString, etc. fixes #19
This commit is contained in:
@@ -158,6 +158,25 @@ func (c *Connection) SelectRow(sql string) (row map[string]string, err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *Connection) SelectValue(sql string) (v interface{}, err error) {
|
||||||
|
onDataRow := func(r *DataRowReader) error {
|
||||||
|
v = r.ReadValue()
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
err = c.SelectFunc(sql, onDataRow)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Connection) SelectValues(sql string) (values []interface{}, err error) {
|
||||||
|
values = make([]interface{}, 0, 8)
|
||||||
|
onDataRow := func(r *DataRowReader) error {
|
||||||
|
values = append(values, r.ReadValue())
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
err = c.SelectFunc(sql, onDataRow)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
func (c *Connection) sendSimpleQuery(sql string) (err error) {
|
func (c *Connection) sendSimpleQuery(sql string) (err error) {
|
||||||
bufSize := 5 + len(sql) + 1 // message identifier (1), message size (4), null string terminator (1)
|
bufSize := 5 + len(sql) + 1 // message identifier (1), message size (4), null string terminator (1)
|
||||||
buf := c.getBuf(bufSize)
|
buf := c.getBuf(bufSize)
|
||||||
|
|||||||
@@ -1,100 +0,0 @@
|
|||||||
package pgx
|
|
||||||
|
|
||||||
import (
|
|
||||||
"errors"
|
|
||||||
"strconv"
|
|
||||||
)
|
|
||||||
|
|
||||||
func (c *Connection) SelectAllString(sql string) (strings []string, err error) {
|
|
||||||
strings = make([]string, 0, 8)
|
|
||||||
onDataRow := func(r *DataRowReader) error {
|
|
||||||
s, null := c.rxDataRowFirstValue(r.mr)
|
|
||||||
if null {
|
|
||||||
return errors.New("Unexpected NULL")
|
|
||||||
}
|
|
||||||
strings = append(strings, s)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
err = c.SelectFunc(sql, onDataRow)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *Connection) SelectAllInt64(sql string) (ints []int64, err error) {
|
|
||||||
ints = make([]int64, 0, 8)
|
|
||||||
onDataRow := func(r *DataRowReader) (parseError error) {
|
|
||||||
s, null := c.rxDataRowFirstValue(r.mr)
|
|
||||||
if null {
|
|
||||||
return errors.New("Unexpected NULL")
|
|
||||||
}
|
|
||||||
var i int64
|
|
||||||
i, parseError = strconv.ParseInt(s, 10, 64)
|
|
||||||
ints = append(ints, i)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
err = c.SelectFunc(sql, onDataRow)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *Connection) SelectAllInt32(sql string) (ints []int32, err error) {
|
|
||||||
ints = make([]int32, 0, 8)
|
|
||||||
onDataRow := func(r *DataRowReader) (parseError error) {
|
|
||||||
s, null := c.rxDataRowFirstValue(r.mr)
|
|
||||||
if null {
|
|
||||||
return errors.New("Unexpected NULL")
|
|
||||||
}
|
|
||||||
var i int64
|
|
||||||
i, parseError = strconv.ParseInt(s, 10, 32)
|
|
||||||
ints = append(ints, int32(i))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
err = c.SelectFunc(sql, onDataRow)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *Connection) SelectAllInt16(sql string) (ints []int16, err error) {
|
|
||||||
ints = make([]int16, 0, 8)
|
|
||||||
onDataRow := func(r *DataRowReader) (parseError error) {
|
|
||||||
s, null := c.rxDataRowFirstValue(r.mr)
|
|
||||||
if null {
|
|
||||||
return errors.New("Unexpected NULL")
|
|
||||||
}
|
|
||||||
var i int64
|
|
||||||
i, parseError = strconv.ParseInt(s, 10, 16)
|
|
||||||
ints = append(ints, int16(i))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
err = c.SelectFunc(sql, onDataRow)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *Connection) SelectAllFloat64(sql string) (floats []float64, err error) {
|
|
||||||
floats = make([]float64, 0, 8)
|
|
||||||
onDataRow := func(r *DataRowReader) (parseError error) {
|
|
||||||
s, null := c.rxDataRowFirstValue(r.mr)
|
|
||||||
if null {
|
|
||||||
return errors.New("Unexpected NULL")
|
|
||||||
}
|
|
||||||
var f float64
|
|
||||||
f, parseError = strconv.ParseFloat(s, 64)
|
|
||||||
floats = append(floats, f)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
err = c.SelectFunc(sql, onDataRow)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *Connection) SelectAllFloat32(sql string) (floats []float32, err error) {
|
|
||||||
floats = make([]float32, 0, 8)
|
|
||||||
onDataRow := func(r *DataRowReader) (parseError error) {
|
|
||||||
s, null := c.rxDataRowFirstValue(r.mr)
|
|
||||||
if null {
|
|
||||||
return errors.New("Unexpected NULL")
|
|
||||||
}
|
|
||||||
var f float64
|
|
||||||
f, parseError = strconv.ParseFloat(s, 32)
|
|
||||||
floats = append(floats, float32(f))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
err = c.SelectFunc(sql, onDataRow)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
@@ -1,148 +0,0 @@
|
|||||||
package pgx
|
|
||||||
|
|
||||||
import (
|
|
||||||
"strings"
|
|
||||||
"testing"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestSelectAllString(t *testing.T) {
|
|
||||||
conn := getSharedConnection()
|
|
||||||
|
|
||||||
s, err := conn.SelectAllString("select * from (values ('Matthew'), ('Mark'), ('Luke'), ('John')) t")
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal("Unable to select all strings: " + err.Error())
|
|
||||||
}
|
|
||||||
|
|
||||||
if s[0] != "Matthew" || s[1] != "Mark" || s[2] != "Luke" || s[3] != "John" {
|
|
||||||
t.Error("Received incorrect strings")
|
|
||||||
}
|
|
||||||
|
|
||||||
_, err = conn.SelectAllString("select * from (values ('Matthew'), (null)) t")
|
|
||||||
if err == nil || !strings.Contains(err.Error(), "NULL") {
|
|
||||||
t.Error("Should have received error on null")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
func TestSelectAllInt64(t *testing.T) {
|
|
||||||
conn := getSharedConnection()
|
|
||||||
|
|
||||||
i, err := conn.SelectAllInt64("select * from (values (1), (2)) t")
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal("Unable to select all int64: " + err.Error())
|
|
||||||
}
|
|
||||||
|
|
||||||
if i[0] != 1 || i[1] != 2 {
|
|
||||||
t.Error("Received incorrect int64s")
|
|
||||||
}
|
|
||||||
|
|
||||||
i, err = conn.SelectAllInt64("select power(2,65)::numeric")
|
|
||||||
if err == nil || !strings.Contains(err.Error(), "value out of range") {
|
|
||||||
t.Error("Expected value out of range error when selecting number greater than max int64")
|
|
||||||
}
|
|
||||||
|
|
||||||
i, err = conn.SelectAllInt64("select -power(2,65)::numeric")
|
|
||||||
if err == nil || !strings.Contains(err.Error(), "value out of range") {
|
|
||||||
t.Error("Expected value out of range error when selecting number less than min int64")
|
|
||||||
}
|
|
||||||
|
|
||||||
_, err = conn.SelectAllInt64("select null")
|
|
||||||
if err == nil || !strings.Contains(err.Error(), "NULL") {
|
|
||||||
t.Error("Should have received error on null")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestSelectAllInt32(t *testing.T) {
|
|
||||||
conn := getSharedConnection()
|
|
||||||
|
|
||||||
i, err := conn.SelectAllInt32("select * from (values (1), (2)) t")
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal("Unable to select all int32: " + err.Error())
|
|
||||||
}
|
|
||||||
|
|
||||||
if i[0] != 1 || i[1] != 2 {
|
|
||||||
t.Error("Received incorrect int32s")
|
|
||||||
}
|
|
||||||
|
|
||||||
i, err = conn.SelectAllInt32("select power(2,33)::numeric")
|
|
||||||
if err == nil || !strings.Contains(err.Error(), "value out of range") {
|
|
||||||
t.Error("Expected value out of range error when selecting number greater than max int32")
|
|
||||||
}
|
|
||||||
|
|
||||||
i, err = conn.SelectAllInt32("select -power(2,33)::numeric")
|
|
||||||
if err == nil || !strings.Contains(err.Error(), "value out of range") {
|
|
||||||
t.Error("Expected value out of range error when selecting number less than min int32")
|
|
||||||
}
|
|
||||||
|
|
||||||
_, err = conn.SelectAllInt32("select null")
|
|
||||||
if err == nil || !strings.Contains(err.Error(), "NULL") {
|
|
||||||
t.Error("Should have received error on null")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestSelectAllInt16(t *testing.T) {
|
|
||||||
conn := getSharedConnection()
|
|
||||||
|
|
||||||
i, err := conn.SelectAllInt16("select * from (values (1), (2)) t")
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal("Unable to select all int16: " + err.Error())
|
|
||||||
}
|
|
||||||
|
|
||||||
if i[0] != 1 || i[1] != 2 {
|
|
||||||
t.Error("Received incorrect int16s")
|
|
||||||
}
|
|
||||||
|
|
||||||
i, err = conn.SelectAllInt16("select power(2,17)::numeric")
|
|
||||||
if err == nil || !strings.Contains(err.Error(), "value out of range") {
|
|
||||||
t.Error("Expected value out of range error when selecting number greater than max int16")
|
|
||||||
}
|
|
||||||
|
|
||||||
i, err = conn.SelectAllInt16("select -power(2,17)::numeric")
|
|
||||||
if err == nil || !strings.Contains(err.Error(), "value out of range") {
|
|
||||||
t.Error("Expected value out of range error when selecting number less than min int16")
|
|
||||||
}
|
|
||||||
|
|
||||||
_, err = conn.SelectAllInt16("select null")
|
|
||||||
if err == nil || !strings.Contains(err.Error(), "NULL") {
|
|
||||||
t.Error("Should have received error on null")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
func TestSelectAllFloat64(t *testing.T) {
|
|
||||||
conn := getSharedConnection()
|
|
||||||
|
|
||||||
f, err := conn.SelectAllFloat64("select * from (values (1.23), (4.56)) t")
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal("Unable to select all float64: " + err.Error())
|
|
||||||
}
|
|
||||||
|
|
||||||
if f[0] != 1.23 || f[1] != 4.56 {
|
|
||||||
t.Error("Received incorrect float64")
|
|
||||||
}
|
|
||||||
|
|
||||||
_, err = conn.SelectAllFloat64("select null")
|
|
||||||
if err == nil || !strings.Contains(err.Error(), "NULL") {
|
|
||||||
t.Error("Should have received error on null")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestSelectAllFloat32(t *testing.T) {
|
|
||||||
conn := getSharedConnection()
|
|
||||||
|
|
||||||
f, err := conn.SelectAllFloat32("select * from (values (1.23), (4.56)) t")
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal("Unable to select all float32: " + err.Error())
|
|
||||||
}
|
|
||||||
|
|
||||||
if f[0] != 1.23 || f[1] != 4.56 {
|
|
||||||
t.Error("Received incorrect float32")
|
|
||||||
}
|
|
||||||
|
|
||||||
_, err = conn.SelectAllFloat32("select null")
|
|
||||||
if err == nil || !strings.Contains(err.Error(), "NULL") {
|
|
||||||
t.Error("Should have received error on null")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,74 +0,0 @@
|
|||||||
package pgx
|
|
||||||
|
|
||||||
import (
|
|
||||||
"strings"
|
|
||||||
"testing"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestSelectAllString(t *testing.T) {
|
|
||||||
conn := getSharedConnection()
|
|
||||||
|
|
||||||
s, err := conn.SelectAllString("select * from (values ('Matthew'), ('Mark'), ('Luke'), ('John')) t")
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal("Unable to select all strings: " + err.Error())
|
|
||||||
}
|
|
||||||
|
|
||||||
if s[0] != "Matthew" || s[1] != "Mark" || s[2] != "Luke" || s[3] != "John" {
|
|
||||||
t.Error("Received incorrect strings")
|
|
||||||
}
|
|
||||||
|
|
||||||
_, err = conn.SelectAllString("select * from (values ('Matthew'), (null)) t")
|
|
||||||
if err == nil || !strings.Contains(err.Error(), "NULL") {
|
|
||||||
t.Error("Should have received error on null")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
<% [64, 32, 16].each do |size| %>
|
|
||||||
func TestSelectAllInt<%= size %>(t *testing.T) {
|
|
||||||
conn := getSharedConnection()
|
|
||||||
|
|
||||||
i, err := conn.SelectAllInt<%= size %>("select * from (values (1), (2)) t")
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal("Unable to select all int<%= size %>: " + err.Error())
|
|
||||||
}
|
|
||||||
|
|
||||||
if i[0] != 1 || i[1] != 2 {
|
|
||||||
t.Error("Received incorrect int<%= size %>s")
|
|
||||||
}
|
|
||||||
|
|
||||||
i, err = conn.SelectAllInt<%= size %>("select power(2,<%= size + 1 %>)::numeric")
|
|
||||||
if err == nil || !strings.Contains(err.Error(), "value out of range") {
|
|
||||||
t.Error("Expected value out of range error when selecting number greater than max int<%= size %>")
|
|
||||||
}
|
|
||||||
|
|
||||||
i, err = conn.SelectAllInt<%= size %>("select -power(2,<%= size + 1 %>)::numeric")
|
|
||||||
if err == nil || !strings.Contains(err.Error(), "value out of range") {
|
|
||||||
t.Error("Expected value out of range error when selecting number less than min int<%= size %>")
|
|
||||||
}
|
|
||||||
|
|
||||||
_, err = conn.SelectAllInt<%= size %>("select null")
|
|
||||||
if err == nil || !strings.Contains(err.Error(), "NULL") {
|
|
||||||
t.Error("Should have received error on null")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
<% end %>
|
|
||||||
|
|
||||||
<% [64, 32].each do |size| %>
|
|
||||||
func TestSelectAllFloat<%= size %>(t *testing.T) {
|
|
||||||
conn := getSharedConnection()
|
|
||||||
|
|
||||||
f, err := conn.SelectAllFloat<%= size %>("select * from (values (1.23), (4.56)) t")
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal("Unable to select all float<%= size %>: " + err.Error())
|
|
||||||
}
|
|
||||||
|
|
||||||
if f[0] != 1.23 || f[1] != 4.56 {
|
|
||||||
t.Error("Received incorrect float<%= size %>")
|
|
||||||
}
|
|
||||||
|
|
||||||
_, err = conn.SelectAllFloat<%= size %>("select null")
|
|
||||||
if err == nil || !strings.Contains(err.Error(), "NULL") {
|
|
||||||
t.Error("Should have received error on null")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
<% end %>
|
|
||||||
@@ -1,69 +0,0 @@
|
|||||||
package pgx
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"strconv"
|
|
||||||
)
|
|
||||||
|
|
||||||
func (c *Connection) SelectValue(sql string) (v interface{}, err error) {
|
|
||||||
onDataRow := func(r *DataRowReader) error {
|
|
||||||
size := r.mr.ReadInt32()
|
|
||||||
if size > -1 {
|
|
||||||
switch r.fields[0].DataType {
|
|
||||||
case oid(16): // bool
|
|
||||||
s := r.mr.ReadByteString(size)
|
|
||||||
switch s {
|
|
||||||
case "t":
|
|
||||||
v = true
|
|
||||||
case "f":
|
|
||||||
v = false
|
|
||||||
default:
|
|
||||||
fmt.Errorf("Received invalid bool: %v", s)
|
|
||||||
}
|
|
||||||
case oid(20): // int8
|
|
||||||
s := r.mr.ReadByteString(size)
|
|
||||||
v, err = strconv.ParseInt(s, 10, 64)
|
|
||||||
if err != nil {
|
|
||||||
fmt.Errorf("Received invalid int8: %v", s)
|
|
||||||
}
|
|
||||||
case oid(21): // int2
|
|
||||||
s := r.mr.ReadByteString(size)
|
|
||||||
var n int64
|
|
||||||
n, err = strconv.ParseInt(s, 10, 16)
|
|
||||||
if err != nil {
|
|
||||||
fmt.Errorf("Received invalid int2: %v", s)
|
|
||||||
}
|
|
||||||
v = int16(n)
|
|
||||||
case oid(23): // int4
|
|
||||||
s := r.mr.ReadByteString(size)
|
|
||||||
var n int64
|
|
||||||
n, err = strconv.ParseInt(s, 10, 32)
|
|
||||||
if err != nil {
|
|
||||||
fmt.Errorf("Received invalid int4: %v", s)
|
|
||||||
}
|
|
||||||
v = int32(n)
|
|
||||||
case oid(700): // float4
|
|
||||||
s := r.mr.ReadByteString(size)
|
|
||||||
var n float64
|
|
||||||
n, err = strconv.ParseFloat(s, 32)
|
|
||||||
if err != nil {
|
|
||||||
fmt.Errorf("Received invalid float4: %v", s)
|
|
||||||
}
|
|
||||||
v = float32(n)
|
|
||||||
case oid(701): //float8
|
|
||||||
s := r.mr.ReadByteString(size)
|
|
||||||
v, err = strconv.ParseFloat(s, 64)
|
|
||||||
if err != nil {
|
|
||||||
fmt.Errorf("Received invalid float8: %v", s)
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
v = r.mr.ReadByteString(size)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
v = nil
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
err = c.SelectFunc(sql, onDataRow)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
@@ -1,90 +0,0 @@
|
|||||||
package pgx
|
|
||||||
|
|
||||||
import (
|
|
||||||
"testing"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestSelectValue(t *testing.T) {
|
|
||||||
conn := getSharedConnection()
|
|
||||||
var v interface{}
|
|
||||||
var err error
|
|
||||||
|
|
||||||
v, err = conn.SelectValue("select null")
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("Unable to select null: %v", err)
|
|
||||||
} else {
|
|
||||||
if v != nil {
|
|
||||||
t.Errorf("Expected: nil, recieved: %v", v)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
v, err = conn.SelectValue("select 'foo'")
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("Unable to select string: %v", err)
|
|
||||||
} else {
|
|
||||||
s, ok := v.(string)
|
|
||||||
if !(ok && s == "foo") {
|
|
||||||
t.Errorf("Expected: foo, recieved: %#v", v)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
v, err = conn.SelectValue("select true")
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("Unable to select bool: %#v", err)
|
|
||||||
} else {
|
|
||||||
s, ok := v.(bool)
|
|
||||||
if !(ok && s == true) {
|
|
||||||
t.Errorf("Expected true, received: %#v", v)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
v, err = conn.SelectValue("select false")
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("Unable to select bool: %v", err)
|
|
||||||
} else {
|
|
||||||
s, ok := v.(bool)
|
|
||||||
if !(ok && s == false) {
|
|
||||||
t.Errorf("Expected false, received: %#v", v)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
v, err = conn.SelectValue("select 1::int2")
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("Unable to select int2: %v", err)
|
|
||||||
} else {
|
|
||||||
s, ok := v.(int16)
|
|
||||||
if !(ok && s == 1) {
|
|
||||||
t.Errorf("Expected 1, received: %#v", v)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
v, err = conn.SelectValue("select 1::int4")
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("Unable to select int4: %v", err)
|
|
||||||
} else {
|
|
||||||
s, ok := v.(int32)
|
|
||||||
if !(ok && s == 1) {
|
|
||||||
t.Errorf("Expected 1, received: %#v", v)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
v, err = conn.SelectValue("select 1::int8")
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("Unable to select int8: %#v", err)
|
|
||||||
} else {
|
|
||||||
s, ok := v.(int64)
|
|
||||||
if !(ok && s == 1) {
|
|
||||||
t.Errorf("Expected 1, received: %#v", v)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
v, err = conn.SelectValue("select 1.23::float4")
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("Unable to select float4: %#v", err)
|
|
||||||
} else {
|
|
||||||
s, ok := v.(float32)
|
|
||||||
if !(ok && s == float32(1.23)) {
|
|
||||||
t.Errorf("Expected 1.23, received: %#v", v)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
+108
-1
@@ -132,7 +132,7 @@ func TestSelectFunc(t *testing.T) {
|
|||||||
var sum, rowCount int32
|
var sum, rowCount int32
|
||||||
onDataRow := func(r *DataRowReader) error {
|
onDataRow := func(r *DataRowReader) error {
|
||||||
rowCount++
|
rowCount++
|
||||||
sum += r.ReadInt32()
|
sum += r.ReadValue().(int32)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -201,3 +201,110 @@ func TestSelectRow(t *testing.T) {
|
|||||||
t.Fatal("Query failed")
|
t.Fatal("Query failed")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestConnectionSelectValue(t *testing.T) {
|
||||||
|
conn := getSharedConnection()
|
||||||
|
var v interface{}
|
||||||
|
var err error
|
||||||
|
|
||||||
|
v, err = conn.SelectValue("select null")
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("Unable to select null: %v", err)
|
||||||
|
} else {
|
||||||
|
if v != nil {
|
||||||
|
t.Errorf("Expected: nil, recieved: %v", v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
v, err = conn.SelectValue("select 'foo'")
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("Unable to select string: %v", err)
|
||||||
|
} else {
|
||||||
|
s, ok := v.(string)
|
||||||
|
if !(ok && s == "foo") {
|
||||||
|
t.Errorf("Expected: foo, recieved: %#v", v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
v, err = conn.SelectValue("select true")
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("Unable to select bool: %#v", err)
|
||||||
|
} else {
|
||||||
|
s, ok := v.(bool)
|
||||||
|
if !(ok && s == true) {
|
||||||
|
t.Errorf("Expected true, received: %#v", v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
v, err = conn.SelectValue("select false")
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("Unable to select bool: %v", err)
|
||||||
|
} else {
|
||||||
|
s, ok := v.(bool)
|
||||||
|
if !(ok && s == false) {
|
||||||
|
t.Errorf("Expected false, received: %#v", v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
v, err = conn.SelectValue("select 1::int2")
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("Unable to select int2: %v", err)
|
||||||
|
} else {
|
||||||
|
s, ok := v.(int16)
|
||||||
|
if !(ok && s == 1) {
|
||||||
|
t.Errorf("Expected 1, received: %#v", v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
v, err = conn.SelectValue("select 1::int4")
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("Unable to select int4: %v", err)
|
||||||
|
} else {
|
||||||
|
s, ok := v.(int32)
|
||||||
|
if !(ok && s == 1) {
|
||||||
|
t.Errorf("Expected 1, received: %#v", v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
v, err = conn.SelectValue("select 1::int8")
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("Unable to select int8: %#v", err)
|
||||||
|
} else {
|
||||||
|
s, ok := v.(int64)
|
||||||
|
if !(ok && s == 1) {
|
||||||
|
t.Errorf("Expected 1, received: %#v", v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
v, err = conn.SelectValue("select 1.23::float4")
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("Unable to select float4: %#v", err)
|
||||||
|
} else {
|
||||||
|
s, ok := v.(float32)
|
||||||
|
if !(ok && s == float32(1.23)) {
|
||||||
|
t.Errorf("Expected 1.23, received: %#v", v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestSelectValues(t *testing.T) {
|
||||||
|
conn := getSharedConnection()
|
||||||
|
var values []interface{}
|
||||||
|
var err error
|
||||||
|
|
||||||
|
values, err = conn.SelectValues("select * from (values ('Matthew'), ('Mark'), ('Luke'), ('John')) t")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("Unable to select all strings: %v", err)
|
||||||
|
}
|
||||||
|
if values[0].(string) != "Matthew" || values[1].(string) != "Mark" || values[2].(string) != "Luke" || values[3].(string) != "John" {
|
||||||
|
t.Error("Received incorrect strings")
|
||||||
|
}
|
||||||
|
|
||||||
|
values, err = conn.SelectValues("select * from (values ('Matthew'), (null)) t")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("Unable to select values including a null: %v", err)
|
||||||
|
}
|
||||||
|
if values[0].(string) != "Matthew" || values[1] != nil {
|
||||||
|
t.Error("Received incorrect strings")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
+54
-70
@@ -1,6 +1,7 @@
|
|||||||
package pgx
|
package pgx
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
"strconv"
|
"strconv"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -22,76 +23,59 @@ func newDataRowReader(mr *MessageReader, fields []FieldDescription) (r *DataRowR
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *DataRowReader) ReadString() string {
|
func (r *DataRowReader) ReadValue() interface{} {
|
||||||
size := r.mr.ReadInt32()
|
size := r.mr.ReadInt32()
|
||||||
if size == -1 {
|
if size > -1 {
|
||||||
panic("Unexpected null")
|
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)
|
|
||||||
}
|
}
|
||||||
|
|||||||
+76
-101
@@ -4,114 +4,89 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestDataRowReaderReadString(t *testing.T) {
|
func TestDataRowReaderReadValue(t *testing.T) {
|
||||||
conn := getSharedConnection()
|
conn := getSharedConnection()
|
||||||
|
var v interface{}
|
||||||
|
var err error
|
||||||
|
|
||||||
var s string
|
|
||||||
onDataRow := func(r *DataRowReader) error {
|
onDataRow := func(r *DataRowReader) error {
|
||||||
s = r.ReadString()
|
v = r.ReadValue()
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
err := conn.SelectFunc("select 'Jack'", onDataRow)
|
err = conn.SelectFunc("select null", onDataRow)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal("Select failed: " + err.Error())
|
t.Fatalf("Select failed: %v", err)
|
||||||
}
|
}
|
||||||
if s != "Jack" {
|
if v != nil {
|
||||||
t.Error("Wrong value returned")
|
t.Errorf("Wrong value returned: %v", v)
|
||||||
|
}
|
||||||
|
|
||||||
|
err = conn.SelectFunc("select 'Jack'", onDataRow)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("Select failed: %v", err)
|
||||||
|
}
|
||||||
|
if typedValue, _ := v.(string); typedValue != "Jack" {
|
||||||
|
t.Errorf("Wrong value returned: %v", typedValue)
|
||||||
|
}
|
||||||
|
|
||||||
|
err = conn.SelectFunc("select true", onDataRow)
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("Unable to select bool: %#v", err)
|
||||||
|
} else {
|
||||||
|
s, ok := v.(bool)
|
||||||
|
if !(ok && s == true) {
|
||||||
|
t.Errorf("Expected true, received: %#v", v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
err = conn.SelectFunc("select false", onDataRow)
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("Unable to select bool: %v", err)
|
||||||
|
} else {
|
||||||
|
s, ok := v.(bool)
|
||||||
|
if !(ok && s == false) {
|
||||||
|
t.Errorf("Expected false, received: %#v", v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
err = conn.SelectFunc("select 1::int2", onDataRow)
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("Unable to select int2: %v", err)
|
||||||
|
} else {
|
||||||
|
s, ok := v.(int16)
|
||||||
|
if !(ok && s == 1) {
|
||||||
|
t.Errorf("Expected 1, received: %#v", v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
err = conn.SelectFunc("select 1::int4", onDataRow)
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("Unable to select int4: %v", err)
|
||||||
|
} else {
|
||||||
|
s, ok := v.(int32)
|
||||||
|
if !(ok && s == 1) {
|
||||||
|
t.Errorf("Expected 1, received: %#v", v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
err = conn.SelectFunc("select 1::int8", onDataRow)
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("Unable to select int8: %#v", err)
|
||||||
|
} else {
|
||||||
|
s, ok := v.(int64)
|
||||||
|
if !(ok && s == 1) {
|
||||||
|
t.Errorf("Expected 1, received: %#v", v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
err = conn.SelectFunc("select 1.23::float4", onDataRow)
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("Unable to select float4: %#v", err)
|
||||||
|
} else {
|
||||||
|
s, ok := v.(float32)
|
||||||
|
if !(ok && s == float32(1.23)) {
|
||||||
|
t.Errorf("Expected 1.23, received: %#v", v)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
func TestDataRowReaderReadInt64(t *testing.T) {
|
|
||||||
conn := getSharedConnection()
|
|
||||||
|
|
||||||
var n int64
|
|
||||||
onDataRow := func(r *DataRowReader) error {
|
|
||||||
n = r.ReadInt64()
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
err := conn.SelectFunc("select 1", onDataRow)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal("Select failed: " + err.Error())
|
|
||||||
}
|
|
||||||
if n != 1 {
|
|
||||||
t.Error("Wrong value returned")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestDataRowReaderReadInt32(t *testing.T) {
|
|
||||||
conn := getSharedConnection()
|
|
||||||
|
|
||||||
var n int32
|
|
||||||
onDataRow := func(r *DataRowReader) error {
|
|
||||||
n = r.ReadInt32()
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
err := conn.SelectFunc("select 1", onDataRow)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal("Select failed: " + err.Error())
|
|
||||||
}
|
|
||||||
if n != 1 {
|
|
||||||
t.Error("Wrong value returned")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestDataRowReaderReadInt16(t *testing.T) {
|
|
||||||
conn := getSharedConnection()
|
|
||||||
|
|
||||||
var n int16
|
|
||||||
onDataRow := func(r *DataRowReader) error {
|
|
||||||
n = r.ReadInt16()
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
err := conn.SelectFunc("select 1", onDataRow)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal("Select failed: " + err.Error())
|
|
||||||
}
|
|
||||||
if n != 1 {
|
|
||||||
t.Error("Wrong value returned")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
func TestDataRowReaderReadFloat64(t *testing.T) {
|
|
||||||
conn := getSharedConnection()
|
|
||||||
|
|
||||||
var n float64
|
|
||||||
onDataRow := func(r *DataRowReader) error {
|
|
||||||
n = r.ReadFloat64()
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
err := conn.SelectFunc("select 1.5", onDataRow)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal("Select failed: " + err.Error())
|
|
||||||
}
|
|
||||||
if n != 1.5 {
|
|
||||||
t.Error("Wrong value returned")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestDataRowReaderReadFloat32(t *testing.T) {
|
|
||||||
conn := getSharedConnection()
|
|
||||||
|
|
||||||
var n float32
|
|
||||||
onDataRow := func(r *DataRowReader) error {
|
|
||||||
n = r.ReadFloat32()
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
err := conn.SelectFunc("select 1.5", onDataRow)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal("Select failed: " + err.Error())
|
|
||||||
}
|
|
||||||
if n != 1.5 {
|
|
||||||
t.Error("Wrong value returned")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,63 +0,0 @@
|
|||||||
package pgx
|
|
||||||
|
|
||||||
import (
|
|
||||||
"testing"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestDataRowReaderReadString(t *testing.T) {
|
|
||||||
conn := getSharedConnection()
|
|
||||||
|
|
||||||
var s string
|
|
||||||
onDataRow := func(r *DataRowReader) error {
|
|
||||||
s = r.ReadString()
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
err := conn.SelectFunc("select 'Jack'", onDataRow)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal("Select failed: " + err.Error())
|
|
||||||
}
|
|
||||||
if s != "Jack" {
|
|
||||||
t.Error("Wrong value returned")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
<% [64, 32, 16].each do |size| %>
|
|
||||||
func TestDataRowReaderReadInt<%= size %>(t *testing.T) {
|
|
||||||
conn := getSharedConnection()
|
|
||||||
|
|
||||||
var n int<%= size %>
|
|
||||||
onDataRow := func(r *DataRowReader) error {
|
|
||||||
n = r.ReadInt<%= size %>()
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
err := conn.SelectFunc("select 1", onDataRow)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal("Select failed: " + err.Error())
|
|
||||||
}
|
|
||||||
if n != 1 {
|
|
||||||
t.Error("Wrong value returned")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
<% end %>
|
|
||||||
|
|
||||||
<% [64, 32].each do |size| %>
|
|
||||||
func TestDataRowReaderReadFloat<%= size %>(t *testing.T) {
|
|
||||||
conn := getSharedConnection()
|
|
||||||
|
|
||||||
var n float<%= size %>
|
|
||||||
onDataRow := func(r *DataRowReader) error {
|
|
||||||
n = r.ReadFloat<%= size %>()
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
err := conn.SelectFunc("select 1.5", onDataRow)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal("Select failed: " + err.Error())
|
|
||||||
}
|
|
||||||
if n != 1.5 {
|
|
||||||
t.Error("Wrong value returned")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
<% end %>
|
|
||||||
Reference in New Issue
Block a user