Use flyweight for DataRowReader

scan-io
Jack Christensen 2014-06-27 08:00:32 -05:00
parent 84dd626bcc
commit e8f367ede4
2 changed files with 10 additions and 16 deletions

13
conn.go
View File

@ -64,6 +64,7 @@ type Conn struct {
alive bool alive bool
causeOfDeath error causeOfDeath error
logger log.Logger logger log.Logger
drr DataRowReader
} }
type PreparedStatement struct { type PreparedStatement struct {
@ -328,10 +329,16 @@ func (c *Conn) selectFunc(sql string, onDataRow func(*DataRowReader) error, argu
fields = c.rxRowDescription(r) fields = c.rxRowDescription(r)
case dataRow: case dataRow:
if softErr == nil { if softErr == nil {
var drr *DataRowReader c.drr.mr = r
drr, softErr = newDataRowReader(r, fields) c.drr.FieldDescriptions = fields
c.drr.currentFieldIdx = 0
fieldCount := int(r.ReadInt16())
if fieldCount != len(fields) {
softErr = ProtocolError(fmt.Sprintf("Row description field count (%v) and data row field count (%v) do not match", len(fields), fieldCount))
}
if softErr == nil { if softErr == nil {
softErr = onDataRow(drr) softErr = onDataRow(&c.drr)
} }
} }
case commandComplete: case commandComplete:

View File

@ -11,19 +11,6 @@ type DataRowReader struct {
currentFieldIdx int currentFieldIdx int
} }
func newDataRowReader(mr *MessageReader, fields []FieldDescription) (r *DataRowReader, err error) {
r = new(DataRowReader)
r.mr = mr
r.FieldDescriptions = fields
fieldCount := int(mr.ReadInt16())
if fieldCount != len(fields) {
return nil, ProtocolError(fmt.Sprintf("Row description field count (%v) and data row field count (%v) do not match", len(fields), fieldCount))
}
return
}
// ReadValue returns the next value from the current row. // ReadValue returns the next value from the current row.
func (r *DataRowReader) ReadValue() interface{} { func (r *DataRowReader) ReadValue() interface{} {
fieldDescription := r.FieldDescriptions[r.currentFieldIdx] fieldDescription := r.FieldDescriptions[r.currentFieldIdx]