From 3d833090b657218b16ae343107a51f04f7f06aae Mon Sep 17 00:00:00 2001 From: cnphpbb Date: Tue, 5 May 2015 16:09:38 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E6=9B=B4=E6=96=B0=EF=BC=8C=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E4=B8=8D=E8=83=BD=E8=B0=83=E7=94=A8=E5=AD=98=E5=82=A8?= =?UTF-8?q?=E8=BF=87=E7=A8=8B=E5=8F=8A=E5=85=B6=E7=9B=B8=E5=85=B3BUG?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 25 +++++++++++++++++++++++++ .travis.yml | 0 AUTHORS | 1 + CHANGELOG.md | 0 CONTRIBUTING.md | 0 LICENSE | 0 README.md | 0 appengine.go | 0 benchmark_test.go | 0 buffer.go | 0 collations.go | 0 connection.go | 0 const.go | 0 driver.go | 0 driver_test.go | 0 errors.go | 0 errors_test.go | 0 infile.go | 0 packets.go | 47 +++++++++++++++++++++++++++++++++++++++++++++-- result.go | 0 rows.go | 8 +++++++- statement.go | 2 +- transaction.go | 0 utils.go | 0 utils_test.go | 0 25 files changed, 79 insertions(+), 4 deletions(-) mode change 100644 => 100755 .gitignore mode change 100644 => 100755 .travis.yml mode change 100644 => 100755 AUTHORS mode change 100644 => 100755 CHANGELOG.md mode change 100644 => 100755 CONTRIBUTING.md mode change 100644 => 100755 LICENSE mode change 100644 => 100755 README.md mode change 100644 => 100755 appengine.go mode change 100644 => 100755 benchmark_test.go mode change 100644 => 100755 buffer.go mode change 100644 => 100755 collations.go mode change 100644 => 100755 connection.go mode change 100644 => 100755 const.go mode change 100644 => 100755 driver.go mode change 100644 => 100755 driver_test.go mode change 100644 => 100755 errors.go mode change 100644 => 100755 errors_test.go mode change 100644 => 100755 infile.go mode change 100644 => 100755 packets.go mode change 100644 => 100755 result.go mode change 100644 => 100755 rows.go mode change 100644 => 100755 statement.go mode change 100644 => 100755 transaction.go mode change 100644 => 100755 utils.go mode change 100644 => 100755 utils_test.go diff --git a/.gitignore b/.gitignore old mode 100644 new mode 100755 index ba8e0cb3a..08cc1b1b8 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,28 @@ Icon? ehthumbs.db Thumbs.db + +# Compiled Object files, Static and Dynamic libs (Shared Objects) +*.o +*.a +*.so + +# Folders +_obj +_test + +# Architecture specific extensions/prefixes +*.[568vq] +[568vq].out + +*.cgo1.go +*.cgo2.c +_cgo_defun.c +_cgo_gotypes.go +_cgo_export.* + +_testmain.go + +*.exe +*.test +*.prof \ No newline at end of file diff --git a/.travis.yml b/.travis.yml old mode 100644 new mode 100755 diff --git a/AUTHORS b/AUTHORS old mode 100644 new mode 100755 index 4b65bf363..e6327792c --- a/AUTHORS +++ b/AUTHORS @@ -34,6 +34,7 @@ Runrioter Wung Soroush Pour Xiaobing Jiang Xiuming Chen +Kevin Geng # Organizations diff --git a/CHANGELOG.md b/CHANGELOG.md old mode 100644 new mode 100755 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md old mode 100644 new mode 100755 diff --git a/LICENSE b/LICENSE old mode 100644 new mode 100755 diff --git a/README.md b/README.md old mode 100644 new mode 100755 diff --git a/appengine.go b/appengine.go old mode 100644 new mode 100755 diff --git a/benchmark_test.go b/benchmark_test.go old mode 100644 new mode 100755 diff --git a/buffer.go b/buffer.go old mode 100644 new mode 100755 diff --git a/collations.go b/collations.go old mode 100644 new mode 100755 diff --git a/connection.go b/connection.go old mode 100644 new mode 100755 diff --git a/const.go b/const.go old mode 100644 new mode 100755 diff --git a/driver.go b/driver.go old mode 100644 new mode 100755 diff --git a/driver_test.go b/driver_test.go old mode 100644 new mode 100755 diff --git a/errors.go b/errors.go old mode 100644 new mode 100755 diff --git a/errors_test.go b/errors_test.go old mode 100644 new mode 100755 diff --git a/infile.go b/infile.go old mode 100644 new mode 100755 diff --git a/packets.go b/packets.go old mode 100644 new mode 100755 index 290a3887a..f29592c96 --- a/packets.go +++ b/packets.go @@ -214,6 +214,8 @@ func (mc *mysqlConn) writeAuthPacket(cipher []byte) error { clientLongPassword | clientTransactions | clientLocalFiles | + clientMultiStatements | + clientMultiResults | mc.flags&clientLongFlag if mc.cfg.clientFoundRows { @@ -470,6 +472,10 @@ func (mc *mysqlConn) handleErrorPacket(data []byte) error { } } +func readStatus(b []byte) statusFlag { + return statusFlag(b[0]) | statusFlag(b[1])<<8 +} + // Ok Packet // http://dev.mysql.com/doc/internals/en/generic-response-packets.html#packet-OK_Packet func (mc *mysqlConn) handleOkPacket(data []byte) error { @@ -484,7 +490,8 @@ func (mc *mysqlConn) handleOkPacket(data []byte) error { mc.insertId, _, m = readLengthEncodedInteger(data[1+n:]) // server_status [2 bytes] - mc.status = statusFlag(data[1+n+m]) | statusFlag(data[1+n+m+1])<<8 + //mc.status = statusFlag(data[1+n+m]) | statusFlag(data[1+n+m+1])<<8 + mc.status = readStatus(data[1+n+m : 1+n+m+2]) // warning count [2 bytes] if !mc.strict { @@ -603,6 +610,11 @@ func (rows *textRows) readRow(dest []driver.Value) error { // EOF Packet if data[0] == iEOF && len(data) == 5 { + // server_status [2 bytes] + rows.mc.status = readStatus(data[3:]) + if err := rows.mc.discardMoreResultsIfExists(); err != nil { + return err + } rows.mc = nil return io.EOF } @@ -660,6 +672,10 @@ func (mc *mysqlConn) readUntilEOF() error { if err == nil && data[0] != iEOF { continue } + if err == nil && data[0] == iEOF && len(data) == 5 { + mc.status = readStatus(data[3:]) + } + return err // Err or EOF } } @@ -964,6 +980,28 @@ func (stmt *mysqlStmt) writeExecutePacket(args []driver.Value) error { return mc.writePacket(data) } +func (mc *mysqlConn) discardMoreResultsIfExists() error { + for mc.status&statusMoreResultsExists != 0 { + resLen, err := mc.readResultSetHeaderPacket() + if err != nil { + return err + } + if resLen > 0 { + // columns + if err := mc.readUntilEOF(); err != nil { + return err + } + // rows + if err := mc.readUntilEOF(); err != nil { + return err + } + } else { + mc.status &^= statusMoreResultsExists + } + } + return nil +} + // http://dev.mysql.com/doc/internals/en/binary-protocol-resultset-row.html func (rows *binaryRows) readRow(dest []driver.Value) error { data, err := rows.mc.readPacket() @@ -973,11 +1011,16 @@ func (rows *binaryRows) readRow(dest []driver.Value) error { // packet indicator [1 byte] if data[0] != iOK { - rows.mc = nil // EOF Packet if data[0] == iEOF && len(data) == 5 { + rows.mc.status = readStatus(data[3:]) + if err := rows.mc.discardMoreResultsIfExists(); err != nil { + return err + } + rows.mc = nil return io.EOF } + rows.mc = nil // Error otherwise return rows.mc.handleErrorPacket(data) diff --git a/result.go b/result.go old mode 100644 new mode 100755 diff --git a/rows.go b/rows.go old mode 100644 new mode 100755 index 9d97d6d4f..7f281e8c0 --- a/rows.go +++ b/rows.go @@ -38,7 +38,7 @@ type emptyRows struct{} func (rows *mysqlRows) Columns() []string { columns := make([]string, len(rows.columns)) - if rows.mc.cfg.columnsWithAlias { + if rows.mc != nil && rows.mc.cfg.columnsWithAlias { for i := range columns { columns[i] = rows.columns[i].tableName + "." + rows.columns[i].name } @@ -61,6 +61,12 @@ func (rows *mysqlRows) Close() error { // Remove unread packets from stream err := mc.readUntilEOF() + if err == nil { + if err = mc.discardMoreResultsIfExists(); err != nil { + return err + } + } + rows.mc = nil return err } diff --git a/statement.go b/statement.go old mode 100644 new mode 100755 index f9dae03fa..3622f346d --- a/statement.go +++ b/statement.go @@ -100,9 +100,9 @@ func (stmt *mysqlStmt) Query(args []driver.Value) (driver.Rows, error) { } rows := new(binaryRows) - rows.mc = mc if resLen > 0 { + rows.mc = mc // Columns // If not cached, read them and cache them if stmt.columns == nil { diff --git a/transaction.go b/transaction.go old mode 100644 new mode 100755 diff --git a/utils.go b/utils.go old mode 100644 new mode 100755 diff --git a/utils_test.go b/utils_test.go old mode 100644 new mode 100755 From 3f80873c21684f3c28dbabecb05a27ba5af36d22 Mon Sep 17 00:00:00 2001 From: cnphpbb Date: Tue, 5 May 2015 17:13:45 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=9D=83=E9=99=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 0 .travis.yml | 0 AUTHORS | 0 CHANGELOG.md | 0 CONTRIBUTING.md | 0 LICENSE | 0 README.md | 0 appengine.go | 0 benchmark_test.go | 0 buffer.go | 0 collations.go | 0 connection.go | 0 const.go | 0 driver.go | 0 driver_test.go | 0 errors.go | 0 errors_test.go | 0 infile.go | 0 packets.go | 0 result.go | 0 rows.go | 0 statement.go | 0 transaction.go | 0 utils.go | 0 utils_test.go | 0 25 files changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 .gitignore mode change 100755 => 100644 .travis.yml mode change 100755 => 100644 AUTHORS mode change 100755 => 100644 CHANGELOG.md mode change 100755 => 100644 CONTRIBUTING.md mode change 100755 => 100644 LICENSE mode change 100755 => 100644 README.md mode change 100755 => 100644 appengine.go mode change 100755 => 100644 benchmark_test.go mode change 100755 => 100644 buffer.go mode change 100755 => 100644 collations.go mode change 100755 => 100644 connection.go mode change 100755 => 100644 const.go mode change 100755 => 100644 driver.go mode change 100755 => 100644 driver_test.go mode change 100755 => 100644 errors.go mode change 100755 => 100644 errors_test.go mode change 100755 => 100644 infile.go mode change 100755 => 100644 packets.go mode change 100755 => 100644 result.go mode change 100755 => 100644 rows.go mode change 100755 => 100644 statement.go mode change 100755 => 100644 transaction.go mode change 100755 => 100644 utils.go mode change 100755 => 100644 utils_test.go diff --git a/.gitignore b/.gitignore old mode 100755 new mode 100644 diff --git a/.travis.yml b/.travis.yml old mode 100755 new mode 100644 diff --git a/AUTHORS b/AUTHORS old mode 100755 new mode 100644 diff --git a/CHANGELOG.md b/CHANGELOG.md old mode 100755 new mode 100644 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md old mode 100755 new mode 100644 diff --git a/LICENSE b/LICENSE old mode 100755 new mode 100644 diff --git a/README.md b/README.md old mode 100755 new mode 100644 diff --git a/appengine.go b/appengine.go old mode 100755 new mode 100644 diff --git a/benchmark_test.go b/benchmark_test.go old mode 100755 new mode 100644 diff --git a/buffer.go b/buffer.go old mode 100755 new mode 100644 diff --git a/collations.go b/collations.go old mode 100755 new mode 100644 diff --git a/connection.go b/connection.go old mode 100755 new mode 100644 diff --git a/const.go b/const.go old mode 100755 new mode 100644 diff --git a/driver.go b/driver.go old mode 100755 new mode 100644 diff --git a/driver_test.go b/driver_test.go old mode 100755 new mode 100644 diff --git a/errors.go b/errors.go old mode 100755 new mode 100644 diff --git a/errors_test.go b/errors_test.go old mode 100755 new mode 100644 diff --git a/infile.go b/infile.go old mode 100755 new mode 100644 diff --git a/packets.go b/packets.go old mode 100755 new mode 100644 diff --git a/result.go b/result.go old mode 100755 new mode 100644 diff --git a/rows.go b/rows.go old mode 100755 new mode 100644 diff --git a/statement.go b/statement.go old mode 100755 new mode 100644 diff --git a/transaction.go b/transaction.go old mode 100755 new mode 100644 diff --git a/utils.go b/utils.go old mode 100755 new mode 100644 diff --git a/utils_test.go b/utils_test.go old mode 100755 new mode 100644