From b2038325667e4223fb3e7f1d28839485433133dc Mon Sep 17 00:00:00 2001 From: Xiuming Chen Date: Wed, 6 Nov 2013 02:39:41 -0800 Subject: [PATCH 1/7] Merge writePacket and splitPacket into one function --- packets.go | 57 +++++++++++++++++++++--------------------------------- 1 file changed, 22 insertions(+), 35 deletions(-) diff --git a/packets.go b/packets.go index 8ee32cae6..3d186612c 100644 --- a/packets.go +++ b/packets.go @@ -77,46 +77,36 @@ func (mc *mysqlConn) readPacket() ([]byte, error) { // Write packet buffer 'data' // The packet header must be already included func (mc *mysqlConn) writePacket(data []byte) error { - if len(data)-4 <= mc.maxWriteSize { // Can send data at once - // Write packet - n, err := mc.netConn.Write(data) - if err == nil && n == len(data) { - mc.sequence++ - return nil - } - - // Handle error - if err == nil { // n != len(data) - errLog.Print(errMalformPkt.Error()) - } else { - errLog.Print(err.Error()) - } - return driver.ErrBadConn - } - - // Must split packet - return mc.splitPacket(data) -} - -func (mc *mysqlConn) splitPacket(data []byte) error { pktLen := len(data) - 4 if pktLen > mc.maxPacketAllowed { return errPktTooLarge } - for pktLen >= maxPacketSize { - data[0] = 0xff - data[1] = 0xff - data[2] = 0xff + for { + var size int + if pktLen >= maxPacketSize { + data[0] = 0xff + data[1] = 0xff + data[2] = 0xff + size = maxPacketSize + } else { + data[0] = byte(pktLen) + data[1] = byte(pktLen >> 8) + data[2] = byte(pktLen >> 16) + size = pktLen + } data[3] = mc.sequence // Write packet - n, err := mc.netConn.Write(data[:4+maxPacketSize]) - if err == nil && n == 4+maxPacketSize { + n, err := mc.netConn.Write(data[:4+size]) + if err == nil && n == 4+size { mc.sequence++ - data = data[maxPacketSize:] - pktLen -= maxPacketSize + if size != maxPacketSize { + break + } + pktLen -= size + data = data[size:] continue } @@ -129,11 +119,7 @@ func (mc *mysqlConn) splitPacket(data []byte) error { return driver.ErrBadConn } - data[0] = byte(pktLen) - data[1] = byte(pktLen >> 8) - data[2] = byte(pktLen >> 16) - data[3] = mc.sequence - return mc.writePacket(data) + return nil } /****************************************************************************** @@ -748,6 +734,7 @@ func (stmt *mysqlStmt) writeCommandLongData(paramID int, arg []byte) error { pktLen = dataOffset + argLen } + stmt.mc.sequence = 0 // Add the packet header [24bit length + 1 byte sequence] data[0] = byte(pktLen) data[1] = byte(pktLen >> 8) From cc20ec86821ecdbbc169aabc84e92da27e311e46 Mon Sep 17 00:00:00 2001 From: Xiuming Chen Date: Wed, 6 Nov 2013 03:25:31 -0800 Subject: [PATCH 2/7] No longer need to do header calculation for writePacket --- infile.go | 4 ---- packets.go | 50 -------------------------------------------------- 2 files changed, 54 deletions(-) diff --git a/infile.go b/infile.go index 518946d0e..952bd3d6d 100644 --- a/infile.go +++ b/infile.go @@ -114,10 +114,6 @@ func (mc *mysqlConn) handleInFileRequest(name string) (err error) { for err == nil && ioErr == nil { n, err = rdr.Read(data[4:]) if n > 0 { - data[0] = byte(n) - data[1] = byte(n >> 8) - data[2] = byte(n >> 16) - data[3] = mc.sequence ioErr = mc.writePacket(data[:4+n]) } } diff --git a/packets.go b/packets.go index 3d186612c..7e2723e4e 100644 --- a/packets.go +++ b/packets.go @@ -251,12 +251,6 @@ func (mc *mysqlConn) writeAuthPacket(cipher []byte) error { // SSL Connection Request Packet // http://dev.mysql.com/doc/internals/en/connection-phase-packets.html#packet-Protocol::SSLRequest if mc.cfg.tls != nil { - // Packet header [24bit length + 1 byte sequence] - data[0] = byte((4 + 4 + 1 + 23)) - data[1] = byte((4 + 4 + 1 + 23) >> 8) - data[2] = byte((4 + 4 + 1 + 23) >> 16) - data[3] = mc.sequence - // Send TLS / SSL request packet if err := mc.writePacket(data[:(4+4+1+23)+4]); err != nil { return err @@ -271,12 +265,6 @@ func (mc *mysqlConn) writeAuthPacket(cipher []byte) error { mc.buf.rd = tlsConn } - // Add the packet header [24bit length + 1 byte sequence] - data[0] = byte(pktLen) - data[1] = byte(pktLen >> 8) - data[2] = byte(pktLen >> 16) - data[3] = mc.sequence - // Filler [23 bytes] (all 0x00) pos := 13 + 23 @@ -316,12 +304,6 @@ func (mc *mysqlConn) writeOldAuthPacket(cipher []byte) error { return driver.ErrBadConn } - // Add the packet header [24bit length + 1 byte sequence] - data[0] = byte(pktLen) - data[1] = byte(pktLen >> 8) - data[2] = byte(pktLen >> 16) - data[3] = mc.sequence - // Add the scrambled password [null terminated string] copy(data[4:], scrambleBuff) @@ -343,12 +325,6 @@ func (mc *mysqlConn) writeCommandPacket(command byte) error { return driver.ErrBadConn } - // Add the packet header [24bit length + 1 byte sequence] - data[0] = 0x01 // 1 byte long - data[1] = 0x00 - data[2] = 0x00 - data[3] = 0x00 // new command, sequence id is always 0 - // Add command byte data[4] = command @@ -368,12 +344,6 @@ func (mc *mysqlConn) writeCommandPacketStr(command byte, arg string) error { return driver.ErrBadConn } - // Add the packet header [24bit length + 1 byte sequence] - data[0] = byte(pktLen) - data[1] = byte(pktLen >> 8) - data[2] = byte(pktLen >> 16) - data[3] = 0x00 // new command, sequence id is always 0 - // Add command byte data[4] = command @@ -395,12 +365,6 @@ func (mc *mysqlConn) writeCommandPacketUint32(command byte, arg uint32) error { return driver.ErrBadConn } - // Add the packet header [24bit length + 1 byte sequence] - data[0] = 0x05 // 5 bytes long - data[1] = 0x00 - data[2] = 0x00 - data[3] = 0x00 // new command, sequence id is always 0 - // Add command byte data[4] = command @@ -735,12 +699,6 @@ func (stmt *mysqlStmt) writeCommandLongData(paramID int, arg []byte) error { } stmt.mc.sequence = 0 - // Add the packet header [24bit length + 1 byte sequence] - data[0] = byte(pktLen) - data[1] = byte(pktLen >> 8) - data[2] = byte(pktLen >> 16) - data[3] = 0x00 // mc.sequence - // Add command byte [1 byte] data[4] = comStmtSendLongData @@ -971,14 +929,6 @@ func (stmt *mysqlStmt) writeExecutePacket(args []driver.Value) error { pos += len(paramValues) data = data[:pos] - pktLen := pos - 4 - - // packet header [4 bytes] - data[0] = byte(pktLen) - data[1] = byte(pktLen >> 8) - data[2] = byte(pktLen >> 16) - data[3] = mc.sequence - // Convert nullMask to bytes for i, max := 0, (stmt.paramCount+7)>>3; i < max; i++ { data[i+14] = byte(nullMask >> uint(i<<3)) From 276fa30fd9625e2c12f59beb862a0954cb6a2ecc Mon Sep 17 00:00:00 2001 From: Xiuming Chen Date: Wed, 6 Nov 2013 04:36:54 -0800 Subject: [PATCH 3/7] Add cxmcc to AUTHORS --- AUTHORS | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS b/AUTHORS index 52a0d12e2..7191cfac6 100644 --- a/AUTHORS +++ b/AUTHORS @@ -23,6 +23,7 @@ Luke Scott Michael Woolnough Nicola Peduzzi Xiaobing Jiang +Xiuming Chen # Organizations From 382f349ebbac012ae387ce3edcc4388d977ff53e Mon Sep 17 00:00:00 2001 From: Xiuming Chen Date: Thu, 7 Nov 2013 00:22:16 -0800 Subject: [PATCH 4/7] Remove one more place that does header calculations --- packets.go | 23 +++++------------------ 1 file changed, 5 insertions(+), 18 deletions(-) diff --git a/packets.go b/packets.go index 7e2723e4e..8d717cc82 100644 --- a/packets.go +++ b/packets.go @@ -748,26 +748,13 @@ func (stmt *mysqlStmt) writeExecutePacket(args []driver.Value) error { if len(args) == 0 { const pktLen = 1 + 4 + 1 + 4 data = mc.buf.takeBuffer(4 + pktLen) - if data == nil { - // can not take the buffer. Something must be wrong with the connection - errLog.Print("Busy buffer") - return driver.ErrBadConn - } - - // packet header [4 bytes] - data[0] = byte(pktLen) - data[1] = byte(pktLen >> 8) - data[2] = byte(pktLen >> 16) - data[3] = 0x00 // new command, sequence id is always 0 } else { data = mc.buf.takeCompleteBuffer() - if data == nil { - // can not take the buffer. Something must be wrong with the connection - errLog.Print("Busy buffer") - return driver.ErrBadConn - } - - // header (bytes 0-3) is added after we know the packet size + } + if data == nil { + // can not take the buffer. Something must be wrong with the connection + errLog.Print("Busy buffer") + return driver.ErrBadConn } // command [1 byte] From f975c34fffd45812f4e673ead78b5d836cde8824 Mon Sep 17 00:00:00 2001 From: Xiuming Chen Date: Thu, 7 Nov 2013 02:47:47 -0800 Subject: [PATCH 5/7] Remove an outdated comment about writePacket --- packets.go | 1 - 1 file changed, 1 deletion(-) diff --git a/packets.go b/packets.go index 8d717cc82..b4bc40fbe 100644 --- a/packets.go +++ b/packets.go @@ -75,7 +75,6 @@ func (mc *mysqlConn) readPacket() ([]byte, error) { } // Write packet buffer 'data' -// The packet header must be already included func (mc *mysqlConn) writePacket(data []byte) error { pktLen := len(data) - 4 From d78ba17ce783a4bb41778cfef37496eb8b7ad7a4 Mon Sep 17 00:00:00 2001 From: Xiuming Chen Date: Thu, 7 Nov 2013 02:52:26 -0800 Subject: [PATCH 6/7] Minor code simplification for writePacket --- packets.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packets.go b/packets.go index b4bc40fbe..53a40a665 100644 --- a/packets.go +++ b/packets.go @@ -102,7 +102,7 @@ func (mc *mysqlConn) writePacket(data []byte) error { if err == nil && n == 4+size { mc.sequence++ if size != maxPacketSize { - break + return nil } pktLen -= size data = data[size:] @@ -117,8 +117,6 @@ func (mc *mysqlConn) writePacket(data []byte) error { } return driver.ErrBadConn } - - return nil } /****************************************************************************** From c29c515073b3b09020189f75751e1edef03c98c9 Mon Sep 17 00:00:00 2001 From: Xiuming Chen Date: Thu, 7 Nov 2013 02:57:45 -0800 Subject: [PATCH 7/7] Clean up const variable that is no longer necessary --- packets.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packets.go b/packets.go index 53a40a665..c6a38d36d 100644 --- a/packets.go +++ b/packets.go @@ -743,8 +743,7 @@ func (stmt *mysqlStmt) writeExecutePacket(args []driver.Value) error { var data []byte if len(args) == 0 { - const pktLen = 1 + 4 + 1 + 4 - data = mc.buf.takeBuffer(4 + pktLen) + data = mc.buf.takeBuffer(4 + 1 + 4 + 1 + 4) } else { data = mc.buf.takeCompleteBuffer() }