Use flyweight for DataRowReader
This commit is contained in:
@@ -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:
|
||||||
|
|||||||
@@ -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]
|
||||||
|
|||||||
Reference in New Issue
Block a user