Skip to content

Commit d10c04b

Browse files
committed
Merge pull request #149 from go-sql-driver/em_rows
Make BinaryRows and TextRows distinct types
2 parents 4615006 + c727bbb commit d10c04b

File tree

4 files changed

+42
-21
lines changed

4 files changed

+42
-21
lines changed

connection.go

+4-2
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,8 @@ func (mc *mysqlConn) Query(query string, args []driver.Value) (driver.Rows, erro
211211
var resLen int
212212
resLen, err = mc.readResultSetHeaderPacket()
213213
if err == nil {
214-
rows := &mysqlRows{mc, nil, false}
214+
rows := new(textRows)
215+
rows.mc = mc
215216

216217
if resLen > 0 {
217218
// Columns
@@ -238,7 +239,8 @@ func (mc *mysqlConn) getSystemVar(name string) ([]byte, error) {
238239
// Read Result
239240
resLen, err := mc.readResultSetHeaderPacket()
240241
if err == nil {
241-
rows := &mysqlRows{mc, nil, false}
242+
rows := new(textRows)
243+
rows.mc = mc
242244

243245
if resLen > 0 {
244246
// Columns

packets.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -620,7 +620,7 @@ func (mc *mysqlConn) readColumns(count int) ([]mysqlField, error) {
620620

621621
// Read Packets as Field Packets until EOF-Packet or an Error appears
622622
// http://dev.mysql.com/doc/internals/en/com-query-response.html#packet-ProtocolText::ResultsetRow
623-
func (rows *mysqlRows) readRow(dest []driver.Value) error {
623+
func (rows *textRows) readRow(dest []driver.Value) error {
624624
mc := rows.mc
625625

626626
data, err := mc.readPacket()
@@ -1002,7 +1002,7 @@ func (stmt *mysqlStmt) writeExecutePacket(args []driver.Value) error {
10021002
}
10031003

10041004
// http://dev.mysql.com/doc/internals/en/binary-protocol-resultset-row.html
1005-
func (rows *mysqlRows) readBinaryRow(dest []driver.Value) error {
1005+
func (rows *binaryRows) readRow(dest []driver.Value) error {
10061006
data, err := rows.mc.readPacket()
10071007
if err != nil {
10081008
return err

rows.go

+34-16
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,14 @@ type mysqlField struct {
2222
type mysqlRows struct {
2323
mc *mysqlConn
2424
columns []mysqlField
25-
binary bool
25+
}
26+
27+
type binaryRows struct {
28+
mysqlRows
29+
}
30+
31+
type textRows struct {
32+
mysqlRows
2633
}
2734

2835
func (rows *mysqlRows) Columns() []string {
@@ -41,28 +48,39 @@ func (rows *mysqlRows) Close() error {
4148
if mc.netConn == nil {
4249
return errInvalidConn
4350
}
51+
4452
// Remove unread packets from stream
4553
err := mc.readUntilEOF()
4654
rows.mc = nil
4755
return err
4856
}
4957

50-
func (rows *mysqlRows) Next(dest []driver.Value) (err error) {
51-
mc := rows.mc
52-
if mc == nil {
53-
return io.EOF
54-
}
55-
if mc.netConn == nil {
56-
return errInvalidConn
57-
}
58-
// Fetch next row from stream
59-
if rows.binary {
60-
err = rows.readBinaryRow(dest)
61-
} else {
62-
err = rows.readRow(dest)
58+
func (rows *binaryRows) Next(dest []driver.Value) error {
59+
if mc := rows.mc; mc != nil {
60+
if mc.netConn == nil {
61+
return errInvalidConn
62+
}
63+
64+
// Fetch next row from stream
65+
if err := rows.readRow(dest); err != io.EOF {
66+
return err
67+
}
68+
rows.mc = nil
6369
}
64-
if err == io.EOF {
70+
return io.EOF
71+
}
72+
73+
func (rows *textRows) Next(dest []driver.Value) error {
74+
if mc := rows.mc; mc != nil {
75+
if mc.netConn == nil {
76+
return errInvalidConn
77+
}
78+
79+
// Fetch next row from stream
80+
if err := rows.readRow(dest); err != io.EOF {
81+
return err
82+
}
6583
rows.mc = nil
6684
}
67-
return
85+
return io.EOF
6886
}

statement.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,8 @@ func (stmt *mysqlStmt) Query(args []driver.Value) (driver.Rows, error) {
9090
return nil, err
9191
}
9292

93-
rows := &mysqlRows{mc, nil, true}
93+
rows := new(binaryRows)
94+
rows.mc = mc
9495

9596
if resLen > 0 {
9697
// Columns

0 commit comments

Comments
 (0)