From c727bbb58b7bbf30c61285bffc301c97a11b73be Mon Sep 17 00:00:00 2001 From: Julien Schmidt Date: Wed, 30 Oct 2013 20:11:57 +0100 Subject: [PATCH] Make BinaryRows and TextRows distinct types --- connection.go | 6 ++++-- packets.go | 4 ++-- rows.go | 50 ++++++++++++++++++++++++++++++++++---------------- statement.go | 3 ++- 4 files changed, 42 insertions(+), 21 deletions(-) diff --git a/connection.go b/connection.go index 77a7f24e6..887c3798e 100644 --- a/connection.go +++ b/connection.go @@ -211,7 +211,8 @@ func (mc *mysqlConn) Query(query string, args []driver.Value) (driver.Rows, erro var resLen int resLen, err = mc.readResultSetHeaderPacket() if err == nil { - rows := &mysqlRows{mc, nil, false} + rows := new(textRows) + rows.mc = mc if resLen > 0 { // Columns @@ -238,7 +239,8 @@ func (mc *mysqlConn) getSystemVar(name string) ([]byte, error) { // Read Result resLen, err := mc.readResultSetHeaderPacket() if err == nil { - rows := &mysqlRows{mc, nil, false} + rows := new(textRows) + rows.mc = mc if resLen > 0 { // Columns diff --git a/packets.go b/packets.go index aff0fad62..2a0dab340 100644 --- a/packets.go +++ b/packets.go @@ -620,7 +620,7 @@ func (mc *mysqlConn) readColumns(count int) ([]mysqlField, error) { // Read Packets as Field Packets until EOF-Packet or an Error appears // http://dev.mysql.com/doc/internals/en/com-query-response.html#packet-ProtocolText::ResultsetRow -func (rows *mysqlRows) readRow(dest []driver.Value) error { +func (rows *textRows) readRow(dest []driver.Value) error { mc := rows.mc data, err := mc.readPacket() @@ -993,7 +993,7 @@ func (stmt *mysqlStmt) writeExecutePacket(args []driver.Value) error { } // http://dev.mysql.com/doc/internals/en/binary-protocol-resultset-row.html -func (rows *mysqlRows) readBinaryRow(dest []driver.Value) error { +func (rows *binaryRows) readRow(dest []driver.Value) error { data, err := rows.mc.readPacket() if err != nil { return err diff --git a/rows.go b/rows.go index b76118758..073d3e71a 100644 --- a/rows.go +++ b/rows.go @@ -22,7 +22,14 @@ type mysqlField struct { type mysqlRows struct { mc *mysqlConn columns []mysqlField - binary bool +} + +type binaryRows struct { + mysqlRows +} + +type textRows struct { + mysqlRows } func (rows *mysqlRows) Columns() []string { @@ -41,28 +48,39 @@ func (rows *mysqlRows) Close() error { if mc.netConn == nil { return errInvalidConn } + // Remove unread packets from stream err := mc.readUntilEOF() rows.mc = nil return err } -func (rows *mysqlRows) Next(dest []driver.Value) (err error) { - mc := rows.mc - if mc == nil { - return io.EOF - } - if mc.netConn == nil { - return errInvalidConn - } - // Fetch next row from stream - if rows.binary { - err = rows.readBinaryRow(dest) - } else { - err = rows.readRow(dest) +func (rows *binaryRows) Next(dest []driver.Value) error { + if mc := rows.mc; mc != nil { + if mc.netConn == nil { + return errInvalidConn + } + + // Fetch next row from stream + if err := rows.readRow(dest); err != io.EOF { + return err + } + rows.mc = nil } - if err == io.EOF { + return io.EOF +} + +func (rows *textRows) Next(dest []driver.Value) error { + if mc := rows.mc; mc != nil { + if mc.netConn == nil { + return errInvalidConn + } + + // Fetch next row from stream + if err := rows.readRow(dest); err != io.EOF { + return err + } rows.mc = nil } - return + return io.EOF } diff --git a/statement.go b/statement.go index 4a8e0dfe5..217817bf8 100644 --- a/statement.go +++ b/statement.go @@ -90,7 +90,8 @@ func (stmt *mysqlStmt) Query(args []driver.Value) (driver.Rows, error) { return nil, err } - rows := &mysqlRows{mc, nil, true} + rows := new(binaryRows) + rows.mc = mc if resLen > 0 { // Columns