2
0

Add DataRowReader and change Connection.SelectFunc to use it

Preparatory step for structure binding. refs #11
This commit is contained in:
Jack Christensen
2013-05-01 08:51:09 -05:00
parent 78590be058
commit 36e4d74d30
7 changed files with 308 additions and 28 deletions
+10 -11
View File
@@ -93,7 +93,7 @@ func (c *Connection) Close() (err error) {
return
}
func (c *Connection) SelectFunc(sql string, onDataRow func(*MessageReader, []FieldDescription) error) (err error) {
func (c *Connection) SelectFunc(sql string, onDataRow func(*DataRowReader) error) (err error) {
if err = c.sendSimpleQuery(sql); err != nil {
return
}
@@ -115,7 +115,7 @@ func (c *Connection) SelectFunc(sql string, onDataRow func(*MessageReader, []Fie
fields = c.rxRowDescription(r)
case dataRow:
if callbackError == nil {
callbackError = onDataRow(r, fields)
callbackError = onDataRow(newDataRowReader(r, fields))
}
case commandComplete:
default:
@@ -137,8 +137,8 @@ func (c *Connection) SelectFunc(sql string, onDataRow func(*MessageReader, []Fie
// pattern when accessing the map
func (c *Connection) SelectRows(sql string) (rows []map[string]string, err error) {
rows = make([]map[string]string, 0, 8)
onDataRow := func(r *MessageReader, fields []FieldDescription) error {
rows = append(rows, c.rxDataRow(r, fields))
onDataRow := func(r *DataRowReader) error {
rows = append(rows, c.rxDataRow(r))
return nil
}
err = c.SelectFunc(sql, onDataRow)
@@ -312,22 +312,21 @@ func (c *Connection) rxRowDescription(r *MessageReader) (fields []FieldDescripti
return
}
func (c *Connection) rxDataRow(r *MessageReader, fields []FieldDescription) (row map[string]string) {
fieldCount := r.ReadInt16()
func (c *Connection) rxDataRow(r *DataRowReader) (row map[string]string) {
fieldCount := len(r.fields)
mr := r.mr
row = make(map[string]string, fieldCount)
for i := int16(0); i < fieldCount; i++ {
size := r.ReadInt32()
for i := 0; i < fieldCount; i++ {
size := mr.ReadInt32()
if size > -1 {
row[fields[i].Name] = r.ReadByteString(size)
row[r.fields[i].Name] = mr.ReadByteString(size)
}
}
return
}
func (c *Connection) rxDataRowFirstValue(r *MessageReader) (s string, null bool) {
r.ReadInt16() // ignore field count
size := r.ReadInt32()
if size > -1 {
s = r.ReadByteString(size)